構造器引用和直接用new創建對象區別
阿新 • • 發佈:2018-04-30
str args 執行 return 創建 [] $$ 引用 urn
萬事用事實說話
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
構造器引用和直接用new創建對象區別