我刚开始从Java的头开始学习面向对象的编程,它说多态使我能够创建父类(super class)类型的数组,然后将所有子类作为数组元素,但是当我尝试使用相同的代码编写代码时原理出错了error: cannot find symbol我将类设置为父类(super class)是动物,而狗类使用自己的获取方法扩展了动物类,但是当我将dog变量引用为动物时,代码在这里不起作用
动物类:

public class animal{

    String family;
    String name;

    public void eat() {
        System.out.println("Ghap Ghap");
    }

    public void roam() {
        System.out.println("paw paw");
    }

}
狗类:
public class dog extends animal {
    public void fetch() {
        System.out.println("Auoooooooo");
    }
}
测试器类:
public class tester {

    public static void main(String args[]){
        animal doggie = new dog();
        doggie.fetch();
        doggie.eat();
        doggie.roam();
    }

}
错误:
tester.java:4: error: cannot find symbol
doggie.fetch();
      ^
symbol:   method fetch()
location: variable doggie of type animal
1 error
编辑:上次我问这个问题时,我回家考虑对象doggie的类型为animal,并且它对fetch()类中已声明的dog函数一无所知。但是增加线
System.out.println(doggie.getClass().getName());
给出dog作为类的类型,如果dog确实是该类的类型,则它是否不应该了解其中声明的方法

最佳答案

使用多态时,如果创建子类的实例并将其引用存储在父类(super class)类型的变量中,则只能在新创建的实例上调用那些在父类(super class)中存在的方法

在您的代码中,您创建了dog类的实例并将其引用存储在doggie中,该引用的类型为animal(dog的父类(super class)),在这种情况下,您无法在dog类实例上调用任何在animal类。
fetch类中未定义animal方法,因此会出现错误。

解决方案

fetch类中定义animal方法

或者

改变

animal doggie = new dog();


dog doggie = new dog();

09-30 17:32
查看更多