关于深复制浅复制机制

浅复制,深复制:

该文章并不是从头说起深复制和浅复制的实现,只是为了凸显出深浅复制机制的不同点,以及造成问题的解决方式。要是对复制机制不了解,还请先去看别的文章。

  复制机制, 需要类实现接口:implements Cloneable

并且重写方法:
public Object clone() throws CloneNotSupportedException{
    return super.clone();

}


需求例子:有两个类,学生类和专业类,只有学生类实现了Cloneable接口,专业类没实现,

而学生类里面属性包含了name,age,专业类对象,所以设置专业类对象需要:学生类.set专业类(new 专业类());


然后对学生类调用clone(),复制学生1并生成学生2,这时对学生2的name和age进行修改不会影响到学生1。
但是,这时当对学生2的专业类里面的属性进行修改则会同时修改学生1的专业类属性,这不是我们想要的结果。


为什么会这样?因为专业类是学生1通过 new创建出来的,然后复制一个学生2时,专业类这时也只被

new一次而已(就是只有一个专业类对象,所以修改学生2的专业类属性也会影响到学生1),这种冲突是浅复制的一种缺陷。

解决:
专业类也实现Cloneable接口,然后学生类重写方法如下:
public Object clone() throws CloneNotSupportedException{
        Student newStudent = (Student) super.clone();
        newStudent.professor = (Professor) professor.clone();         //professor专业类
        return newStudent;
}
这样一来,学生2也拥有了自己的专业类,学生一和学生二的专业类就不会互相影响了,这是深复制的一种实现方式。

猜你喜欢

转载自blog.csdn.net/a5552157/article/details/78622163
今日推荐