构造器引用和直接用new创建对象区别
万事用事实说话
package cn.lonecloud; /** * @author lonecloud * @version v1.0 * @date 上午11:22 2018/4/30 */ public class RefDemo { static class Demo implements Runnable { @Override public void run() { System.out.println("run"); } } public static void main(String[] args) { Runnable runnable = Demo::new;//构造器引用
runable.run() System.out.println(runnable); Runnable demo=new Demo();//直接创建对象
demo.run() System.out.println(demo); } }
先看一段代码再说话,通过编译器编译,
先看看结果
cn.lonecloud.RefDemo$$Lambda$1/793589513@7291c18f cn.lonecloud.RefDemo$Demo@34a245ab
我们来看看字节码
通过
javap -c RefDemo
查看字节码
public class cn.lonecloud.RefDemo { public cn.lonecloud.RefDemo(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V//一系列加载动作 4: return public static void main(java.lang.String[]); Code: 0: invokedynamic #2, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;//构造器引用,没有new对象???? 5: astore_1 6: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream; 9: aload_1 10: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V//打印语句 13: new #5 // class cn/lonecloud/RefDemo$Demo//new创建对象 16: dup 17: invokespecial #6 // Method cn/lonecloud/RefDemo$Demo."<init>":()V//执行初始化 20: astore_2 21: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream; 24: aload_2 25: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V//打印 28: return }
从上面的可以看出::new 其实其并没有其并没有创建新对象执行init方法也就是初始化方法,尚待考证
关于invokedynamic
https://zhuanlan.zhihu.com/p/28124632