如何在Java中调用匿名类方法

时间:2013-12-10 17:13:53

标签: java

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。有没有办法调用这个方法。我不知道应该选择哪种方法来调用这个方法。

4 个答案:

答案 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()