2012-12-04 87 views
2

我無法理解如何創建和實現複製構造函數,以及重寫的clone()方法(不在同一個類中)。創建複製構造函數和重載的clone()方法

我知道,對於「實際複製」,您必須深入克隆而不是簡單的克隆(這花了我很長時間才能找出...)。我在這裏找到的一個更明顯的解決方案(對我來說)是製作一個拷貝構造函數。

爲簡潔起見,假設我有一個Dog對象,它包含兩個整數。在另一個類Cat中,我有一個包含100個Dog對象數組的Cat對象(例如,Dog [] cat = new Dog [100])。我試過以下至今:

// for a copy constructor 
public Cat(Cat cat) { 
    Dog[] copy = new Dog[100]; 
    for (int i = 0; i < 100; i++) { 
     copy[i] = cat[i]; 
    } 
} 

類似的東西總會給我一個類型不匹配(以下簡稱「類型的表達式必須是數組類型,但它決心貓」和「無法從貓轉換成狗「)。這可能是因爲現在是上午5點,但我不明白爲什麼這不起作用。不是同一類型的複製品和貓嗎?

如果我嘗試用我自己的clone()方法覆蓋,我會得到相同的錯誤。我之前從來沒有使用過clone()(或者看過這個),所以我想在看到自己的想法之前先看看我不理解。對於它的價值,不過,我有以下以前註釋掉和編譯器扔上來就return語句:

protected Cat clone() { 
    Dog[] copy = new Dog[100]; 
    int count = 0; 
    (while (count < cat.length) { 
     copy[count] = (Dog) cat[count]; 
     count++; 
    } 
    return copy; 
} 

同類型不匹配錯誤。將頭文件更改爲「protected Dog [] clone()」會使編譯器錯誤消失,但很明顯,這並沒有讓我獲得任何地方的幫助。

感謝您的幫助!

+0

你舉的例子是以某種方式誤導(貓和狗不會混在一起!);但是肯定的是'cat'是'Cat'的一個實例,而不是'Dog []'。 –

回答

1

在你的情況下,你試圖複製Cat對象中的一個Dog的數組。然而,你正在試圖(通過使用[]length

使用Cat對象數組什麼你大概的意思是貓中的內容複製到新的貓。然後你的構造函數會變成如下形式:

private Dogs[] myCatsDogs; 

// for a copy constructor 
public Cat(Cat otherCat) { 
    this.myCatsDogs = new Dog[100]; 
    for (int i = 0; i < 100; i++) { 
     this.myCatsDogs[i] = otherCat.myCatsDogs[i]; 
    } 
} 

對於clone()方法同樣適用。另外請注意克隆不經常使用(因爲它很難正確實現,另見布洛赫的Effective Java第10項)。如果可以,請始終使用複製構造函數。

+0

你編輯正確。 – Thirler

0

這是我簡單的例子,在展位的拷貝構造函數....

public class Dog { 
public final List<String> names; 
public int age; 
public int weight; 

public Dog() { 
    names = new ArrayList<String>(); 
} 

protected Dog(Dog original) { 
    names = new ArrayList<String>(original.names); 
    age = original.age; 
    weight = original.weight; 
} 

public Dog copy() { 
    return new Dog(this); 
} 

}

public class Dalmatian extends Dog { 
    public int spots; 

public Dalmatian() { } 

protected Dalmatian(Dalmatian original) { 
    super(original); 
    spots = original.spots; 
} 

public Dalmatian copy() { 
    return new Dalmation(this); 
} 

}

希望有所幫助....