1

考虑下面的代码,

class DemoStatic {
    public static Runnable testStatic() {
        return () -> {
            System.out.println("Run");
        };
    }

    public void runTest () {
        Runnable r = DemoStatic::testStatic;
        r.run();
    }
}

public class MethodReferenceDemo {
    public static void main(String[] args) {
        DemoStatic demo = new DemoStatic();
        demo.runTest();
    }
}

run()通过方法返回的Runnable实例testStatic方法应该被调用。控制台上的输出应该是“运行”。

但是这段代码没有调用run()实例方法,r控制台中也没有打印任何内容。

有人可以解释一下原因。

如果我没有正确使用方法参考“::”并发表评论。

4

2 回答 2

5

这个

Runnable r = DemoStatic::testStatic;

返回一个Runnablerun()方法包含方法体的方法testStatic(),即。

public static Runnable testStatic() {
    return () -> {
        System.out.println("Run");
    };
}   

所以

r.run();

基本上执行

return () -> {
    System.out.println("Run");
};

降低return价值。

这是一个static 方法参考。方法引用意味着您Runnable正在引用和执行功能接口定义的方法中的方法。


对于你想要的行为,你必须做

Runnable r = testStatic();
于 2014-04-11T21:34:53.020 回答
5

扩展一下 Sotirios 的回答:

这个说法:

Runnable r = DemoStatic::testStatic;

相当于

Runnable r = new Runnable() {
    @Override
    public void run() {
        DemoStatic.testStatic();
    }
}

所以r.run()调用了一个方法,该方法调用testStatic()返回一个new Runnable,但随后什么也不做。

于 2014-04-11T21:40:31.223 回答