我刚开始从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();