如何在Java中使用匿名类重载方法?

Jos*_*osh 2 java overriding overloading anonymous-class

我有一个类Action,它有一个叫做doAction()的方法.此方法仅用于覆盖我添加到名为allActions的操作列表的每个新操作.

public void doAction() {
    System.out.println("Overload this method.");
} 
Run Code Online (Sandbox Code Playgroud)

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

public static List<Action> allActions = new ArrayList<Action>();
Run Code Online (Sandbox Code Playgroud)

并通过以下调用添加到此列表中:

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

但是这段代码对我不起作用.当我尝试从allActions列表中访问覆盖的doAction()方法时,它只执行默认方法.

我怀疑问题是allActions是一个Action对象列表,所以当它被添加到列表中时,类型可能会从匿名类更改,并恢复为默认方法.

有关如何维护Action类的不同匿名版本列表的任何想法?我希望能够根据赋予操作的id调用这些不同的doAction()方法.

顺便说一下,这是我第一次遇到匿名课程.我我理解这个概念,但实际上使用它们是另一个故事.

ssk*_*ssk 7

你正在使用,public void doAction(Word w1, Word w2)但你有public void doAction()父母.因此不会覆盖父方法.


The*_*111 6

你实际上正在重载该方法doAction().但我怀疑你可能会混淆重载覆盖这两个词.

要使方法重载,请使用不同数量或类型的参数.这使得同样的方法做不同的事情取决于如何你怎么称呼它(即哪些参数).

有关重载的信息

要覆盖方法,请使用相同数量和类型的参数,并且需要返回与overridden(super)方法相同的类型.这使得不同的事情取决于同样的方法做在那里你怎么称呼它(即从父或子类).

有关覆盖的信息


Ter*_* Li 6

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码是关于如何维护Action类的不同匿名版本列表的简单演示.它有效.

您遇到的问题是您实际上没有覆盖该doAction()方法.相反,你重载了它.

当我尝试从allActions列表中访问覆盖的doAction()方法时,它只执行默认方法.

这是因为匿名类的所有对象都使用doAction()从Action类继承的doAction(Word w1, Word w2)方法,而不是您错误地认为已覆盖原始方法的方法.

提示:当您覆盖某些方法时,请确保方法签名保持一致.一个例外是重写方法可能具有重写方法的子类型的返回类型.