1. 程式人生 > >Final欄位如何改變它們的值

Final欄位如何改變它們的值

我們可以通過分析String類的實現具體細節來展示一個final變數是如何可以改變的。

String物件包含了三個欄位:一個character陣列,一個數組的offset和一個length。實現String類的基本原理為:它不僅僅擁有character陣列,而且為了避免多餘的物件分配和拷貝,多個String和StringBuffer物件都會共享相同的character陣列。因此,String.substring()方法能夠通過改變length和offset,而共享原始的character陣列來建立一個新的String。對一個String來說,這些欄位都是final型的欄位。

String s1 = "/usr/tmp";
String s2 = s1.substring(4); 

字串s2的offset的值為4,length的值為4。但是,在舊的記憶體模型下,對其他執行緒來說,看到offset擁有預設的值0是可能的,而且,稍後一點時間會看到正確的值4,好像字串的值從“/usr”變成了“/tmp”一樣。

舊的Java記憶體模型允許這些行為,部分JVM已經展現出這樣的行為了。在新的Java記憶體模型裡面,這些是非法的。