final應用說明

1、final用在類上表示該類不能被繼承
2、final用在方法上表示該方法不能被重寫(override)
3、final用在變量上表示該變量一旦被賦值後它的值將不能被改變

對於final類型的成員變量的初始化方式
1、聲明變量時直接賦值
2、在構造方法中完成賦值
3、對於static的final類型的成員變量,只能通過在變量聲明時直接賦值,不能通過在構造方法中完成賦值,因爲static的變量是優先於構造方法執行的,而static的final類型的成員變量在聲明時有點特殊:不會被設置成默認的值(如int a;本應該在聲明時會自動設置成默認的值"0")
4、對於final類型的引用變量來說,所謂的不能改變指的是該引用不能被改變,而不是該引用的內容不能被改變
在構造方法中完成賦值的注意點:
如果一個類有多個構造方法,那麼必須在每個構造方法中對final類型的成員變量賦值,否則將通不過編譯
java 代碼
package com.test;  
 
public class FinalTest {  
      
    private final int a;  
    private String name;  
      
    public FinalTest()  
    {  
        //如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯  
        a = 3;  
    }  
      
    public FinalTest(String name)  
    {  
        //如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯  
        a = 5;  
        this.name = name;  
    }  
      
    public static void main(String[] args){  
        FinalTest ft = new FinalTest();  
        FinalTest ft2 = new FinalTest("hello");  
    }  
}  

java 代碼
package com.test;  
 
public class FinalTest {  
      
    private static final int a = 3;  
    //private final int a;  
    private String name;  
      
    public FinalTest()  
    {  
        //如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯  
        //a = 3;  
    }  
      
    public FinalTest(String name)  
    {  
        //如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯  
        //a = 5;  
        this.name = name;  
    }  
      
    public static void main(String[] args){  
        FinalTest ft = new FinalTest();  
        FinalTest ft2 = new FinalTest("hello");  
    }  
}  

java 代碼
package com.test;  
 
public class FinalTest {  
      
    private static final StringBuffer s = new StringBuffer();  
    //private static final int a = 3;  
    //private final int a;  
    private String name;  
      
    public FinalTest()  
    {  
        //如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯  
        //a = 3;  
    }  
      
    public FinalTest(String name)  
    {  
        //如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯  
        //a = 5;  
        this.name = name;  
    }  
      
    public static void main(String[] args){  
        //此時可以通過編譯,因爲改變的只是引用內容,而不是引用的內存地址,但是如果這裏的代碼是 s = new StringBuffer();就通不過編譯了,因爲如果這樣的話,s指向了新的引用地址,這是final所不允許的  
        s.append("hello");  
//      FinalTest ft = new FinalTest();  
//      FinalTest ft2 = new FinalTest("hello");  
    }  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章