final關鍵字到底修飾了什麼?


final使得被修飾的變量"不變",但是由於對象型變量的本質是“引用”,使得“不變”也有了兩種含義:引用本身的不變,和引用指向的對象不變。

引用本身的不變:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//編譯期錯誤

引用指向的對象不變:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //編譯通過

可見,final只對引用的“值”(也即它所指向的那個對象的內存地址)有效,它迫使引用只能指向初始指向的那個對象,改變它的指向會導致編譯期錯誤。至於它所指向的對象的變化,final是不負責的。這很類似==操作符:==操作符只負責引用的“值”相等,至於這個地址所指向的對象內容是否相等,==操作符是不管的。

理解final問題有很重要的含義。許多程序漏洞都基於此----final只能保證引用永遠指向固定對象,不能保證那個對象的狀態不變。在多線程的操作中,一個對象會被多個線程共享或修改,一個線程對對象無意識的修改可能會導致另一個使用此對象的線程崩潰。一個錯誤的解決方法就是在此對象新建的時候把它聲明爲final,意圖使得它“永遠不變”。其實那是徒勞的。
final還可以用來聲明方法,表明繼承者不可以覆蓋它,如:
final String Hello () { return "Hello World!";}
final也可以用來聲明類,被聲明 的類成爲最終類,不可以用以繼承,如:
final class Student{
    private String name;
    public void setName(String name){
            this.name=name;
}
   public String getName(){
            return this.name;
}
}
這個Student類不可以繼承;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章