2017-09-14 17 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(); 
    } 
} 

이 프로그램의 출력은 다음과 같습니다

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

단어 static 변수는 모든 인스턴스간에 공유되는 의미 :

[] 
[33, 4] 
+0

출력 [0,0]을 (를) 왜 기대 하시겠습니까? 당신은 내가 보는 한 그것을 결코 정하지 않았습니다. 게다가 Test, Test2를 클래스 이름으로 사용하지 말고 Test2Int 변수의 이름을 지정하십시오. 코드가 상대적으로 단순하더라도 이해하기가 어렵습니다. 그리고 특정 이유로 Test 클래스의 ArrayList가 정적입니까? 왜냐하면 내가 그 일을 먼저 제거 할 것이기 때문입니다. –

+0

실수로 죄송합니다. 나는 내가 [[]를 기대한다는 것을 의미했다. 그리고이 코드는 내가 만든 더 큰 코드에 대한 디버깅 테스트 일 뿐이므로 방금 이름 테스트를 사용했습니다. 매우 죄송합니다. –

답변

0

당신은 같은 T 필드를 선언했다. 따라서 코드

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

이 실행되면 해당 공유 변수를 참조하는 Test2 인스턴스가 생성됩니다. 처음 비워지면 인쇄물은 []이됩니다. 두 번째로 동일한 목록을 참조 할 때 첫 번째 호출에서 값 33과 4가 추가되므로 [33, 4]이 인쇄됩니다. 그런 다음 값 114와 514가 같은 목록에 추가됩니다.

+0

오오 그렇습니다 ... 나는 단지 "정적"이 무엇을 의미하는지 이해하지 못했습니다. –