考虑下面的代码,
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()
的{{1}}方法,也没有在控制台中打印任何内容。
有人可以解释原因。
如果我没有使用方法参考" ::"并发表评论正常。
答案 0 :(得分:5)
此
Runnable r = DemoStatic::testStatic;
返回Runnable
,其run()
方法包含方法testStatic()
的正文,即
public static Runnable testStatic() {
return () -> {
System.out.println("Run");
};
}
所以
r.run();
基本上执行
return () -> {
System.out.println("Run");
};
删除return
值。
它是static
method reference。方法引用意味着您的Runnable
正在引用并执行功能接口定义的方法中的方法。
对于您想要的行为,您必须
Runnable r = testStatic();
答案 1 :(得分:5)
进一步扩展Sotirios'回答:
本声明:
Runnable r = DemoStatic::testStatic;
相当于
Runnable r = new Runnable() {
@Override
public void run() {
DemoStatic.testStatic();
}
}
因此r.run()
调用一个方法来调用testStatic()
以返回新 Runnable
,但之后不做任何操作。