目 录CONTENT

文章目录

深拷贝和浅拷贝

在水一方
2022-02-22 / 0 评论 / 0 点赞 / 953 阅读 / 1,069 字 / 正在检测是否收录...

概念

本小节来回顾一下java的复制,复制是将一个对象的引用复制给另外一个对象,一共有三种方式。第一种方式是直接赋值,第二种方式是浅拷贝,第三种是深拷贝。所以大家知道了哈,这三种概念实际上都是为了拷贝对象

如何进行对象克隆

Object对象有个clone()方法,实现了对象中各个属性的复制,但它的可见范围是protected的,所以实体类使用克隆的前提是:
① 实现Cloneable接口,这是一个标记接口,自身没有方法。
② 覆盖clone()方法,可见性提升为public

为什么要使用clone?

主要应用于:实际开发中,A,B两个对象之间值的拷贝,A为原对象,后面对B的改动不会影响到A.

方式

1、直接赋值复制

浅复制(复制引用但不复制引用的对象)

创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象

demo测试

@Data
public class PersonClone implements Cloneable {

    private String name;
    private String address;
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

  @Test
    public void testCopy() throws Exception {
        PersonClone p1 = new PersonClone();
        p1.setAddress("北京");
        p1.setName("名字");

        PersonClone p2 = (PersonClone) p1.clone();
        System.out.println(p1 == p2);//false
        System.out.println("p1=" + p1);
        System.out.println("p2=" + p2);
        
    }

打印结果:
false
p1=PersonClone(name=名字, address=北京)
p2=PersonClone(name=名字, address=北京)

得出了对象的引用不同,而对象的内容是相同的

clone方法是浅拷贝

深复制(复制对象和其应用对象)

深拷贝不仅复制对象本身,而且复制对象包含的引用指向的所有对象
深拷贝:在浅拷贝的基础上,所有引用其他对象的变量也进行了clone,并指向被复制过的新对象

0

评论区