天天看點

使用final關鍵字修飾一個變量,是引用不能變,還是引用對象的位址不能變?

使用 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類型的,是以隻要不去修改對象就不會出現錯誤的。

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載