浅复制,深复制:
该文章并不是从头说起深复制和浅复制的实现,只是为了凸显出深浅复制机制的不同点,以及造成问题的解决方式。要是对复制机制不了解,还请先去看别的文章。
复制机制, 需要类实现接口:implements Cloneable
并且重写方法:public Object clone() throws CloneNotSupportedException{
return super.clone();
}
而学生类里面属性包含了name,age,专业类对象,所以设置专业类对象需要:学生类.set专业类(new 专业类());
但是,这时当对学生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也拥有了自己的专业类,学生一和学生二的专业类就不会互相影响了,这是深复制的一种实现方式。