我刚从书头开始学习面向对象编程,首先是java。它说多态使我能够创建超类类型的数组,然后将所有子类作为数组元素。但是当我尝试使用相同的代码编写代码时原则它遇到错误,说 error: cannot find symbol 我将超类设为动物的类,而狗类扩展了具有自己的 fetch 方法的动物类,但是当我将狗变量引用为动物时,它在这里不起作用是代码动物类: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 symboldoggie.fetch(); ^symbol: method fetch()location: variable doggie of type animal1 error编辑:上次我问这个问题时,我回家时认为该对象doggie属于该类型animal,并且它不知道fetch()已在dog类中声明的函数。但是添加行System.out.println(doggie.getClass().getName()); 给出dog作为类的类型,如果dog确实是类的类型,它不应该知道其中声明的方法吗?
3 回答
呼啦一阵风
TA贡献1802条经验 获得超6个赞
使用多态性时,如果创建子类的实例并将其引用存储在超类类型的变量中,则只能在新创建的实例上调用超类中存在的那些方法。
在您的代码中,您创建了一个dog
类实例并将其引用存储在doggie
其中类型animal
(狗的超类),在这种情况下,您不能调用dog
类实例中不可用的任何方法animal
。
fetch
类中未定义方法,animal
因此您会收到错误消息。
解决方案
在类中定义fetch
方法animal
或者
改变
animal doggie = new dog();
到
dog doggie = new dog();
萧十郎
TA贡献1815条经验 获得超13个赞
您正在引用doggie.fetch(),但这不是动物中定义的方法。
由于您将doggie对象用作动物,因此不能使用此方法。
如果您想使用该方法,可以执行实例检查之类的操作:
if(doggie instanceOf dog){
((dog)doggie).fetch();
}
添加回答
举报
0/150
提交
取消