2017-09-14 103 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

哦,是的......我只是不明白什么是“静态”的意思。 –