2014-02-09 131 views
0

我有一個問題,我只是不知道如何解決它。Java變量保存

我想創建一個類,其中2D int數組保存兩次。有一次,我保持這樣的狀態,還有一次我可以修改。

總之我的課是這樣的:

private static class Class { 
    private final int[][] firstForm; 
    private int[][] modify; 

    public Class(int[][] firstForm){ 
     this.firstForm = firstForm; 
     this.modify = firstForm; 
//I also already tried .clone() on both 
    } 

    public void setValue(int x, int y, int val){ 
     if(firstForm[x][y]!=0){ 
      System.out.println("ERROR!); 
      return; 
     } 
     modify[x][y]=val; 
    } 
} 

現在,當我使用功能的setValue修改變化的不僅是價值,而且firstForm之一。 我已經嘗試過this.modify = firstForm.clone();,但結果是一樣的。有人可以幫助我,告訴我我做錯了什麼嗎?

+0

firstForm和modify是對同一個二維數組的引用,當其中一個發生變化時也是如此。如果您使用克隆進行嘗試並且無法正常工作,則您沒有正確嘗試。順便說一句,firstForm只意味着你不能通過像setValue這樣的方法改變firstForm的值作爲引用而不是它的內容。 – DSquare

+0

我不知道如何更正確地做到這一點:P 我剛剛將{this.modify = firstForm;}這一行更改爲{this.modify = firstForm.clone();}和{this.firstForm = firstForm; } to {this.firstForm = firstForm.clone();}並且結果保持不變 – Nexxurs

回答

3

問題是您對final關鍵字的誤解。

在這種情況下,final所做的是變量將保存一個無法更改的引用。然而,參考對象可以被改變。

現在,在你的代碼中做到:

this.firstForm = firstForm; 
this.modify = firstForm; 

所以這兩個變量指向同一個參考,這意味着到陣列製造將同時firstFormmodify表現出任何的變化。

你將不得不做一個數組的副本。有兩種副本 - 淺和深。淺將複製數組的對象到另一個數組(具有不同的引用) - 這就足夠了一個int數組。如果該數組是另一種對象類型,則必須進行深層複製才能確保不變。

進行復印使用兩個嵌套的for循環:

int[][] newarray = new int[firstForm.length][firstForm[0].length]; 

for(int i = 0; i < firstForm.length; i++){ 
    for(int j = 0; j < firstForm[i].length; j++){ 
    newarray[i][j] = firstForm[i][j]; 
    } 
} 

注意clone()方法不淺拷貝 - 這意味着它複製的陣列到另一個陣列的內容,但是二維數組只包含引用到一維數組!這是不行的。

+0

我已經做了類似的事情(查看我的問題的最後部分)。 我認爲這應該是正確的,但問題仍然存在。 – Nexxurs

+0

@Nexxurs耶對不起,問題正是我所描述的。clone()方法將只複製數組的引用 - 但數組包含對一維數組的引用! –

+0

@Nexxurs看到編輯,應該工作正常。 –

0

您只是將參考值複製到firstFormmodify。你想要爲final做什麼是複製初始數組(firstForm)的內容,而不是對它的引用。

+0

我知道,但我想我已經阻止了.clone()函數的這個問題。我能做些什麼呢? – Nexxurs

0

您的問題正在發生,因爲您的二維數組都引用同一個對象。

在Java中,對象是通過引用傳遞的 - 對象的引用是該對象在內存中的位置。所以,當你說,

this.firstform = firstform; 
    this.modify = firstform; 

你實際上是在說:「this.firstform應該指向的位置firstform的內存,所以應this.modify」,所以他們實際上是相同的事情。該.clone()方法應該工作:/這可能是你沒有正確使用它......但是,你可以做手工,如果你想(INT構造函數):

for(int i = 0; i < firstform.length; ++i) 
    { 
     for(int j = 0; j < firstform[i].length; ++j) 
     { 
      modify[i][j] = firstform[i][j]; 
     } 
    } 

雖然這是相當醜陋。

很明顯,在你完成上述操作之前,你將不得不初始化修改爲與firstform相同的尺寸。

+0

好吧,我認爲我的月食有一個巨大的問題。我已經嘗試了你的for循環,我知道我的數組的長度(9,我已經檢查了它與我的控制檯) 但是當我開始我的循環,我得到一個錯誤,因爲我超出了界限。該程序試圖使用i = 9(這顯然是不可能的),儘管我已經寫了i <9並且沒有i <= 9! – Nexxurs

+0

在第二個循環中它應該是++ j! –

+0

是的,對不起,:)我正在趕,做了一個愚蠢的:P固定 – mattsegers