假设我有一个名为person的课程
class Person
{
public string name;
public int age;
...
}
如果我自己不手动实施clone
。当我致电Person.clone()
时会发生什么?我从某人那里听说Java只会做一个“默认”克隆 - 它会深度复制该类的所有原始数据类型属性。这是真的吗?
答案 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年前):
克隆设施存在严重的设计缺陷。 [...]此时,克隆设施的实用性非常有限,因此不清楚是否值得在其上放置带状辅助设备。最好的政策通常是不使用它。
答案 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
输出将是默认值。