簡體   English   中英

如何在Java中使用匿名類重載方法?

[英]How to overload a method using anonymous classes in Java?

我有一個類Action,它有一個叫做doAction()的方法。 此方法僅用於覆蓋我添加到名為allActions的操作列表的每個新操作。

public void doAction() {
    System.out.println("Overload this method.");
} 

操作列表存儲在以下列表中:

public static List<Action> allActions = new ArrayList<Action>();

並通過以下調用添加到此列表中:

allActions.add(
    new Action(id){
        public void doAction(Word w1, Word w2) {
            //perform some action
        }
    }
);

但是這段代碼對我不起作用。 當我嘗試從allActions列表中訪問覆蓋的doAction()方法時,它只執行默認方法。

我懷疑問題是allActions是一個Action對象列表,所以當它被添加到列表中時,類型可能會從匿名類更改,並恢復為默認方法。

有關如何維護Action類的不同匿名版本列表的任何想法? 我希望能夠根據給予操作的id調用這些不同的doAction()方法。

順便說一下,這是我第一次遇到匿名課程。 我理解這個概念,但實際上使用它們是另一個故事。

你正在使用public void doAction(Word w1, Word w2)但你在父級中有public void doAction() 因此不會覆蓋父方法。

實際上你正在重載方法doAction() 但我懷疑你可能會混淆重載覆蓋這兩個詞。

要使方法重載,請使用不同數量或類型的參數。 這使得同樣的方法做不同的事情取決於你怎么稱呼它(即哪些參數)。

有關重載的信息

要覆蓋方法,請使用相同數量和類型的參數,並且需要返回與重寫( super )方法相同的類型。 這使得不同的事情取決於在那里你怎么稱呼它(即從父或子類)同樣的方法做。

有關覆蓋的信息

public class Anonymous {
    static class Action {
        int id;
        Action(int id) {
            this.id = id;
        }
        void doAction(){
            System.out.println("Overload this method..."+ id);
        }
    }

    public static void main(String[] args) {
        ArrayList<Action> actions = new ArrayList<Action>();
        actions.add(new Action(0));
        actions.add(new Action(1){void doAction() {System.out.println("Overloading..."+ this.id);}});
        actions.add(new Action(2){void doAction() {System.out.println("Overloading..."+ this.id);}});
        for (Action a: actions) {
            a.doAction();
        }
    }
}

該代碼是關於如何維護Action類的不同匿名版本列表的簡單演示。 它有效。

您遇到的問題是您實際上沒有覆蓋doAction()方法。 相反,你重載了它。

當我嘗試從allActions列表中訪問覆蓋的doAction()方法時,它只執行默認方法。

這是因為匿名類的所有對象都使用了從Action類繼承的doAction()方法,而不是您錯誤地認為已覆蓋原始方法的doAction(Word w1, Word w2)方法。

提示:當您覆蓋某些方法時,請確保方法簽名保持一致。 一個例外是重寫方法可能具有重寫方法的子類型的返回類型。

您需要了解重寫方法和重載方法之間的區別。 在重載時,您可以使用相同的方法名稱但不同的參數列表和返回值,如果您願意,可以將它們全部放在同一個類中。 在重寫時,您擁有的子類具有完全相同的方法名稱,而不是基類中的方法。

您可能正在尋找的是所有實現相同接口的類列表。 例如,使用名為Action的接口,該接口包含不帶參數的方法和名為execute()的void返回類型。 然后創建每個類並讓它實現此接口。 在調用方法之前,使用構造函數或getter和setter設置對象的內部狀態。 execute方法只會針對您已經提供的狀態觸發您想要發生的活動。 然后將這些Action對象添加到接口類型列表中。

現在,您所要做的就是遍歷列表,為從列表中檢索的每個Action引用調用execute()方法。

但是這段代碼對我不起作用。 當我嘗試從allActions列表中訪問覆蓋的doAction()方法時,它只執行默認方法。

實際上,您還沒有覆蓋該方法。 你已經重載了...而且調用該方法的代碼顯然使用的是舊方法簽名。

僅當您將簽名保留為您要覆蓋的方法時才會覆蓋; 例如

new Action(id){
    public void doAction() {
        System.out.println("you just called the overload method");
    }
}

(問題不在於您對匿名類的理解。您可以了解覆蓋和重載之間的差異......以及了解在此上下文中應該使用哪些內容。)

暫無
暫無

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

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