这是一个普遍的问题。我试图在创建一个有效的程序或至少一个工作程序时理解多态的概念。
该程序将添加,删除,搜索和显示植物。
让我们说我必须创造一种超级植物和三种不同的植物(花,真菌,杂草)从植物延伸。
问题: 我希望能够创建一个工厂ArrayList或Array。 那可能吗? 或者最合乎逻辑的事情是什么?
上面的代码只是为了说明我的观点。没有任何正确的方法。
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 :(得分:4)
默认情况下,您可以将任何Object放入List中,但是从Java 5开始,Java Generics可以限制可以插入List的对象类型。
List<Plant> list = new ArrayList<Plant>();
此列表现在只能插入Plant实例。这是数组之间的多态性。
关于此主题的一个恼人的方面是虽然Flower
是Plant
的子类型,但这并不意味着ArrayList<Flower>
是ArrayList<Plant>
的子类型。
你能做的是
List<Plant> list = new ArrayList<Plant>();
然后
Plant flower1 = new Flower();
Plant weed1 = new Weed();
list.add(flower1);
list.add(weed1);
泛型的要点是添加编译时类型安全性,这样的答案为什么第二种方法不是类型安全。
答案 1 :(得分:3)
您可以在Plant[]
数组或ArrayList<Plant>
中存储对Plant的任何子类的实例的引用。
数组是表示固定大小集合的一种方法。您的示例说明了如何将Plant引用放入数组中。
ArrayList<Plant>
支持一个大小可以根据需要更改的集合。您可以使用多种方法将Plant引用放入其中,包括add()
方法:
plantList.add( new Flower() );
顺便说一句,Java中习惯用所有类命名一个大写的初始字符。