java - Java中的多态性错误:找不到符号
问题描述
我刚从书头开始学习面向对象编程,首先是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 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
确实是类的类型,它不应该知道其中声明的方法吗?
解决方案
使用多态性时,如果创建子类的实例并将其引用存储在超类类型的变量中,则只能在新创建的实例上调用超类中存在的那些方法。
在您的代码中,您创建了一个dog
类实例并将其引用存储在doggie
其中类型animal
(狗的超类),在这种情况下,您不能调用dog
类实例中不可用的任何方法animal
。
fetch
类中未定义方法,animal
因此您会收到错误消息。
解决方案
在类中定义fetch
方法animal
或者
改变
animal doggie = new dog();
至
dog doggie = new dog();
推荐阅读
- c# - 没有try-catch块的C#重新抛出异常
- r - 如何按原样从 tibble 转换为 dataframe?
- javascript - Webpack 横幅插件使用来自另一个插件的文件
- python - 从简历中提取姓名,然后更改简历中的姓名
- python-3.x - 如何使用 Selenium (Python) 抓取多个页面
- php - PHP中的date_format()不返回格式化的日期
- javascript - 在鼠标滚轮后防止鼠标滚轮 1 秒
- javascript - 如何访问 DataTables 构造函数中元素的属性?
- javascript - 如何更改引导日期时间选择器的语言(不是日期选择器)
- html - VSCode 扩展 webview 外部 html 和 css