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

  • 相关阅读:
    Python Django 之 Template 模板语言简介
    Prometheus
    MySQL 存储过程中执行DDL
    Mysql 存储过程-转载
    Mysql 时间类型整理
    MySQL 5.7 分区表性能下降的案例分析
    Mysql 分区表-分区操作
    Mysql 中Left/Right join on后面and和where条件查询的差异-Mysql SQL运算符是有优先级
    MySQL出现Waiting for table metadata lock的原因以及解决方法
    Python 字符串转换为字典(String to Dict)
  • 原文地址:https://www.cnblogs.com/lonecloud/p/8973312.html
Copyright © 2011-2022 走看看