static和final 今天的文章要说的就是访问控制中的这两个关键字
昨天的一篇文章介绍了访问控制中的访问修饰符以及它们的访问权限。下面这篇文章我们介绍访问控制中的第二部分static和final关键字。
static关键字
static修饰成员变量
用static修饰的成员变量不属于对象的数据结构,static变量是属于类的变量,通常可以通过类名来引用static成员。Static成员变量和类的信息一起存储在方法区而不是在堆中,一个类的static成员变量只有“一份”,无论该类创建了多少对象。
Static修饰方法
通常说的方法都会涉及到对具体对象的操作,这些方法在调用时,需要隐式的传递对象的引用(this)。
int d=p1.distance(p2);
调用distance方法时,除了传递p2参数外,还隐式的传递了p1作为参数,在方法中的this关键字即表示该参数
static修饰的方法则不需要针对某些对象进行操作,其运行结果仅仅与输入的参数有关,调用时直接用类名引用。
double c=Math.sqrt(3.0*3.0+4.0*4.0);
该方法在调用时,没有隐式的传递对象引用,因此在static方法中不可以使用this关键字。
由于static在调用时没有具体的对象,因此在static方法中不能对非static成员(对象成员)进行访问。Static方法的作用在于提供一些“工具方法”和“工厂方法”等。
... ... ...
Point.distance(Point p1,Point p2)
RandomUtils.nextInt()
StringUntils.leftPad(String str,int size,char padChar)
... ... ...
Math.sqrt() Math.sin() Arrays.sort()
static块
static块属于类的代码块,在类加载期间执行的代码块,只执行一次,可以用来在软件中加载静态资源。
final关键字
final修饰变量
final关键字修饰成员变量,意为不可改变。final修饰成员变量有以下两种方式初始化:声明的同时初始化;构造函数中初始化。final关键字也可以修饰局部变量,使用之前初始化即可。
public class Emp{
private final int no=100;//final变量声明时初始化
public void testFinal(){
no=99;
}//编译错误,final的变量不可以改变
}
final修饰方法和类
final关键字修饰的方法不可以被重写,使一个方法不能被重写的意义在于:防止子类在定义新方法时造成“不经意”重写
final关键字修饰的类不可以被继承。
final class Foo{ } class Goo extends Foo{ } //编译错误
JDK中有一些基础类库被定义为final的,例如:String、Math、Integer、Double等等。是一个类不能被继承的意义在于:可以保护类不被继承修改,可以控制滥用继承对系统造成的危害。
static final常量
static final修饰的成员变量称为常量,必须声明的同时初始化,不可被改变。
static final常量会在编译器被替换。如图
这样我们通过两篇文章把访问控制的知识点全部说完了。说白了访问控制就是一个封装的概念。在这里面我们介绍了7个英文单词的使用,分别为package、public、private、default、protected以及今天介绍到的static和final。大家可以结合最近的这两篇文章把访问控制的相关知识点梳理一下。
知识无限,能力有限。小编在文章编辑过程中难免出现不尽人意的地方,欢迎大家批评指正,小编也将不断积累完善自己,让我们共同进步。