簡體   English   中英

覆蓋 Java Stack 類中的方法

[英]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 根據文檔, pushpoppeek變為addFirstremoveFirstgetFirst ,但我更喜歡addLastremoveLastgetLast

Stack.pop一樣, Deque.removeFirstDeque.removeLast如果為空則拋出異常。 但是, Deque還帶有pollFirstpollLast ,它們返回null 這正是您要在這里實現的目標。

總結一下:將Deque (和實現ArrayDeque )與addLastpollLastgetLast一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM