關於Java中public static final int 的用法
public class FinalOriginalTest {
private final int a;
private String name;
public FinalOriginalTest(){
a = 3;
}
public FinalOriginalTest(String name){
this.name = name;
}
public static void main(String[] args){
FinalOriginalTest ft = new FinalOriginalTest();
FinalOriginalTest ft1 = new FinalOriginalTest("hello");
}
}
問題1:上面的程式能否編譯通過?如果不能,請說明理由。
解答:不能編譯通過,可能沒有初始化變數a。因為對於final型別的成員變數的初始化,在構造方法中完成賦值,如果一個類有多個構造方法,就要保證在每個構造方法中都要完成對該final型別變數的初始化工作。所以需要在public FinalOriginalTest(String name)構造方法中給a賦值。
注意:final可以用在類、方法、變數上。
1、final用在類上,表明當前類它不能被繼承,沒有子類。
2、final用在方法上,表明當前方法不能被override,不能被重寫。
3、final用在變數上,表明當前變數是一個終態的變數,是一個常量,這個變數的值一但被賦值後就不能被改變了。
對於final型別的成員變數的初始化方式:
1、宣告變數時直接賦值
2、在構造方法中完成賦值,如果一個類有多個構造方法,就要保證在每個構造方法中都要完成對該final型別變數的初始化工作。
問題2:上面的程式中,修正問題1之後,將private final int a;改為private static final int a;能否編譯通過?如果不能,請說明理由。
解答:不能編譯通過,因為a是靜態變數,在這個類還沒有例項化的時候,它的值就已經有了。所以對於一個int型別的static final型別的變數a來說,我們只能在宣告的時候就給它賦值private static final int a = 3;然後把構造方法裡面的賦值給註釋掉,這樣編譯就能通過了。還可以在static{}這樣的靜態塊中初始化它。
總結:對於final型別的變數,對於不加static我們可以有兩種方式給它賦值:宣告變數時直接賦值;在構造方法中完成賦值,如果一個類有多個構造方法,就要保證在每個構造方法中都要完成對該final型別變數的初始化工作。對於一個變數既是final又是static的,我們必須在宣告變數時直接賦值。