java中是否有默认版本的`clone`?

时间:2017-10-14 09:16:55

标签: java

假设我有一个名为person的课程

class Person
{
    public string name;
    public int    age;
    ...
}

如果我自己不手动实施clone。当我致电Person.clone()时会发生什么?我从某人那里听说Java只会做一个“默认”克隆 - 它会深度复制该类的所有原始数据类型属性。这是真的吗?

3 个答案:

答案 0 :(得分:2)

它执行Object.clone JavaDoc所说的内容:

  

clone的方法Object执行特定的克隆操作。首先,如果此对象的类未实现接口Cloneable,则抛出CloneNotSupportedException

...这样clone类的实例上的Person会发生什么。如果您在课程中添加了implements Cloneable,那么:

  

...否则,此方法创建此对象的类的新实例,并使用该对象的相应字段的内容初始化其所有字段,就像通过赋值一样;这些字段的内容本身不会被克隆。因此,这种方法执行一个浅拷贝"这个对象,而不是"深拷贝"操作

旁注:你已经说过了

  

当我致电Person.clone()时会发生什么?

我假设上面你的意思是Person p = new Person(/*...*/); Person p2 = p.clone();而不是Person.clone()Person.clone()无法编译,您在课程中没有static clone方法。

答案 1 :(得分:-1)

我的回答:不要使用克隆。见2001年Josua Bloch的评论(是的,16年前):

  

克隆设施存在严重的设计缺陷。 [...]此时,克隆设施的实用性非常有限,因此不清楚是否值得在其上放置带状辅助设备。最好的政策通常是不使用它。

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4220218

答案 2 :(得分:-1)

您可以查看clone()的文档:

  

clone的方法Object执行特定的克隆操作。首先,如果此对象的类未实现接口Cloneable,则抛出CloneNotSupportedException

假设您实现了可克隆接口。例如;

public class Person implements Cloneable {

String name;
int age;

 public Person clone() {
     return this;
 }
}
  

否则,此方法创建此对象的类的新实例,并使用该对象的相应字段的内容初始化其所有字段,就像通过赋值一样;这些字段的内容本身不会被克隆。 因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。

    Person p = new Person();
    Person p2 = p.clone();

    System.out.println(p2.name); // null
    System.out.print(p2.age); // 0

输出将是默认值。