Cloneable은 내부 메소드와 속성이 없습니다. 객체가 복제될 수 있음을 나타내기 위해 Cloneable을 구현하고 Object.clone()을 사용할 수 있습니다. 방법. Cloneable을 구현하지 않는 클래스 객체가 clone()을 호출하면 CloneNotSupportedException이 발생합니다.
Cloneable 인터페이스는 사용자 정의 유형에서 어떤 클래스를 복제할 수 있는지 표시해야 한다는 점을 이해할 수 있습니다. 이 표시는 Cloneable 인터페이스를 구현한 후 해당 클래스를 나타냅니다. 생성된 객체는 복제될 수 있습니다. 클래스에 인스턴스 복사 기능을 포함하려면 Cloneable 인터페이스 구현 외에도 Object 클래스의 clone() 메서드도 재정의해야 합니다. Object 클래스의 clone() 메소드가 protected로 수정된 것을 볼 수 있으므로, 오버라이드된 clone() 메소드의 super 키워드를 통해 Object 클래스의 clone() 메소드를 호출해야 합니다2. 얕은 복사 소개 및 예시객체 복사 시 객체의 기본 데이터형 멤버변수는 복사되지만, 참조형 멤버변수는 참조로만 전달되고, 새로운 객체는 생성되지 않습니다.
참조 유형의 내용이 수정되면 복사된 개체에 영향을 미칩니다. 간단히 말해서: 얕은 복사는 복사되는 개체만 복사하며 참조하는 개체는 복사하지 않습니다.
다음 코드를 관찰하고 Money 클래스의 인스턴스를 Person 클래스의 필드로 사용하고 Person 클래스의 새 개체인 person1을 만들고 이 person1 개체를 person2에 복사합니다. person1 객체를 복사하세요. 돈 참조가 person2에 복사되고, person1과 person2의 momey가 동일한 객체를 가리킵니다.class Money { public double m = 666; } class Person implements Cloneable{ int id; public Money money = new Money(); public Person(int id) { this.id = id; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "Person{" + "id=" + id + ", money=" + money.m + '}'; } } public class TestDemo3 { public static void main(String[] args) throws CloneNotSupportedException { Person person1 = new Person(1); Person person2 = (Person) person1.clone(); System.out.println("通过person2修改前的结果"); System.out.println(person1); System.out.println(person2); person2.money.m = 888; person2.id = 2; System.out.println("通过person2修改后的结果"); System.out.println(person1); System.out.println(person2); } }실행 결과: 얕은 복사 그림: 3. 딥 카피 소개 및 예객체를 복사할 때 기본 데이터 유형의 멤버 변수를 복사하는 것 외에도 참조는 다음과 같습니다. type 멤버변수를 복사하면 참조타입의 멤버변수를 저장하기 위해 새로운 객체가 생성된다. 간단히 말해서:
딥 복사는 복사할 개체가 참조하는 모든 개체를 복사합니다.
다음 코드는 person1 객체의 전체 복사를 구현하기 위해 깊은 복사를 구현합니다. 먼저 Person tmp 참조를 사용하여 얕은 복사 결과를 저장하고 tmp 참조를 통해 돈 개체를 찾은 다음 돈 개체를 복사한 다음 이를 할당합니다. tmp 돈을 쓰고 마침내 tmp로 돌아갑니다. 이런 식으로 돈이 참조하는 객체도 복사되어 딥 카피(deep copy)가 실현됩니다. 이때 momey in person1과 person2는 서로 다른 두 객체를 가리킵니다.class Money implements Cloneable{ public double m = 666; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class Person implements Cloneable{ public int id; public Money money = new Money(); public Person(int id) { this.id = id; } @Override protected Object clone() throws CloneNotSupportedException { //return super.clone(); Person tmp = (Person) super.clone(); tmp.money = (Money) this.money.clone(); return tmp; } @Override public String toString() { return "Person{" + "id=" + id + ", money=" + money.m + '}'; } } public class Test2 { public static void main(String[] args) throws CloneNotSupportedException{ Person person1 = new Person(1); Person person2 = (Person) person1.clone(); System.out.println("通过person2修改前的结果"); System.out.println(person1); System.out.println(person2); person2.money.m = 888; person2.id = 2; System.out.println("通过person2修改后的结果"); System.out.println(person1); System.out.println(person2); } }실행 결과: 깊은 복사 그림: 4. 복제 방법 요약Java의 복제 방법은 얕은 복사본이며 참조 유형은 여전히 참조를 전달하고 있습니다. 계속해서 clone() 메서드를 호출하고 객체의 참조 유형 변수에 다시 clone() 메서드를 구현하면 깊은 복사를 구현할 수 있습니다.
위 내용은 Java Deep Copy, Shallow Copy 및 Cloneable 인터페이스를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!