2015-06-25 69 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之前编写的代码向后兼容。它们不支持参数化类型的编译时类型检查。列表的收件人可以将任何*参考放入它中,而不仅仅是工厂参考。 –