>  기사  >  Java  >  Java 복제에 대한 간략한 분석(코드 예)

Java 복제에 대한 간략한 분석(코드 예)

不言
不言앞으로
2019-03-12 15:36:412532검색

이 기사는 Java 복제에 대한 간략한 분석(코드 예제)을 제공합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

깊이란 무엇인가요? 그냥 학위.

Clone: ​​​​Cloneable 인터페이스를 구현하고 clone() 메서드를 재정의하고 상위 클래스의 clone() 호출로 돌아가는

clone 클래스의 복사본을 만듭니다.

public class Person implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException { 
        return super.clone();
    }
    //...省略其余代码
}

그런 다음 복제할 때 방금 다룬 clone()을 호출하세요.

Shallow copy

이제 Child 클래스가 있습니다:

public class Child{
    //...省略其余代码
}

및 Person 클래스:

public class Person implements Cloneable{
    private int age;
    private String name;
    private Child child;
    //...省略其余代码
}

Person 개체 p1을 복제하여 p2에 할당한 다음 해당 toString() 및 hashCode() 결과를 살펴봅니다.

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        Person p1 = new Person("zhangsan",23);
        p1.setChild(new Child("xiaoming", 1););
        //克隆操作
        Person p2 = p1.clone();
        //打印看看
        System.out.println(p1+", "+p1.hashCode()+", "+p1.getChild().hashCode());
        System.out.println(p2+", "+p2.hashCode()+", "+p2.getChild().hashCode());
    }
}

출력:

Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1550089733

결론: p1과 p2 멤버의 값은 동일하지만 두 개의 다른 개체이고 해당 Child 멤버는 동일한 개체입니다.

Deep copy

또한 Child에 대한 Cloneable 인터페이스를 구현하고 clone()을 재정의합니다.

public class Child implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();;
    }
    //...省略其余代码
}

그런 다음 Personclone() 구현을 변경합니다. class:Person类的clone()的实现:

public class Person implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person p = (Person)super.clone();
        p.setChild((Child)child.clone());
        return p;
    }
     //...省略其余代码
}

然后再调用上面的main(String [] args)

Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1442407170
그런 다음 위의 main(String [] args)를 호출하면 결과는 다음과 같습니다.

rrreee

결론: p1과 p2는 서로 다른 두 개체이고 해당 Child 멤버도 서로 다른 두 개체입니다. .

요약

클론은 복사본을 만드는 것입니다.

Shallow Copy는 단순히 값을 복사하는 것입니다. 참조 멤버가 있으면 해당 참조 멤버는 동일한 개체가 되지만 Deep Copy에서는 그렇지 않습니다.

이유

이렇게 생각하시면 됩니다. clone()을 호출하는 사람은 그 사람의 딥 카피입니다.

위의 얕은 복사 예에서는 p1 객체의 clone()이 호출되었기 때문에 p1과 p2는 두 개의 다른 객체입니다(깊은 복사 예에서는 p1과 p2 자체의 깊은 복사본). )의 p1도 Child 유형 객체의 clone()을 호출하므로 두 Child 유형 객체는 서로 다릅니다(모든 객체의 전체 복사본).


🎜

위 내용은 Java 복제에 대한 간략한 분석(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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