static、final、static final 用法
1.使用范围:类、方法、变量。
2.区别和联系:
2.1.static 含义:静态的,被 static 修饰的方法和属性只属于类不属于类的任何对象。
2.2.static 用法:
2.2.1.static 可以修饰【内部类】、方法和成员变量。
2.2.2.static【不可以修饰外部类】、【不可以修饰局部变量】(因为 static 本身就是定义为类级别的,所以局部级别的变量是不可以用 static 修饰的)。
2.3 final 含义:【只能赋值一次】的。
2.2.final 用法:
2.2.1.final 修饰属性,表示属性【只能赋值一次】,(1)基本类型:值不能被修改;(2)引用类型:引用不可以被修改该。
2.2.2.final 修饰方法,表示方法不可以重写,但是可以被子类访问(如果方法不是 private 类型话)。
2.2.2.final 修饰类,表示类不可以被继承。
3.联合使用 static final
3.1.适用范围:
3.1.2.两者范围的交集,所以只能修饰:成员变量、方法、内部类。
3.2.含义:也是二者交集:
3.2.1.方法:属于类的方法且不可以被重写。
3.2.2.成员变量:属于类的变量且只能赋值一次。
3.2.3.内部类:属于外部类,且不能被继承
java中static final与final的不同
再如以下例子:
class selfcounter{
private static int counter;
private int id = counter ++;
public string tostring(){
return "selfcounter :" + id;
}
class withfinalfields{
static final selfcounter wffs = new selfcounter();
final selfcounter wff = new selfcounter();
return "wff = " + wff + "\n wffs = " + wffs;
public class e18_staticfinal {
public static void main(string[] args) {
system.out.println("first object :");
system.out.println(new withfinalfields());
system.out.println("second object: ");
,运行结果是
first object :
wff = selfcounter :1
wffs = selfcounter :0
second object:
wff = selfcounter :2
static的常量在类加载的时候被初始化,而实例常量在实例化的时候被初始化。
其实上面的过程很简单。
第一次实例化withfinalfields的时候,虚拟机发现该类没有被加载,于是先加载类,加载类的同时需要初始化类的所有static无论是变量、常量还是块,于是wffs需要实例化一个selfcounter对象,这个时候虚拟机发现selfcounter类也没有被加载,于是加载selfcounter类,同时初始化static变量counter为0,加载selfcounter类完毕,开始实例化selfcounter对象,初始化id为0(此时counter为0),同时counter变为1,这时selfcounter对象的实例化完毕,并被赋值给withfinalfields类的wffs常量,加载withfinalfields类的过程完毕,开始正式实例化withfinalfields对象,初始化wff常量,又需要实例化一个selfcounter对象,这时虚拟机发现selfcounter类已经被加载,于直接开始实例化selfcounter对象,初始化id为1(此时counter为1),同时counter变为2,实例化withfinalfields对象完毕,此时wffs的id为0,wff的id为1。
第二次实例化withfinalfields的时候,虚拟机发现该类已经被加载,直接实例化,不会初始化static无论是变量、常量还是块,于是直接初始化wff常量,需要实例化selfcounter对象,该类也已经被加载,于是也直接实例化,初始化id为2(此时counter为2),同时counter变为3,实例化selfcounter对象完毕,同时实例化withfinalfields对象完毕,此时wffs的id仍然为0,wff的id为2。
重点是静态的东西只会被初始化一次,发生在类加载的时候。
final是不可变,但问题是有两个withfinalfields对象,每个withfinalfields对象都有它自己的wff常量,而且对于引用类型的常量,所谓不可变仅仅是引用不能重新指向其他对象,而不是对象内部的各种属性的值不可变。