浅拷贝和深拷贝的例子

时间:2012-03-30 03:01:16

标签: 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();
 }

}

3 个答案:

答案 0 :(得分:7)

我建议您使用Cloneable,而不是尝试实施considered broken copy constructors。复制构造函数将其自己的声明类型的实例作为参数,并将该实例的字段复制到新对象。例如:

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

...

Student copy = new Student(originalStudent);

如果Department也公开了复制构造函数,那么您将可以制作Student的深层副本。例如:

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

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


为了进一步阅读,this article涉及Cloneable的问题和复制构造函数的限制。

答案 1 :(得分:0)

你也可以使用dup()方法,它也返回原始版本的副本取决于你试图用复制方法实现的代码类型......你只是在没有向我们提供足够信息的情况下征求意见正确指导你... stackoverflow中还有大量已回答的问题,这些问题都有例子,所以你应该在询问附加帮助之前先用你的东西检查一下

答案 2 :(得分:0)

根据我的理解,这是正确的,只有一件事你必须确保,即在DepartMent类中覆盖clone()方法。