Java继承Stack类重写pop()方法报错的正确实现方法
错误原因
两种错误写法的本质是对Java父类方法调用的语法理解有误:
this.super()属于非法语法:super是指向当前实例父类部分的关键字,调用父类成员方法的固定语法为super.方法名(),不存在this.super()的写法,这也是报错'java.util.Stack' is not an inner class的直接原因。this.pop()会直接调用当前类中你重写后的pop()方法,逻辑上形成自调用闭环,触发无限递归,最终抛出StackOverflowError。
正确重写方式
需要调用父类Stack原生的pop实现时,直接使用super.pop()即可,修正后的代码如下:
public class MyStack extends Stack<MyItem> { private int pops = 0; public MyStack() { } @Override public MyItem pop() { if (this.isEmpty()) { return null; } pops++; return super.pop(); } /** * 可选:提供弹出次数的查询方法 */ public int getPopCount() { return pops; } }
额外提示:
java.util.Stack是JDK早期遗留的实现类,继承自Vector,所有操作都带synchronized同步锁,性能较差,官方更推荐在生产环境使用ArrayDeque作为栈结构的实现,通过组合而非继承的方式做自定义扩展。如果只是练习继承重写语法,上述写法完全符合Java语法规范。
内容的提问来源于stack exchange,提问作者InspiredCat
相关产品推荐
相关产品推荐

