Java中Lambda构造方法引用与new创建Runnable的执行差异咨询
问题解析:构造方法引用与直接实例化的Runnable差异
这问题的核心在于你误解了构造方法引用作为函数式接口实现时的行为,咱们一步步拆解清楚:
1. Demo::new到底实现了什么?
Runnable是个函数式接口,要求实现void run()方法(无参、无返回值)。当你写Runnable runnable = Demo::new;时,Java会把Demo的无参构造方法适配成Runnable的run方法,等价于下面的Lambda表达式:
Runnable runnable = () -> { // 仅仅是创建了一个Demo实例,根本没调用它的run方法! new Demo(); };
所以当你调用runnable.run()时,实际执行的是new Demo()——也就是触发Demo构造方法里的打印逻辑(比如输出类似RefDemo$Demo@xxxx-----的内容),但并不会自动调用这个新创建的Demo实例的run方法。这就是你觉得“无任何执行效果”的原因(其实是没看到预期的"run"输出)。
2. new Demo()的实例为什么能正常执行run?
Demo类本身就实现了Runnable接口,并且重写了run()方法。当你用new Demo()创建实例时,这个实例本身就是一个标准的Runnable,它的run()方法就是你写的那个打印"run"的逻辑。所以调用demo.run()时,直接执行了重写后的方法,自然会输出预期内容。
3. 怎么让构造方法引用的Runnable也触发run逻辑?
如果想通过构造方法引用实现调用Demo的run方法,你需要显式在逻辑里调用,比如:
Runnable runnable = () -> { new Demo().run(); };
内容的提问来源于stack exchange,提问作者lonecloud
相关产品推荐
相关产品推荐

