繁体   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