• 构造器引用和直接用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

  • 相关阅读:
    MySQL全面瓦解20:可编程性之流程控制语句
    MySQL全面瓦解19:游标相关
    MySQL全面瓦解18:自定义函数
    MySQL全面瓦解17:触发器相关
    MySQL全面瓦解16:存储过程相关
    MySQL全面瓦解15:视图
    MySQL全面瓦解14:事务
    MySQL全面瓦解13:系统函数相关
    MySQL全面瓦解12:连接查询的原理和应用
    MySQL全面瓦解11:子查询和组合查询
  • 原文地址:https://www.cnblogs.com/lonecloud/p/8973312.html
Copyright © 2020-2023  润新知