[英]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.