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方法时显现:
- 直接写
add(item)、this.add(item):会优先调用当前Stack类中重写的add版本,不会走父类的原生逻辑 - 写
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_
相关产品推荐
相关产品推荐

