java中是否有“clone”的默认版本?
假设我有一个叫做person的类java中是否有“clone”的默认版本?,java,Java,假设我有一个叫做person的类 class Person { public string name; public int age; ... } 如果我自己不手动实现克隆。调用Person.clone()时会发生什么?我从某人那里听说Java将只做一个“默认”克隆,它将深度复制类的所有基元数据类型属性。这是真的吗?它做的就是它所说的: classObject的方法clone执行特定的克隆操作。首先,如果该对象的类没有实现接口Cloneable,则抛出CloneN
class Person
{
public string name;
public int age;
...
}
如果我自己不手动实现克隆
。调用Person.clone()
时会发生什么?我从某人那里听说Java将只做一个“默认”克隆,它将深度复制类的所有基元数据类型属性。这是真的吗?它做的就是它所说的:
classObject
的方法clone
执行特定的克隆操作。首先,如果该对象的类没有实现接口Cloneable
,则抛出CloneNotSupportedException
…这就是clone
在Person
类的实例上所做的。如果将实现可克隆的添加到类中,则:
…否则,此方法将创建此对象类的新实例,并使用此对象对应字段的内容初始化其所有字段,就像通过赋值一样;字段的内容本身不是克隆的。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作
旁注:你说过
调用Person.clone()
时会发生什么
我在上面假设你的意思是Person p=新人(/*…*/);Person p2=p.clone()
而不是实际的Person.clone()
Person.clone()
不会编译,您在类上没有静态克隆
方法。我的答案:不要使用克隆。见2001年的评论(是的,16年前):
克隆设备存在严重的设计缺陷。[…]在这一点上,克隆设备的实用性非常有限,因此不清楚是否值得使用创可贴。最好的策略通常是不使用它
您可以查看以下文档:
classObject
的方法clone
执行特定的克隆操作。首先,如果该对象的类没有实现接口Cloneable
,则抛出CloneNotSupportedException
假设您实现了可克隆接口。比如,
public class Person implements Cloneable {
String name;
int age;
public Person clone() {
return this;
}
}
否则,此方法将创建此对象类的新实例,并使用此对象对应字段的内容初始化其所有字段,就像通过赋值一样;字段的内容本身不是克隆的因此,该方法对该对象执行“浅拷贝”,而不是“深拷贝”操作。
输出:将是默认值。如何测试它?或者读取Object.clone()的javadoc?请注意,由于没有定义clone()方法,因此尝试调用clone()的代码甚至不会编译。
Person p = new Person();
Person p2 = p.clone();
System.out.println(p2.name); // null
System.out.print(p2.age); // 0