1 보호 된 기본 객체 클론 ()는 ClonEnotsUpportedException을 던졌습니다.
1. 기본 키워드로 수정 된 메소드
Java의 기본 키워드는이 방법이 로컬 방법, [Java Native Description]임을 나타냅니다. 또한, 기본 수정 방법의 실행 효율은 비 네이티브 수정의 실행 효율보다 높다.
2. 보호에 의해 수정 된 방법
클래스가 clone () 메소드를 무시하면 다른 모든 클래스 가이 클래스 의이 메소드에 액세스 할 수 있도록 공개 액세스 수정 자로 수정해야합니다.
3. 메소드는 ClonEnotsUpportedException 예외를 던집니다
클래스가 clone () 메소드 를 무시하려면 java.lang.clonable 인터페이스 자체를 구현해야합니다.
2. 클론의 역할 ()
참고 : 여기서 객체는 특히 복잡한 유형을 나타냅니다.
1. 단순 = 작동
우리는 Java의 복잡한 유형의 객체가 모두 참조 유형이며, 종종 객체의 메모리 주소를 저장합니다. 따라서 값 작동을 = 연산자로 단순히 할당 할 수는 없습니다. 우리는 객체 A를 다른 객체 B에 할당하고 객체 A의 메모리 주소를 B에 할당하여 둘 다 동일한 메모리 주소를 가리키도록 할당합니다. 그 결과 객체 중 하나에 대한 수정이 다른 객체에 영향을 미친다는 것입니다. 다음 그림은 다음을 보여줍니다.
Person P1 = 새로운 사람 (); Person P2 = P1;
2. 클론 ()
Clone () 메소드를 사용하여 객체의 사본을 신속하게 만들 수 있으며 두 객체는 다른 메모리 주소를 가리 킵니다. 다음 그림은 다음을 보여줍니다.
Person P1 = New Person (); Person P2 = P1.Clone ();
3. 얕은 클론과 깊은 클론 1, 얕은 클론 (얕은 사본)
얕은 클론은 클론 물체가 아니라 클론 물체 자체의 필드를 말합니다. super.clone () 만 호출하고 얕은 클론만으로 전화하십시오. 복사 된 객체는 다른 메모리 주소를 가리키지 만 객체의 필드는 여전히 이전 객체와 동일한 메모리 주소를 가리 킵니다.
공개 클래스 얕은 클론은 복제 가능한 {공개 문자열 이름; 공개 int 연령; 공공 사람; public shallowclone () {} public shallowclone (문자열 이름, int 연령, 사람) {this.name = name; this.age = age; this.person = person; } @override public shallowclone clone () {shallowclone c = null; try {c = (얕은 클론) super.clone (); 반환 c; } catch (clonenotsupportedException e) {e.printstacktrace (); } 반환 c; } public static void main (String [] args) {person p = new Person (); p.Name = "P"; p.age = 10; 얕은 클론 C1 = 새로운 얕은 클론 ( "Jim", 18, p); System.out.printf ( "클론 전 : C1 = %S, C1.Person = %S/N", C1, C1.Person); 얕은 클론 C2 = C1.Clone (); System.out.printf ( "클론 후 : C2 = %S, C2.Person = %S/N", C2, C2.Person); }}main () 출력 실행 :
복제 전 : c1 = cre.sample.test.object.shallocclone@558385e3, c1.person = cre.sample.test.person@2dcb25f1after 클론 : c2 = cre.sample.test.object.hallockclone@742808b3, c2.person = cre.sample.tample.sample.sample.sample.sample.sample.sample.sample.sample.sample.sample.sample.sample.sample.sample.sample.sample.sample.sample.sample.sample.
이런 식으로, 얕은 클론 객체의 메모리 주소가 변경되었지만 객체의 사람 필드의 메모리 주소는 변경되지 않았습니다.
2. 깊은 클론 (깊은 카피)
Deep Clone은 클론 대상 자체의 필드와 클론 객체를 나타냅니다.
/*** 깊은 클론 코드 예* 2016/6/9에 크레그가 생성했습니다. */공개 클래스 딥 클론은 복제 가능한 {public string name; 공개 int 연령; 공공 사람; public deepclone () {} public deepclone (문자열 이름, int 연령, 사람) {this.name = name; this.age = age; this.person = person; } @override public DeepClone Clone () {DeepClone C = NULL; {c = (DeepClone) super.clone (); C.person = person.clone (); 반환 c; } catch (clonenotsupportedException e) {e.printstacktrace (); } 반환 c; } public static void main (String [] args) {person p = new Person (); p.Name = "P"; p.age = 10; DeepClone C1 = 새로운 딥 클론 ( "Jim", 18, P); System.out.printf ( "클론 전 : C1 = %S, C1.Person = %S/N", C1, C1.Person); 딥 클론 C2 = C1.Clone (); System.out.printf ( "클론 후 : C2 = %S, C2.Person = %S/N", C2, C2.Person); }}main () 출력 실행 :
복제 전 : c1 = cre.sample.test.object.deepclone@558385e3, c1.person = cre.sample.test.person@2dcb25f1after 클론 : c2 = cre.spample.test.objep.beepclone@742808b3, c2.person = c2.sample.sample.sample.
이 경우, 딥 클론 객체의 메모리 주소가 변경되었지만 객체의 사람 필드의 메모리 주소도 변경되었습니다.
Java 객체의 클론 방법에 대한 위의 포괄적 인 분석은 내가 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.