[英]Overwrite a method from Java Stack class
我創建了自己的類“MyStack”,它繼承自 Stack 並存儲我在其他地方聲明的項目“MyItem”。
public class MyStack extends Stack<MyItem> {
private int pops = 0;
public MyStack() {
}
}
我想覆蓋方法pop()
並這樣做:
@Override
public MyItem pop() {
if (this.isEmpty()) {
return null;
}
pops++;
return this.super();
}
這不起作用,因為'java.util.Stack' is not an inner class
。
然后我嘗試使用pop()
代替:
@Override
public MyItem pop() {
if (this.isEmpty()) {
return null;
}
pops++;
return this.pop();
}
但是當pop()
調用pop()
時,我得到的是一個無限遞歸調用,因此是一個StackoverflowError
。
我不明白我應該如何覆蓋它。
我不確定你為什么要從 Stack 繼承,但你的覆蓋問題很簡單。 您應該使用super.pop() [調用父方法] 而不是this.pop() [調用此方法 == 遞歸調用]
@Override
public MyItem pop() {
if (this.isEmpty()) {
return null;
}
pops++;
return super.pop();
}
雖然您可以修復您的pop
方法,但我為您提供了一個更好的解決方案 - 完全停止使用java.util.Stack
。 這是一個設計不佳的古老遺物,因為它擴展了java.util.Vector
而不是封裝它。 這意味着我可以創建一個Stack
實例,填充它,然后開始從中間移除項目——因為它從Vector
繼承了諸如removeElementAt
之類的方法。
https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Stack.html上提到了更好的解決方案:使用Deque
。 根據文檔, push
、 pop
和peek
變為addFirst
、 removeFirst
和getFirst
,但我更喜歡addLast
、 removeLast
和getLast
。
與Stack.pop
一樣, Deque.removeFirst
和Deque.removeLast
如果為空則拋出異常。 但是, Deque
還帶有pollFirst
和pollLast
,它們返回null
。 這正是您要在這里實現的目標。
總結一下:將Deque
(和實現ArrayDeque
)與addLast
、 pollLast
和getLast
一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.