博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构造器引用和直接用new创建对象区别
阅读量:4322 次
发布时间:2019-06-06

本文共 1895 字,大约阅读时间需要 6 分钟。

万事用事实说话

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@7291c18fcn.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."
":()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."
":()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

 

转载于:https://www.cnblogs.com/lonecloud/p/8973312.html

你可能感兴趣的文章
revit api 使用过滤器
查看>>
几日工作记录
查看>>
linux下wc命令详解
查看>>
敏捷开发中软件测试团队的职责和产出是什么?
查看>>
在mvc3中使用ffmpeg对上传视频进行截图和转换格式
查看>>
python的字符串内建函数
查看>>
Spring - DI
查看>>
微软自己的官网介绍 SSL 参数相关
查看>>
Composite UI Application Block (CAB) 概念和术语
查看>>
64位MATLAB和C混合编程以及联合调试
查看>>
原生js大总结二
查看>>
PHP基础
查看>>
UVa 11488 超级前缀集合(Trie的应用)
查看>>
Django 翻译与 LANGUAGE_CODE
查看>>
[转]iOS教程:SQLite的创建数据库,表,插入查看数据
查看>>
【转载】OmniGraffle (一)从工具栏开始
查看>>
初识ionic
查看>>
java 中打印调用栈
查看>>
开发 笔记
查看>>
数据挖掘算法比赛 - 简单经验总结
查看>>