2013-03-21 145 views
4

一般來說,如果一個變量被聲明爲final,那麼我們不能覆蓋該變量的值,但是當我們使用字符串緩衝區時,這並不適用。有人能告訴我爲什麼嗎?需要澄清最終的StringBuffer對象

下面的代碼工作!!!!!!

public static void main(String args[]) { 
     final StringBuffer a=new StringBuffer("Hello"); 
     a.append("Welcome"); 
     System.out.println(a); 
    } 

輸出:

HelloWelcome

回答

8

Java Language Specification(重點煤礦):

一旦最終的變數已被分配,它總是包含相同的值。 如果一個最終變量持有一個對象的引用,那麼該對象的狀態可能會通過對該對象的操作而改變,但該變量將始終引用同一個對象。

所以它是確定操作對象的狀態由a

a.append("Welcome"); //is OK 

指出,但只是不能重新分配a與另一個對象

final StringBuffer a = new StringBuffer("Hello"); 
a = new StringBuffer("World"); //this wont compile 
4

你能不能用最後一個變量做的是改變它引用另一個對象(或原始值)或空。

在那裏,您總是引用相同的對象,而與字符串相反的stringbuffer不是不可變的。

你必須得到的是變量的值是對stringbuffer的引用,而不是該對象的實際內容。

0

你應該做一些閱讀Mutable and Immutable objects。字符串,整數,可變類的長 例:

一成不變的類的實例的StringBuffer,日期

在可變對象可以將其建設,如後改變狀態

final StringBuffer a=new StringBuffer("Hello"); 
a.append("Welcome"); 

在不可變的情況下,您無法在其構建後更改對象的狀態。

0

如果一個變量被聲明爲final,我們不能忽略的變量

正確的值。一旦分配了最終變量,就不能重新分配。編譯器不會允許它。

但是,當我們使用字符串緩衝區時,這並不適用。

是的。

下面的代碼工作!!!!!!

該代碼不會顯示您描述的問題。它顯示了一個參考爲final的對象仍然可以被突變。這是完全不同的事情。