You need to enable JavaScript to run this app. Java基于继承实现栈的疑问:TODO实现要求与super、this用法
优惠活动
大模型
产品
解决方案
定价
更多

Java基于继承实现栈的疑问:TODO实现要求与super、this用法

对应问题的具体解答
  • 你目前完成的两个TODO实现都是符合要求的,不存在逻辑错误:
    • private int cursor = -1;的声明完全匹配TODO1的要求
    • 你写的super.add(item)可以正常完成入栈时的元素添加逻辑
  • 关于不同add调用写法的差异:
    • 在你当前的代码场景下,super.add(item)、this.add(item)、直接写add(item)三者的执行效果完全一致。Java的实例方法调用会自动沿着当前类→父类→父类的父类的顺序查找匹配的方法,由于你定义的Stack类目前没有重写任何add方法,三种写法最终都会定位到ArrayList继承来的原生add方法,所以注释才会说明显加super/this前缀是合法但冗余非必要的写法,你直接写add(item)完全可以正常运行。
    • 三者的行为差异会在你后续给Stack类重写add方法时显现:
      1. 直接写add(item)、this.add(item):会优先调用当前Stack类中重写的add版本,不会走父类的原生逻辑
      2. 写super.add(item):会强制跳过当前类的重写逻辑,直接执行父类ArrayList原本的add行为

      举个作业中非常常见的场景:后续要求你实现“栈仅能通过push方法添加元素,禁止外部任意调用add破坏栈的结构”,你一般会在Stack类里重写add方法,直接抛出不支持操作的异常:

      @Override
      public boolean add(T item) {
          throw new UnsupportedOperationException("请使用push方法完成元素入栈");
      }
      

      这个时候如果你的push方法里写的是无前置的add(item),运行时会直接触发你重写的逻辑抛出异常,根本没法完成入栈;只有写super.add(item),才能绕过重写的校验,正常调用父类的追加元素逻辑完成入栈。

  • 补充注意点:
    • 你声明的cursor变量目前还没有参与业务逻辑,后续作业一般会要求你在push时对cursor做自增、pop时对cursor做自减,peek操作时通过cursor定位栈顶元素,记得同步维护这个变量
    • 继承ArrayList实现栈的核心是利用ArrayList的动态数组存储能力,同时通过重写方法约束外部的非栈操作,避免破坏栈“先进后出”的特性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 01:15:02