2017-10-14 24 views
-2

可以說我有一個叫做類人在java中是否有默認的`clone`版本?

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

如果我沒有手動實現clone自己。當我撥打Person.clone()會發生什麼?我從某人那裏得知,Java只會執行一個「默認」克隆 - 它深度複製了該類的所有原始數據類型屬性。這是真的?

+2

如何測試它?或者閱讀Object.clone()的javadoc?請注意,由於沒有定義clone()方法,因此嘗試調用clone()的代碼甚至不會編譯。 –

回答

2

它完成Object.clone JavaDoc稱它做什麼:

的方法cloneObject類執行特定的克隆操作。首先,如果該對象的類沒有實現接口Cloneable,則引發CloneNotSupportedException

...所以這就是你的Person類的實例clone會做什麼。如果添加implements Cloneable到您的類,然後:

...否則,此方法創建此對象的類的一個新實例,並與該對象的相應字段的確切內容初始化所有的字段,彷彿通過轉讓;這些字段的內容本身並不克隆。因此,此方法執行此對象的「淺拷貝」,而不是「深拷貝」操作。


旁註:你曾經說過

當我打電話Person.clone()會發生什麼?

我以上假設你的意思是Person p = new Person(/*...*/); Person p2 = p.clone();而不是實際上Person.clone()Person.clone()將不會編譯,您沒有staticclone類的方法。

-1

我的回答:不要使用克隆。請參閱Josua Bloch在2001年的備註(是,16年前):

克隆設備存在嚴重的設計缺陷。 [...]在這一點上,克隆設施的實用性非常有限,所以目前還不清楚是否值得在其上安裝樂隊輔助設備。最好的政策通常是不使用它。

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

-1

你可以看一下文檔clone()

的方法cloneObject類執行特定的克隆操作。首先,如果該對象的類沒有實現接口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 

輸出:將默認值。

相關問題