java中深拷贝和浅拷贝

在 Java 中,除了基本数据类型(元类型)之外,还存在 类的实例对象 这个引用数据类型。而一般使用 『 = 』号做赋值操作的时候。对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际上还是指向的同一个对象。

 

而浅拷贝和深拷贝就是在这个基础之上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。

 

所以到现在,就应该了解了,所谓的浅拷贝和深拷贝,只是在拷贝对象的时候,对 类的实例对象 这种引用数据类型的不同操作而已。

浅拷贝  containObject指的是容器地址

 

 

 

 

深拷贝

 

 

 

 

 

 

 顶级类Object里面的方法 clone(),native本地修饰无法打开,protected修饰只有在同一个包的子类才有资格

 引用对象默认浅拷贝

public class Student {
    private  String name;
    private  Integer age;
    public Student(String name, Integer age) {
        this.name = name;
        this.age = 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;
    }
}
public static void main(String[] args) {
Student student1 = new Student("张三",23);
Student student2= student1;
System.out.println( System.identityHashCode(student1));
System.out.println( System.identityHashCode(student2));
}

 

 

数值对象

 public static void main(String[] args) {
        int student1 = 1;
        int student2= student1;
        System.out.println( System.identityHashCode(student1));
        System.out.println( System.identityHashCode(student2));
    }

打印内存地址

 

 重写Clone方法

public class Student implements Serializable,Cloneable {
    private  String name;
    private  Integer age;
    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    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;
    }
}

 public static void main(String[] args) throws Exception {
Student student1 = new Student("name",12);
Student student2= (Student) student1.clone();
System.out.println( System.identityHashCode(student1));
System.out.println( System.identityHashCode(student2));
}

 

完成深拷贝,即复制内存地址和值 

 

 

 

 

 

 

 

posted @ 2021-12-02 14:41  天道酬勤312  阅读(71)  评论(0)    收藏  举报