package innerclasstest;
interface Demo {
}
class Bar {
public void call() {
Foo f = new Foo();
f.doStuff(new Demo() {
public void fall() {
System.out.println("In method args...");
}
});
}
}
class Foo {
public void doStuff(Demo demo) {
System.out.println("In stuff");
}
}
public class ClassArg {
public static void main(String[] args) {
Bar b = new Bar();
b.call();
}
}
在上面的例子中我们如何调用匿名类方法Fall。有没有办法调用这个方法。我不知道应该选择哪种方法来调用这个方法。
答案 0 :(得分:4)
你不能写的唯一理由
demo.fall();
是你没有在界面中宣布该方法。改变它:
interface Demo {
void fall();
}
然后它有效。
答案 1 :(得分:2)
如果你想用匿名类做不同的事情,你需要将它分配给一个变量,因为这个类是不可重用的。
类似的东西:
Demo extendedDemo = new Demo() {
public void fall() {
System.out.println("In method args...");
}
};
您可以使用它进行通话:
f.doStuff(extendedDemo);
如果在以下情况之后执行doStuff,则可以在声明时调用内部方法:
Demo extendedDemo = new Demo() {
public void fall() {
System.out.println("In method args...");
}
}.fall();
如果以后无法调用doStuff,可以使用反射调用内部方法:
Method m = extendedDemo.getClass().getMethod("fall", new Class[]{});
m.invoke(extendedDemo, new Class[]{});
答案 2 :(得分:1)
除了声明它们之外的任何地方都不能引用匿名类。要调用该方法,必须首先在接口中声明它。这是您的完整列表,界面稍微调整一下以使用该方法:
interface Demo {
public void fall();
}
class Bar {
public void call() {
Foo f = new Foo();
f.doStuff(new Demo() {
public void fall() {
System.out.println("In method args...");
}
});
}
}
class Foo {
public void doStuff(Demo demo) {
System.out.println("In stuff");
demo.fall();
}
}
public class ClassArg {
public static void main(String[] args) {
Bar b = new Bar();
b.call();
}
}
输出结果为:
在东西中 在方法args ......
请参阅http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
答案 3 :(得分:0)
在你的情况下:
public void doStuff(Demo demo) {
System.out.println("In stuff");
}
如果Demo接口提供demo.fall()
方法声明,则此方法中的调用fall()
。