萬事用事實說話
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