使用 final 關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的内容還是可以改變的。
例如,對于如下語句:
final StringBuffer a=new StringBuffer("immutable");
執行如下語句将報告編譯期錯誤:
a=new StringBuffer("");
但是,執行如下語句則可以通過編譯:
a.append("broken!");
有人在定義方法的參數時,可能想采用如下形式來阻止方法内部修改傳進來的參數對象:
publicvoidmethod(final StringBuffer param)
{
}
實際上,這是辦不到的,在該方法内部仍然可以增加如下代碼來修改參數對象:
param.append("a");這是因為變量param的引用并沒有變化,是以是不會出錯的。
但是下面的就會出錯了,因為int類型的資料是直接放在了棧記憶體當中的,它不需要想對象一樣需要有一個引用,如果
修改了x就是修改了引用,是以如果修改了x那麼就會出錯。
public int addOne(final int x) {
return x++;
}
又比如如下的例子:
publicclass Something{
public static void main(String[] args) {
Other o = newOther();
new Something().addOne(o);
}
public void addOne(final Other o) {
o.i++;
}
}
class Other {
public int i;
}
這個在編譯的時候也是不會出錯的,因為這個時候修改的不是對象的引用而是對象的屬性,因為隻有對象是final類型的,是以隻要不去修改對象就不會出現錯誤的。
版權聲明:本文為部落客原創文章,未經部落客允許不得轉載