zoukankan      html  css  js  c++  java
  • 构造器引用和直接用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

  • 相关阅读:
    钉钉扫码登录前端页面实现
    本地开发的jar包放到本地maven仓库
    mybatise 设置全局变量实例
    版本控制器:Git
    PIP安装源
    Django跨域问题
    vue项目开发安装流程
    浅谈CSRF(Cross-site request forgery)跨站请求伪造(写的非常好)
    explicit抑制隐型转换
    拷贝构造函数
  • 原文地址:https://www.cnblogs.com/lonecloud/p/8973312.html
Copyright © 2011-2022 走看看