>Java >java지도 시간 >Java Deep Copy, Shallow Copy 및 Cloneable 인터페이스를 사용하는 방법

Java Deep Copy, Shallow Copy 및 Cloneable 인터페이스를 사용하는 방법

PHPz
PHPz앞으로
2023-04-28 20:31:051313검색

1. Cloneable 인터페이스 소개

Cloneable은 내부 메소드와 속성이 없습니다. 객체가 복제될 수 있음을 나타내기 위해 Cloneable을 구현하고 Object.clone()을 사용할 수 있습니다. 방법. Cloneable을 구현하지 않는 클래스 객체가 clone()을 호출하면 CloneNotSupportedException이 발생합니다.

Java Deep Copy, Shallow Copy 및 Cloneable 인터페이스를 사용하는 방법

Cloneable 인터페이스는 사용자 정의 유형에서 어떤 클래스를 복제할 수 있는지 표시해야 한다는 점을 이해할 수 있습니다. 이 표시는 Cloneable 인터페이스를 구현한 후 해당 클래스를 나타냅니다. 생성된 객체는 복제될 수 있습니다.

클래스에 인스턴스 복사 기능을 포함하려면 Cloneable 인터페이스 구현 외에도 Object 클래스의 clone() 메서드도 재정의해야 합니다.

Java Deep Copy, Shallow Copy 및 Cloneable 인터페이스를 사용하는 방법

Object 클래스의 clone() 메소드가 protected로 수정된 것을 볼 수 있으므로, 오버라이드된 clone() 메소드의 super 키워드를 통해 Object 클래스의 clone() 메소드를 호출해야 합니다

Java Deep Copy, Shallow Copy 및 Cloneable 인터페이스를 사용하는 방법

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);
    }
}

실행 결과:

Java Deep Copy, Shallow Copy 및 Cloneable 인터페이스를 사용하는 방법

얕은 복사 그림:

Java Deep Copy, Shallow Copy 및 Cloneable 인터페이스를 사용하는 방법

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);
    }
}

실행 결과:

Java Deep Copy, Shallow Copy 및 Cloneable 인터페이스를 사용하는 방법

깊은 복사 그림:

Java Deep Copy, Shallow Copy 및 Cloneable 인터페이스를 사용하는 방법

4. 복제 방법 요약

Java의 복제 방법은 얕은 복사본이며 참조 유형은 여전히 ​​참조를 전달하고 있습니다. 계속해서 clone() 메서드를 호출하고 객체의 참조 유형 변수에 다시 clone() 메서드를 구현하면 깊은 복사를 구현할 수 있습니다.

위 내용은 Java Deep Copy, Shallow Copy 및 Cloneable 인터페이스를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제