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

java中是否有“clone”的默认版本?,java,Java,假设我有一个叫做person的类 class Person { public string name; public int age; ... } 如果我自己不手动实现克隆。调用Person.clone()时会发生什么?我从某人那里听说Java将只做一个“默认”克隆,它将深度复制类的所有基元数据类型属性。这是真的吗?它做的就是它所说的: classObject的方法clone执行特定的克隆操作。首先,如果该对象的类没有实现接口Cloneable,则抛出CloneN

假设我有一个叫做person的类

class Person
{
    public string name;
    public int    age;
    ...
}
如果我自己不手动实现
克隆
。调用
Person.clone()
时会发生什么?我从某人那里听说Java将只做一个“默认”克隆,它将深度复制类的所有基元数据类型属性。这是真的吗?

它做的就是它所说的:

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

…这就是
clone
Person
类的实例上所做的。如果将
实现可克隆的
添加到类中,则:

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


旁注:你说过

调用
Person.clone()
时会发生什么


我在上面假设你的意思是
Person p=新人(/*…*/);Person p2=p.clone()
而不是实际的
Person.clone()
Person.clone()
不会编译,您在类上没有
静态
克隆
方法。

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

克隆设备存在严重的设计缺陷。[…]在这一点上,克隆设备的实用性非常有限,因此不清楚是否值得使用创可贴。最好的策略通常是不使用它


您可以查看以下文档:

class
Object
的方法
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