2013-05-29 140 views
2

我有一個CalleString nombre;int addr;。但是,我所做的clone方法給了我錯誤的值。尋找正確的克隆方法

public class Calle{ 
    String nombre; 
    int addr; 

    public Object clone(){ 
     return this; 
    } 
} 

Calle c1 = new Calle("a",1); 
Calle c2 = c1.clone(); 
c2.setAddr(3); 

System.out.println(c1.addr); // value wrong 

爲什麼值錯了?

+1

b/c你實際上並沒有克隆。您需要實際創建一個新對象並將其返回 – greedybuddha

+0

克隆不是一種特殊的方法,就像Java一樣,它就像任何其他方法一樣。你必須編寫它來實際克隆對象,而不僅僅是'返回這個'。 – Patashu

回答

2

對於您的情況,您可以使用Object提供的標準淺層克隆方法。只要String是不可變的,並且int值將被複制,則覆蓋複製邏輯沒有任何理由。只是使其可見。

public Object clone(){ 
    return super.clone(); 
} 

Cloneable接口也應該實現。

+0

標準克隆複製所有值? – leftsync

+0

是的,它使一個淺拷貝。不復制子對象。 – Mikhail

+0

http://en.wikipedia.org/wiki/Clone_(Java_method) – Mikhail

3

你的克隆方法是錯誤的,因爲它沒有真正克隆任何東西,它只是返回相同的對象。 clone應該始終爲新的對象,其值與原始值相同。

在這種情況下,它看起來像你已經有一個複製構造函數,所以只需使用它來創建新的Calle並返回它。

public Object clone(){ 
    return new Calle(this.nombre, this.addr); 
} 
+0

所有的變化? – leftsync

+0

就是這樣。這將創建新的Calle,填寫與您正在克隆的對象相同的值,並將返回 – greedybuddha

1

你的克隆方法是錯誤的,因爲它沒有真正克隆任何東西,它只是返回相同的對象。

public Object clone() throws CloneNotSupportedException{ 
    return super.clone(); 
} 

。如果你想深克隆該克隆只會做淺克隆,你需要寫你贏得邏輯克隆。