2017-09-14 63 views
-1

我試圖用「KUROONN」方法克隆Test2的對象。我期望輸出的第二行讀取[0,0],但實際結果顯示[33,4]。我不知道爲什麼會發生這種情況,任何人都可以解釋這一點嗎?JAVA沒有克隆好

import java.util.ArrayList; 

class Test { 
    public static ArrayList<Integer> T=new ArrayList<Integer>(); 
} 

class Test2 { 
    int Test2Int; 
    ArrayList<Integer> Test2List; 
    public Test2(int K,ArrayList<Integer> A) { 
     this.Test2Int=K; 
     this.Test2List=A; 
    } 
    public Test2 KUROONN() { //broken clone 
     Test2 b=new Test2(0,Test.T); 
     b.Test2Int=this.Test2Int; 
     System.out.println(b.Test2List); 
     for(int i=0;i<this.Test2List.size();i++) { 
      b.Test2List.add(this.Test2List.get(i)); 
     } 
     return b; 
    } 

} 

public class testtube001a { 
    public static void main (String args[]){ 
     ArrayList<Integer> n =new ArrayList<Integer>(); 
     n.add(33); 
     n.add(4); 
     ArrayList<Integer> m =new ArrayList<Integer>(); 
     m.add(114); 
     m.add(514); 
     Test2 t2_1=new Test2(72,n); 
     Test2 t2_2=new Test2(1919,m); 
     t2_1.KUROONN(); 
     t2_2.KUROONN(); 
    } 
} 

的程序的輸出是:

[] 
[33, 4] 
+0

你爲什麼期望輸出[0,0]?就我所見,你從未設置過。另外請不要使用Test,Test2作爲類名,然後命名變量Test2Int。儘管代碼相對簡單,但它很難理解。並且是類Test中的ArrayList是否爲特定原因的靜態?因爲如果不是,我會先刪除那件事。 –

+0

對不起,我的錯誤。我的意思是我期望[]。而這段代碼應該只是一個我正在做的更大代碼的調試測試,所以我只是使用測試名稱。很抱歉。 –

回答

0

您已聲明的T字段爲:

public static ArrayList<Integer> T=new ArrayList<Integer>(); 

static指變量被所有實例之間共享。所以當代碼

Test2 b=new Test2(0,Test.T); 

被執行時,它會創建一個引用該共享變量的Test2實例。第一次它將是空的,並且您的打印將導致[]。第二次它將參考相同的列表其中第一次調用添加值33和4,因此它將打印[33, 4]。之後,值114和514也將被添加到相同的列表中。

+0

哦,是的......我只是不明白什麼是「靜態」的意思。 –