You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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错误。

修复方案

  1. 修正Automat类中栈的声明,补充泛型参数:
public class Automat {
    // 补充泛型参数,明确栈存储的元素类型
    public Stack<Snickers> snickersStack;
    public Stack<Mars> marsStack;
    
    public Automat() {
        snickersStack = new Stack<Snickers>();
        marsStack = new Stack<Mars>();
    }
}
  1. 修改打印语句,删除错误的.super()调用,直接调用getName()即可(Snickers继承了Item的所有public方法,getName()本身就是公开可访问的,不需要通过super额外调用):
// 调用前先判断栈非空,避免空指针异常
if (!snickersStack.isEmpty()) {
    System.out.println(snickersStack.top().getName());
}

内容的提问来源于stack exchange,提问作者gone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:15:05