所以我遇到的问题是这个。我已经编写了一个方法作为程序的一部分,我用它来显示ArrayList中的所有对象。此ArrayList中存储了三种不同类型的对象:真菌,花和杂草。我可以毫无问题地致电plantList.get(i).getName()
和plantList.get(i).getColor
方法。这两个变量都属于名为Plant的父类。但是,当调用以下方法plantList.get(i).getPoison()
(此方法属于子类Fungus)时,我收到编译器错误,说它无法找到变量Fungus。
我已经尝试过与子类唯一的其他变量,并且会发生同样的事情。所以我可以从父类' Plant'但不是来自' Fungus'的任何子类。 '花'或者' Weed'。我是新手使用子类和超类,所以我很难弄清楚问题的确切位置。
public static void displayPlant(ArrayList<Plant> plantList) {
for (int i = 0; i < plantList.size(); i++) {
System.out.print(plantList.get(i).getName());
System.out.print(plantList.get(i).getID());
System.out.print(plantList.get(i).getColor());
if (plantList.get(i).contains(Fungus) == true) {
System.out.print(plantList.get(i).getPoison());
}
else if (plantList.get(i).contains(Flower) == true) {
System.out.print(plantList.get(i).getSmell());
System.out.print(plantList.get(i).getThorns());
}
else {
System.out.print(plantList.get(i).getPoison());
System.out.print(plantList.get(i).getEdible());
System.out.print(plantList.get(i).getMedicinal());
}
}
}
答案 0 :(得分:2)
一个好的解决方案是使用动态调度。即让元素本身决定它想要打印的信息。
class Plant {
...
public String toString() {
return String.join(" ", getName(), getID(), getColor());
}
}
class Fungus extends Plant {
...
@Override
public String toString() {
return String.join(" ", super.toString(), getPoison());
}
}
class Flower extends Plant {
...
@Override
public String toString() {
return String.join(" ", super.toString(), getSmell(), getThorns());
}
}
class Weed extends Plant {
...
@Override
public String toString() {
return String.join(" ", super.toString(), getPoison(), getEdible(), getMedicinal());
}
}
你的循环将如下所示:
public static void displayPlant(ArrayList<Plant> plantList) {
for(Plant p : plantList)
System.out.println(p); // This calls toString
}
答案 1 :(得分:1)
实际上你是以错误的方式做到了,
一旦将子类的对象保存到父类变量中,那么在编译时它只搜索或查找在父类中声明的方法和变量。
如果你想访问子类变量,那么你需要首先找出子类,然后根据它进行类型转换
public static void displayPlant(ArrayList<Plant> plantList) {
for (int i = 0; i < plantList.size(); i++) {
Plant plant=plantList.get(i);
if (plant instanceof Flowers) {
Flowers fl=(Flowers)plant;
//TODO do whatever you want to do
}
else if(plant instanceof Weeds) {
Weeds wd=(Weeds)plant;
//TODO do whatever you want to do
}else if (plant instanceof Fungus) {
Fungus wd=(Fungus)plant;
//TODO do whatever you want to do
}
}
我希望它可以帮到你。感谢
答案 2 :(得分:0)
Java是strongly typed语言。这意味着,如果你想使用子类的方法,你必须{child} cast down到子类。
在你的例子中:
...
else if (plantList.get(i) instanceof Fungus) { //check if plant is fungus
System.out.print(plantList.get(i).getSmell());
System.out.print(((Fungus)plantList.get(i)).getThorns()); //downcasting
}
...
使用constains
进行检查无效。要检查对象的类型,您需要使用运算符instanceof
。