1. 程式人生 > >關於Java中public static final int 的用法

關於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的,我們必須在宣告變數時直接賦值。