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常量,而且對于引用類型的常量,所謂不可變僅僅是引用不能重新指向其他對象,而不是對象内部的各種屬性的值不可變。