2015-06-25 102 views
2

這是一個普遍問題。我正在嘗試理解多態的概念,同時創建一個高效的程序或至少一個工作程序。多態性,ArrayList和對象

程序將添加,刪除,搜索和顯示設備。

比方說,我要創建一個超一流的廠房和三種不同的植物(花,真菌,雜草)從工廠延伸。

問題: 我希望能夠建立一個工廠的ArrayList或陣列。 這可能嗎? 或者最合乎邏輯的事情是什麼?

上面的代碼只是爲了說明我的觀點。不以任何方式正確。

class Plant{ 
//atributes 
//constructor 
//setters and getters 
} 


class Flower extends Plant{ 
//with some different attributes 
} 


class Fungus extends Plant{ 
//with some different attributes 
} 

class Weed extends Plant{ 
// with some different attributes 
} 


public class PlantList{ 
public static void main(String[] args){ 

//HERE is where I'm confused 

ArrayList<Plant> plantList= new ArrayList<Plant>(); 


// OR 

Plant plantList= new Plant[25]; 

plantList[0] = new Flower(); 
plantList[1] = new weed(); 
plantList[2] = new fungus(); 

//or completely way off? 

//add() 
//remove() 
//search() 
//display() 

} 

有人可以解釋我如何將樹的不同類型的植物添加到Array或ArrayList?

+0

您的代碼中存在一些小的一致性拼寫錯誤;選擇一個拼寫'植物' –

+0

@BenKnoble正如我上面提到的那不是一個真正可行的代碼。我試圖打字得非常快。沒想到會冒犯任何人。感謝您的幫助! –

+0

不是沒有罪行;它對SO的一個驕傲點是,問題(和答案)看起來很專業。如果你有機會,你可能會清理它,因爲你知道。 –

回答

4

默認情況下,你可以把任何物體進入名單,但是從Java 5,Java泛型能夠限制你可以插入到一個列表中的對象類型。

List<Plant> list = new ArrayList<Plant>(); 

此列表現在只能插入植物實例。這是數組之間的多態。關於這個話題

一個惱人的方面是,雖然FlowerPlant一個亞型,這並不意味着ArrayList<Flower>ArrayList<Plant>一個亞型。

你可以做的是

List<Plant> list = new ArrayList<Plant>(); 

然後

Plant flower1 = new Flower(); 

Plant weed1 = new Weed(); 

list.add(flower1); 
list.add(weed1); 

泛型的一點是添加的編譯時類型安全,這樣一種答案,爲什麼第二種方法不是類型安全的。

+0

如果我寫這樣的東西,我該怎麼辦?'list list = new ArrayList();' 'list.add(flower1);'????? –

+0

這樣,你有一個數組列表,可以有任何種類的對象,我也可以添加像一個字符串'list.add(「花?」)'',你可以看到這種方法是不安全的。 –

3

您可以在Plant[]數組或ArrayList<Plant>中存儲對工廠任何子類實例的引用。

數組是表示固定大小集合的一種方法。你的例子說明了如何將一個Plant引用放入一個數組中。

ArrayList<Plant>支持集合,其大小可以根據需要改變。你可以把一個工廠參考進去幾個方法,其中包括add()方法:

plantList.add(new Flower()); 

順便說一句,這是Java的習慣,最初大寫字母來命名所有類。

+0

謝謝。我知道這一點。我試圖打得太快,代碼只是爲了說明我的觀點。 –

+0

@Andy Thomas如果我這樣寫這個東西'List list = new ArrayList();' 'list.add(flower1);'????? –

+0

@BilalMaqsood - 然後你會使用「原始類型」。支持原始類型,以便與Java 1.5之前編寫的代碼向後兼容。它們不支持參數化類型的編譯時類型檢查。列表的收件人可以將任何*參考放入它中,而不僅僅是工廠參考。 –