多态性、ArrayList 和对象
Polymorphism, ArrayList, and Objects
这是一个比较笼统的问题。我试图在创建高效程序或至少是工作程序时理解多态性的概念。
该程序将添加、删除、搜索和显示植物。
假设我必须创建一个超级 class 植物和三种不同的植物(花、真菌、杂草)以从植物延伸。
问题:
我希望能够创建一个工厂 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 中吗?
您可以将对 Plant 的任何子类实例的引用存储在 Plant[]
数组或 ArrayList<Plant>
中。
数组是表示固定大小集合的一种方式。您的示例说明了如何将 Plant 引用放入数组中。
ArrayList<Plant>
支持一个集合,其大小可以根据需要改变。您可以使用多种方法将 Plant 引用放入其中,包括 add()
方法:
plantList.add( new Flower() );
顺便说一句,在 Java 中习惯用首字母大写字符命名所有 类。
默认情况下,您可以将任何对象放入列表中,但是从 Java 5 开始,Java泛型可以限制您可以插入列表中的对象类型。
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);
泛型的重点是添加编译时类型安全,这样就可以回答为什么第二种方法不是类型安全。
这是一个比较笼统的问题。我试图在创建高效程序或至少是工作程序时理解多态性的概念。
该程序将添加、删除、搜索和显示植物。
假设我必须创建一个超级 class 植物和三种不同的植物(花、真菌、杂草)以从植物延伸。
问题: 我希望能够创建一个工厂 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 中吗?
您可以将对 Plant 的任何子类实例的引用存储在 Plant[]
数组或 ArrayList<Plant>
中。
数组是表示固定大小集合的一种方式。您的示例说明了如何将 Plant 引用放入数组中。
ArrayList<Plant>
支持一个集合,其大小可以根据需要改变。您可以使用多种方法将 Plant 引用放入其中,包括 add()
方法:
plantList.add( new Flower() );
顺便说一句,在 Java 中习惯用首字母大写字符命名所有 类。
默认情况下,您可以将任何对象放入列表中,但是从 Java 5 开始,Java泛型可以限制您可以插入列表中的对象类型。
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);
泛型的重点是添加编译时类型安全,这样就可以回答为什么第二种方法不是类型安全。