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的不同
如果只是使用final  那你如果想使用这个属性 需要实例化对象 才能使用
如果加上static 那他就属于类属性  不用实例化 直接使用


 

再如以下例子:

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();



public String toString(){

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: ");

System.out.println(new WithFinalFields());

}

}

,运行结果是

First Object :

wff = SelfCounter :1

wffs = SelfCounter :0

Second Object:

wff = SelfCounter :2

wffs = SelfCounter :0

 

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。

重点是静态的东西只会被初始化一次,发生在类加载的时候。

static的常量在类加载的时候被初始化,而实例常量在实例化的时候被初始化。

final是不可变,但问题是有两个WithFinalFields对象,每个WithFinalFields对象都有它自己的wff常量,而且对于引用类型的常量,所谓不可变仅仅是引用不能重新指向其他对象,而不是对象内部的各种属性的值不可变。