[英]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()
。 因此不會覆蓋父方法。
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.