浅拷贝和深拷贝的例子

use*_*796 2 java clone

我可以通过以下方式实现深拷贝和浅拷贝吗?它是否正确?以下2种克隆方法中的任何一种都将放在最终代码中

public class Student{
  private String name;
  private DepartMent dept;


 //deep copy 
 public Object clone() throws CloneNotSupportedException{
  Student s =  (Student)super.clone();
  s.septDept((Department)dept.clone());
 }

 //shallow copy
 public Object clone() throws CloneNotSupportedException{
   return super.clone();
 }

}
Run Code Online (Sandbox Code Playgroud)

Pau*_*ora 7

我建议你看看使用复制构造函数Cloneable,而不是试图实现,这被认为是破碎的.复制构造函数将其自己的声明类型的实例作为参数,并将该实例的字段复制到新对象.例如:

public Student(Student copyFrom) {
    this.name = copyFrom.name;
    this.dept = copyFrom.dept;
}

...

Student copy = new Student(originalStudent);
Run Code Online (Sandbox Code Playgroud)

如果Department还公开了一个复制构造函数,这将允许您制作一个深层副本Student.例如:

public Student(Student copyFrom) {
    this.name = copyFrom.name;
    this.dept = new Department(copyFrom.dept);
}
Run Code Online (Sandbox Code Playgroud)

虽然从你的问题中不清楚为什么需要深层复制.


为了进一步阅读,本文涉及Cloneable复制构造函数的问题和局限性.

  • 你应该学习什么`克隆`是你永远不应该使用它.+1. (4认同)