Static和 Final 关键字
Static和 Final 关键字
变量
Java中主要有三种,成员变量(实例变量,属性),本地变量(局部变量)类变量(静态属性)成员变量就是类或者对象中的属性,局部变量就是方法的形式参数以及在方法中定义的变量。类变量就是被static修饰的属性。
final
final 可以声明成员变量,方法,类,以及本地变量,一旦将引用声明为final,就不能改变这个引用了,编译器会检查代码,如果试图将变量再次初始化的话,编译器会报编译错误。
final 变量
凡是对成员变量或者本地变量声明为final的都叫做final变量,final变量经常和static关键字一起使用,作为常量。
final 方法
final 声明的方法不能被子类的方法重写,如果你认为一个方法的功能已经足够完善了,子类中不需要改变的话,可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了。不需要运行时动态绑定。
final 类
使用final 来修饰的类叫做final类,final 类不能被继承。Java中有许多类都是final的,比如String,Integer以及其他包装类等。
接口声明中所有变量本身是final的。
static
Java中不存在全局变量的概念,但是可以通过static实现一个伪全局的概念,Java中static表示全局或者静态的意思,用来修饰成员变量或者成员方法。也可以修饰代码块。
在JVM加载一个类的时候,若该类存在static修饰的成员变量和成员方法,则会为这些成员变量或者成员方法在固定的位置开辟一个固定大小的内存区域,这样JVM就可以方便的进行访问static蕴含的静态表示是不可恢复的,修改了是不会变为原样的。
同时,static修饰的成员变量和成员方法被该类的所有实例共享。所有实例的引用都指向同一个地方。任何一个实例对其的修改都会导致其他实例的变化。
static final
static 修饰强调只有一个,final修饰的属性表明是一个常数,static final 修饰就表示一旦给值,就不可修改,并且可以通过类名访问。
final可以修饰:属性,方法,类,局部变量(方法中的变量)
final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。
final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。
final修饰的属性表明是一个常数(创建后不能被修改)。
final修饰的方法表示该方法在子类中不能被重写,final修饰的类表示该类不能被继承。
对于基本类型数据,final会将值变为一个常数(创建后不能被修改);但是对于对象句柄(亦可称作引用或者指针),final会将句柄变为一个常数(进行声明时,必须将句柄初始化到一个具体的对象。而且不能再将句柄指向另一个对象。但是,对象的本身是可以修改的。这一限制也适用于数组,数组也属于对象,数组本身也是可以修改的。方法参数中的final句柄,意味着在该方法内部,我们不能改变参数句柄指向的实际东西,也就是说在方法内部不能给形参句柄再另外赋值)。
static可以修饰:属性,方法,代码段,内部类(静态内部类或嵌套内部类)
static修饰的属性的初始化在编译期(类加载的时候),初始化后能改变。
static修饰的属性所有对象都只有一个值。
static修饰的属性强调它们只有一个。
static修饰的属性、方法、代码段跟该类的具体对象无关,不创建对象也能调用static修饰的属性、方法等
static和“this、super”势不两立,static跟具体对象无关,而this、super正好跟具体对象有关。
static不可以修饰局部变量。
static final和final static没什么区别,一般static写在前面。
static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。
static final也可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用。
Author: corn1ng
Link: https://corn1ng.github.io/2017/10/02/Static和-Final-关键字/
License: 知识共享署名-非商业性使用 4.0 国际许可协议