2016-02-19 34 views
3

我需要一個所有動物的列表。我有一個基本的Animal類,並希望將它擴展到狗,貓,鬣蜥等。Java列表/包含各種動物的動物數組

是否有一種很好的方法將它們全部合併爲一個List

我希望能夠檢查所有動物的整個列表,而無需更改所有以前製作的動物。他們應該知道所有其他的Animal課程。

+7

你的意思是,一個'List '? –

+0

爲什麼動物需要相互認識?一旦你回答了這個問題,你可以創建一個類來協調真正需要彼此瞭解的類。 –

+0

你應該閱讀Eric Lippert的這兩個部分http://ericlippert.com/2015/10/19/inferring-from-is/ – Zuzlx

回答

3

您可以創建一個List<Animal>這樣的:

// create empty list 
List<Animal> animals = new ArrayList<>(); 

// add any kind of animal 
animals.add(new Kangaroo()); 
animals.add(new Butterfly()); 

// use that list later 
int numberOfAnimals = animals.size(); 
for (Animal animal : animals) { 
    // do something 
} 

事情要記住:

  • 使用動物名錄的項目,當你不知道了哪種它是動物。如果你想訪問你應該檢查動物的具體袋鼠細節,該項目是否真的(使用instanceof
  • 您只能將對象添加到動物的名單,它的類extends Animal袋鼠。
  • 一般來說,最好將您的代碼保存爲,一般爲。如果你需要ArrayList的特殊功能,那麼讓你的動物爲ArrayList。但在大多數情況下,將變量定義爲List甚至Collection(或Iterable)會使您的代碼更加靈活。
+0

如果我想像'animals.get(0).disp()'那樣做一些東西,當我將元素0添加爲一個狗時,似乎我必須在超類中有一個默認的disp函數,然後在子類中覆蓋它。這似乎不應該,我錯過了明顯的東西? –

3

您可以通過擴展Animal基類,這樣做的任何數量的Animal S:

public class Dog extends Animal { 

} 

然後你可以聲明動物的一個新的列表。

List<Animal> animals = new ArrayList<Animal>(); 

一旦你這樣做,你可以添加任意數量的新對象的擴展Animal類到列表中。

animals.add(new Dog()); 
animals.add(new Cat()); 
animals.add(new Iguana()); 
1

它被稱爲Polymorphism。所以基本上,你自己回答你的問題。在Java中添加已聲明集合類型的子類型的集合對象是完全合法的。

1

您可以使用List<? extends Animal> animals = new ArrayList<>();然後添加任何類型的動物到列表中。