1개의 보호된 네이티브 객체 clone()이 CloneNotSupportedException을 발생시킵니다.
1. 이 메서드는 네이티브 키워드에 의해 수정됩니다.
Java의 네이티브 키워드는 이 메서드가 로컬 메서드임을 나타냅니다. 자바 네이티브 설명 】. 또한 네이티브 수정 메서드의 실행 효율성은 네이티브 수정 메서드가 아닌 메서드의 실행 효율성보다 높습니다.
2. 메서드는 protected로 수정됩니다.
클래스가 clone() 메서드를 재정의하는 경우 다른 모든 클래스가 이 클래스에 액세스할 수 있도록 공용 액세스 수정자로 수정해야 합니다. . 방법.
3. 메소드가 CloneNotSupportedException을 발생시킵니다.
clone() 메소드를 대체하려는 클래스는 java.lang.Cloneable 인터페이스 자체를 구현해야 합니다. 그렇지 않으면 CloneNotSupportedException이 발생합니다.
2. clone()의 역할
참고: 여기서 개체는 구체적으로 복합 유형을 나타냅니다.
1. 단순 = 연산
우리는 Java의 복합 유형 객체가 참조 유형이며 객체의 메모리 주소를 저장하는 경우가 많다는 것을 알고 있습니다. 따라서 = 연산자와 같은 간단한 할당 연산을 사용할 수는 없습니다. 객체 a를 다른 객체 b에 할당할 때 객체 a의 메모리 주소를 b에 할당하면 두 객체가 모두 동일한 메모리 주소를 가리키게 됩니다. 결과적으로 한 개체를 수정하면 다른 개체에도 영향을 미치게 됩니다. 아래 그림과 같이
Person p1 = new Person(); Person p2 = p1;
2.clone()
clone() 메소드를 사용하여 빠르게 생성합니다. 개체는 복사본이며 두 개체는 서로 다른 메모리 주소를 가리킵니다. 아래 그림과 같이
Person p1 = new Person(); Person p2 = p1.clone();
3. 얕은 클론과 깊은 클론1, 얕은 클론(얕은 복사본)
shallow clone은 객체의 필드가 아닌 객체 자체만 복제하는 것을 의미합니다. 그냥 얕은 복제인 super.clone()을 호출하세요. 복사된 객체가 다른 메모리 주소를 가리키더라도 객체의 필드는 여전히 이전 객체와 동일한 메모리 주소를 가리킵니다.
public class ShallowClone implements Cloneable { public String name; public int age; public Person person; public ShallowClone() { } public ShallowClone(String name, int age, Person person) { this.name = name; this.age = age; this.person = person; } @Override public ShallowClone clone() { ShallowClone c = null; try { c = (ShallowClone) super.clone(); return c; } catch (CloneNotSupportedException e) { e.printStackTrace(); } return c; } public static void main(String[] args) { Person p = new Person(); p.name = "p"; p.age = 10; ShallowClone c1 = new ShallowClone("Jim", 18, p); System.out.printf("before clone: c1 = %s, c1.person = %s\n", c1, c1.person); ShallowClone c2 = c1.clone(); System.out.printf("after clone: c2 = %s, c2.person = %s\n", c2, c2.person); } }
main() 출력 실행:
before clone: c1 = cre.sample.test.object.ShallowClone@558385e3, c1.person = cre.sample.test.Person@2dcb25f1 after clone: c2 = cre.sample.test.object.ShallowClone@742808b3, c2.person = cre.sample.test.Person@2dcb25f1
얕은 복사본에 대한 설명, ShallowClone 객체 메모리 주소가 변경되었지만 Person 필드 메모리는 개체 주소가 변경되지 않았습니다.
2. Deep clone(깊은 복사)
Deep clone은 개체 자체뿐만 아니라 개체의 필드도 복제하는 것을 말합니다.
/** * deep clone代码示例 * Created by CreGu on 2016/6/9. */ public class DeepClone implements Cloneable { public String name; public int age; public Person person; public DeepClone() { } public DeepClone(String name, int age, Person person) { this.name = name; this.age = age; this.person = person; } @Override public DeepClone clone() { DeepClone c = null; try { c = (DeepClone) super.clone(); c.person = person.clone(); return c; } catch (CloneNotSupportedException e) { e.printStackTrace(); } return c; } public static void main(String[] args) { Person p = new Person(); p.name = "p"; p.age = 10; DeepClone c1 = new DeepClone("Jim", 18, p); System.out.printf("before clone: c1 = %s, c1.person = %s\n", c1, c1.person); DeepClone c2 = c1.clone(); System.out.printf("after clone: c2 = %s, c2.person = %s\n", c2, c2.person); } }
main() 출력 실행:
before clone: c1 = cre.sample.test.object.DeepClone@558385e3, c1.person = cre.sample.test.Person@2dcb25f1 after clone: c2 = cre.sample.test.object.DeepClone@742808b3, c2.person = cre.sample.test.Person@70535b58
딥 카피에 대한 설명, DeepClone 개체 메모리 주소가 변경되었습니다. , 그러나 개체에 있는 Person 필드의 메모리 주소도 변경되었습니다.
Java 객체의 clone 메소드에 대한 위의 종합 분석은 모두 편집자가 공유한 내용이므로 참고가 되기를 바라며, PHP 중국어 사이트를 지원해 주시길 바랍니다.
자바 객체의 복제 방법에 대한 보다 종합적인 분석과 관련 글은 PHP 중국어 홈페이지를 주목해주세요!