2013-10-01 53 views
1

我嘗試了下面的代碼,其具有稱爲data。這一個final實例變量在使用int[] argument.If整型的元素[]的構造被實例化數組的更改會反映在實例變量中,並顯示在show()'s輸出中。但是,如果將外部數組設置爲null或新的數組,則更改不會反映在show()輸出中。陣列天線的最終實例變量和重置基準

爲什麼會發生這種情況?如果外部數組由ext [0] = x更改,則更改將顯示在inst.variable中。如果將ext引用設置爲新對象,則不會發生此變化。

public class MutabilityTest { 
    public static void main(String[] args) { 
    int[] ext = new int[] {1,2,3,4,5}; 
     FMutable xmut = new FMutable(ext); 
     mut.show(); //shows [1,2,3,4,5] 
     System.out.println("changed ext array"); 
     ext[0] = 99; 
     System.out.println("ext:"+Arrays.toString(ext)); //[99,2,3,4,5] 
     mut.show(); //shows [99,2,3,4,5] 
     System.out.println("set ext array to new"); 
     ext = new int[]{8,8,8,8} 
     System.out.println("ext:"+Arrays.toString(ext)); //[8,8,8,8] 
     mut.show();//expected [8,8,8,8] but got [99,2,3,4,5] 
     ext = null; 
     System.out.println("ext:"+Arrays.toString(ext)); //null 
     mut.show(); //shows same [99,2,3,4,5] 
    } 
} 
class FMutable{ 
    private final int[] data; 
    public FMutable(int[] indata){ 
    this.data = indata; 
    } 
    public void show(){ 
    System.out.println("XMutable:"+Arrays.toString(this.data)); 
    } 
} 
+0

in java .. 對象被refrence和數據類型使用值傳遞... –

回答

3

這與data是最終的或其他地方的領域無關。您可以更簡單地看到確切的效果相同:

int[] x = { 1, 2, 3, 4, 5 }; 
int[] y = x; 

y[0] = 10; 
System.out.println(Arrays.toString(x)); // 10, 2, 3, 4, 5 
y = new int[] { 3, 3, 3, }; 
System.out.println(Arrays.toString(x)); // 10, 2, 3, 4, 5 

變量,他們的價值觀,和對象之間進行區分是很重要的。想象一個變量就像一張紙。它可以寫上一個原始值,或者一個房子地址。

行:

int[] y = x; 

或在您的示例代碼:

this.data = indata; 

正是對一張紙上寫上一段新的紙印本。這只是「房子」(在這種情況下是數組對象)的地址。

現在這兩張紙本身就是獨立的 - 改變其中一張紙上寫下的內容並不會改變另一張上寫的內容。但是,如果您通過在一張紙上的地址後去房子,請進行更改(例如,繪製前門),然後按照其他紙上的地址去房子(當他們「還是一樣),那麼是的,你會看到新鮮的門。這就是您在對陣列進行更改時所看到的內容。

+0

我以前見過這種解釋。是的,我記得在同一個例子中,我也在之前的回答中看到了它。不錯:) :) –

+2

@RohitJain:是的,我保留一段時間寫在文章或博客文章中的意思,所以我可以參考它:) –

1

ext只是指向相同的存儲單元data實例陣列的另一參考。如果將ext設置爲空,則只會將ext引用設置爲null而不是data陣列。

1
final int[] data 

這意味着你的陣列obejct是最後的(你可以初始化一次,以後不能改變),但index's都沒有。

你已經通過構造函數初始化了。

public FMutable(int[] indata){ 
    this.data = indata; 
} 

ext是poitning對相同對象的另一參考。對同一物體的任何更改也會影響final data字段,因爲它們都指相同的Object

但是,作爲參考數據是最終的,你不能重新活化。而ext = new int[]{8,8,8,8}將創建一個新的數組,並且ext將指向該數組。

1

ext = new int[]{8,8,8,8}爲變量ext創建一個新陣列,但不會影響對象中的字段data。請注意,如果data不是最終的,也會出現相同的效果!

final僅意味着您可以設置參考一次,但仍然可以操作該對象。