Java中继承抽象类的子类无法正确调用父类方法是什么原因?
问题根因
1. 直接调用getName()报错的原因
你在Automat类中声明snickersStack时使用了原始类型Stack,没有指定泛型参数:
// 错误声明:未指定泛型,编译器默认top()返回Object类型 public Stack snickersStack;
此时snickersStack.top()的返回值会被编译器识别为Object类型,Object类本身没有定义getName()方法,因此直接调用会提示方法未声明。
2. super()调用报错的原因
super是Java中的关键字,只能在子类的实例方法、构造方法内部使用,用来访问父类的成员、调用父类构造方法,不支持通过实例对象以.super()的形式调用。
你写的snickersStack.top().super()属于语法错误,super()本身是子类构造方法中用来调用父类构造的语句,没有返回值(等效为void),因此后续再调用.getName()就会抛出void cannot be dereferenced错误。
修复方案
- 修正
Automat类中栈的声明,补充泛型参数:
public class Automat { // 补充泛型参数,明确栈存储的元素类型 public Stack<Snickers> snickersStack; public Stack<Mars> marsStack; public Automat() { snickersStack = new Stack<Snickers>(); marsStack = new Stack<Mars>(); } }
- 修改打印语句,删除错误的
.super()调用,直接调用getName()即可(Snickers继承了Item的所有public方法,getName()本身就是公开可访问的,不需要通过super额外调用):
// 调用前先判断栈非空,避免空指针异常 if (!snickersStack.isEmpty()) { System.out.println(snickersStack.top().getName()); }
内容的提问来源于stack exchange,提问作者gone
相关产品推荐
相关产品推荐

