只能从方法访问Parent类变量

时间:2016-07-27 19:56:53

标签: java inheritance subclass superclass

所以我遇到的问题是这个。我已经编写了一个方法作为程序的一部分,我用它来显示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());
        }
    }
}

3 个答案:

答案 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