前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初识Object的clone()

初识Object的clone()

作者头像
用户8889406
发布2023-03-05 15:32:55
4140
发布2023-03-05 15:32:55
举报
文章被收录于专栏:小呙同学

浅拷贝(Shadow Clone)

对基本数据类型进行值传递,对引用数据类型进行引用传递的拷贝。

创建一个User类,试验下clone()方法

代码语言:javascript
复制
public class User implements Cloneable{
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
  
      @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) {
        User user = new User();
        user.setName("小提手");
        user.setAge(18);
        System.out.println("source user = " + user);

        System.out.println();

        User clone = (User) user.clone();
        System.out.println("clone user = " + clone);

        System.out.println();
        System.out.println("----- clone after 进行赋值操作 -----");
        System.out.println();

        clone.setAge(25);
        System.out.println("source user = " + user);
        System.out.println("clone user = " + clone);
    }
}
基本类型的值传递
基本类型的值传递

好像跟他说的不一样呀,浅拷贝对象内容也不一样了,问题出在哪里呢?对第一句话反复的研读,才发现,我这只是在修改基本类型,所以age的值是不一样了。为了实验我的想法,有新增了一个类:

代码语言:javascript
复制
public class Person implements Cloneable
{
    private String name;
    private User user;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", user=" + user +
                '}';
    }

    public static void main(String[] args) {
        User user = new User();
        user.setName("小提手");
        user.setAge(18);

        Person person = new Person();
        person.setName("程序员");
        person.setUser(user);
        System.out.println("person = " + person);


        Person clone = (Person) person.clone();
        System.out.println("clone = " + clone);

        System.out.println();
        clone.setName("管理员");
        clone.getUser().setAge(25);

        System.out.println("person = " + person);
        System.out.println("clone = " + clone);
    }
}
浅拷贝
浅拷贝

从这可以发现,对于拷贝的对象,我分别修改了基本类型和引用类型的内容,基本类型的值是只修改了拷贝对象的内容,源对象的内容值不会跟着改变;但是修改引用类型的值,会将源对象的也一起改变。

深拷贝(Deep Clone)

对基本数据类型进行值传递,为数据类型创建一个新的对象,并且复制其内容的拷贝。

将上面的代码进行修改:

重写Object类的clone()方法。

代码语言:javascript
复制
public class User implements Cloneable{
    private String name;
    private Integer age;

		//...

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

重写Object类的clone()方法。

代码语言:javascript
复制
public class Person implements Cloneable
{
    private String name;
    private User user;

		//...

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person clone = (Person) super.clone();
        clone.setUser((User) user.clone());
        return clone;
    }
}

测试:

代码语言:javascript
复制
public static void main(String[] args) throws CloneNotSupportedException {
        User user = new User();
        user.setName("小提手");
        user.setAge(18);

        Person person = new Person();
        person.setName("程序员");
        person.setUser(user);
        System.out.println("person = " + person);


        Person clone = (Person) person.clone();
        System.out.println("clone = " + clone);

        System.out.println();
        clone.setName("管理员");
        clone.getUser().setAge(25);

        System.out.println("person = " + person);
        System.out.println("clone = " + clone);
    }
}

结果:

深拷贝
深拷贝

发现的确是复制了引用类型的内容,克隆对象与源对象内容的值互不干扰。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 浅拷贝(Shadow Clone)
  • 深拷贝(Deep Clone)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档