Home > Java > javaTutorial > A brief analysis of Java cloning (code example)

A brief analysis of Java cloning (code example)

不言
Release: 2019-03-12 15:36:41
forward
2555 people have browsed it

This article brings you a brief analysis (code example) of Java cloning. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

What is depth? Just a degree.

Clone: ​​Make a copy of the

The cloned class implements the Cloneable interface, overrides the clone() method, and returns to the clone() call of the parent class.

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

Then, when cloning, just call the clone() we just covered.

Shallow copy

Now there is the Child class:

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

There is also the Person class:

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

Clone the Person object p1 and assign it to p2, and then let’s take a look Their toString() and hashCode() results:

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());
    }
}
Copy after login

Output:

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
Copy after login

Conclusion: The values ​​of p1, p2 members are equal, but they are two different objects, their Child member are the same object.

Deep copy

Also implement the Cloneable interface for Child and override clone():

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

Then, change the Person class The implementation of clone():

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

Then call the above main(String [] args), the result is:

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
Copy after login

Conclusion : p1 and p2 are two different objects, and their Child members are also two different objects.

Summary

Clone is to make a copy.

Shallow copy is simply copying the value. If there are reference members, their reference members will be the same object, but this is not the case with deep copy.

Why

You can think of it this way, whoever calls clone() is a deep copy of that person.

In the shallow copy example above, because clone() of the p1 object is called, p1 and p2 are two different objects (deep copies of p1 and p2 themselves); in the deep copy example , not only calls clone() of p1, but also calls clone() of Child type object, so the two Child type objects are different (deep copy of all objects).


The above is the detailed content of A brief analysis of Java cloning (code example). For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:segmentfault.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template