天天看點

static、final、static final 用法

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