可以說我有一個叫做類人在java中是否有默認的`clone`版本?
class Person
{
public string name;
public int age;
...
}
如果我沒有手動實現clone
自己。當我撥打Person.clone()
會發生什麼?我從某人那裏得知,Java只會執行一個「默認」克隆 - 它深度複製了該類的所有原始數據類型屬性。這是真的?
可以說我有一個叫做類人在java中是否有默認的`clone`版本?
class Person
{
public string name;
public int age;
...
}
如果我沒有手動實現clone
自己。當我撥打Person.clone()
會發生什麼?我從某人那裏得知,Java只會執行一個「默認」克隆 - 它深度複製了該類的所有原始數據類型屬性。這是真的?
它完成Object.clone
JavaDoc稱它做什麼:
的方法
clone
爲Object
類執行特定的克隆操作。首先,如果該對象的類沒有實現接口Cloneable
,則引發CloneNotSupportedException
。
...所以這就是你的Person
類的實例clone
會做什麼。如果添加implements Cloneable
到您的類,然後:
...否則,此方法創建此對象的類的一個新實例,並與該對象的相應字段的確切內容初始化所有的字段,彷彿通過轉讓;這些字段的內容本身並不克隆。因此,此方法執行此對象的「淺拷貝」,而不是「深拷貝」操作。
旁註:你曾經說過
當我打電話
Person.clone()
會發生什麼?
我以上假設你的意思是Person p = new Person(/*...*/); Person p2 = p.clone();
而不是實際上Person.clone()
。 Person.clone()
將不會編譯,您沒有static
clone
類的方法。
我的回答:不要使用克隆。請參閱Josua Bloch在2001年的備註(是,16年前):
克隆設備存在嚴重的設計缺陷。 [...]在這一點上,克隆設施的實用性非常有限,所以目前還不清楚是否值得在其上安裝樂隊輔助設備。最好的政策通常是不使用它。
你可以看一下文檔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
輸出:將默認值。
如何測試它?或者閱讀Object.clone()的javadoc?請注意,由於沒有定義clone()方法,因此嘗試調用clone()的代碼甚至不會編譯。 –