深拷贝和浅拷贝

一.clone对象的使用

1.对象的复制和引用的复制

 Person p = new Person(23, "zhang");
 Person p1 = p;
 System.out.println(p);
 System.out.println(p1);

对象未改变,复制的是引用,都指向同一个对象new Person(23, “zhang”)

在这里插入图片描述

2.clone的使用

Person p = new Person(23, "zhang");
Person p1 = (Person) p.clone();
System.out.println(p);
System.out.println(p1);

clone了一个新对象,p和p1指向了不同的对象
在这里插入图片描述

二.深拷贝和浅拷贝

1.浅拷贝

缺陷:复杂属性是以复制引用的方式实现

public class Person implements Cloneable{
 privatint age ;
 private String name;
  public Person(int age, String name) {
    this.age = age;
    this.name = name;
 } 
 public Person() {}
 public int getAge() {
 return age;
 }
 public String getName() {
 return name;
 }
 @Override
 protected Object clone() throws CloneNotSupportedException {
 return (Person)super.clone();
 }
}

上述代码:直接将原对象中的 name 的引用值拷贝给新对象的 name 字段
(如果是深拷贝:根据原 Person 对象中的 name 指向的字符串对象创建一个新的相同的字符串对象,将这个新字符串对象的引用赋给新拷贝的 Person 对象的 name 字段。)
注意:clone 方法执行的是浅拷贝
在这里插入图片描述

2.深拷贝

如何实现深拷贝:
方法一:
如果想要深拷贝一个对象,这个对象必须要实现 Cloneable 接口,实现 clone方法,并且在 clone 方法内部,把该对象引用的其他对象也要 clone 一份,这就要求这个被引用的对象必须也要实现Cloneable 接口并且实现 clone 方法

按照上面的结论,实现以下代码 Body 类组合了 Head 类,要想深拷贝Body 类,必须在 Body 类的 clone 方法中将 Head 类也要拷贝一份
在这里插入图片描述

public class DS_Copy {
    static class Body implements Cloneable{
    public Head head;
    public Body() {}
    public Body(Head head) {this.head = head;}
 
 @Override
   protected Object clone() throws CloneNotSupportedException {
             Body newBody = (Body) super.clone();
            newBody.head = (Head) head.clone();
             return newBody;
             }
}
  static class Head implements Cloneable{
  public Face face;
  public Head() {}
  @Override
  protected Object clone() throws CloneNotSupportedException {
       return super.clone();
 }
    }
public static void main(String[] args) throws CloneNotSupportedException {
         Body body = new Body(new Head(new Face()));
         Body body1 = (Body) body.clone();
         System.out.println("body == body1 : " + (body == body1) );
         System.out.println("body.head == body1.head : " + (body.head == body1.head));
        }
}

方法二
实现Serlalizable接口,使用字节/对象的IO流来序列化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Serendipity sn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值