2015-01-29 3 views
1

는 내가 객체이 방법clone() 메서드를 올바르게 사용하는 방법은 무엇입니까?

int[] list1 = {1, 2}; 
int[] list2 = list1.clone(); 

를 만들 수 있습니다 알고이 정상적으로 작동합니다. 그런데 왜하지 제대로하지이 작품 :

ArrayList<Double> list1 = new ArrayList<Double>(); 
list1.add(1.0); 
list1.add(2.0); 
list1.add(0.5); 
ArrayList<Double> list2 = list1.clone(); 

내가 알고있는 것은이 코드는 괜찮이다

ArrayList<Double> list2 = (ArrayList<Double>)list1.clone(); 

어쩌면 때문에 list1.clone() 참조 형을 반환하지 않는, 그래서 needs (ArrayList)를 사용하면 참조 유형을 반환 할 수 있습니다.

하지만 왜 int[] list2 = list1.clone();을 사용할 수 있습니까?

+1

가 제대로 작동하지 않습니다 그것은 무엇을 의미합니까? – Aify

+0

는이 라인 \t에있는 다수의 마커를 나타냅니다 - 유형 불일치 :

답변

4

ArrayList의 메서드는 약 here에 대해 읽을 수있는 얕은 복사본입니다.

복사 생성자 대신 new ArrayList(listToCopy)을 사용해보십시오. 이런 식으로 뭔가 : 당신은 당신이 다른 ArrayList를 초기화하기 전에 ArrayList<Double>에 캐스팅 할 필요가 있도록 작동하지 않았다 처음하려고 노력 무슨 이유에

ArrayList<Double> list1 = new ArrayList<Double>(); 
list1.add(1.0); 
list1.add(2.0); 
list1.add(0.5); 
ArrayList<Double> list2 = new ArrayList<Double>(list1); 

clone() 방법은 Object 형식을 반환 그것으로.

1

이 게시물을 참조하십시오. 거기에 몇 가지 유용한 답변이 있습니다. Deep copy, shallow copy, clone

간단히 말해서 clone()은 1 레벨 (즉, 얕은 복사본)에서만 개체를 ​​복사하지만 전체 복사본은 개체를 둘 이상의 수준에서 복사 할 수 있습니다. 딥 클론에 대한 기사는 여기에서 찾을 수 있습니다. Deep Clone 딥 클론 기능을 직접 만드는 방법입니다.

0

새로운 질문에 대한 답변으로 int [] 복제가 작동하는 이유는 clone()이 int []에서 실행될 때 기본 유형이므로 모두 참조로 반환하기 때문입니다. 기본 유형 (될 일이, 당신이 그것을 짐작하는 int [])

참조 : http://howtodoinjava.com/2012/11/08/a-guide-to-object-cloning-in-java/

+0

당신에게 많이 감사 \t 위해 ArrayList Object에서 변환 할 수 없습니다, 이것은 INT []를 설명합니다. 하지만 웹 사이트에서 "클래스에 클래스 유형의 멤버가 포함되어 있으면 해당 멤버에 대한 객체 참조 만 복사되므로 원래 객체와 복제 된 객체 모두의 멤버 참조가 동일하게 참조됩니다. 목적." 그것은 ArrayList의 list2를 의미합니까 list1과 같은 참조가 있습니까? 하지만 "list2.add (3.5);"를 추가하면 list1이 변경되지 않습니다. –

+0

개체의 참조가 변경되지 않았습니다. list1 내부의 1.0, 2.0 및 0.5는 여전히 list2 내부의 3 개와 동일한 객체입니다. list2에 새 객체를 추가하면 list1에 동일한 객체가 추가되지 않습니다. 목록 1에 변수 x = 2.0이 있으면 목록 2도 x = 2.0을 가지며 둘 중 하나에서 x를 변경하면 둘 다 변경됩니다. – Aify

관련 문제