编译器的语法糖

news/2025/3/19 11:35:31/文章来源:https://www.cnblogs.com/xiaoxianglu/p/18780704

编译器处理:

​ 语法糖:就是编译器把.java源码,编译为.class字节码的过程中,自动生成和转换的一些代码【减轻程序员的负担】。

  • 默认构造器【无参】:

    public class Cat{
    }
    // =>
    public class Cat {public Cat(){super();}
    }
    
  • 自动拆装箱:

    • 值在[-128, 127]会重缓冲区取值,不会new一个对象【Integer类维护了一个缓冲区】;
    {Integer x = 1;int y = x;
    }
    //=>
    {Integer x = Integer.valueOf(1);int y = x.intValue();
    }
    
  • 泛型集合取值:

    • java在编译泛型代码后会执行泛型擦除的动作,即泛型信息在编译为字节码阶段后,就丢失了。实际的类型都当作了Object类型来处理【但在取出操作时,字节码会多一个强制类型转换操作】;

      List<Integer> list = new ArrayList<>();
      list.add(10);
      Integer x = list.get(0);
      //=>
      Integer x = (Integer)list.get(0);
      
    • 泛型擦除,擦除的字节码上的泛型信息,但是可以又LocalVariableTypeTable仍然保留了泛型信息;

    • 使用反射获取不到局部变量的泛型信息,仅仅可以获取方法参数和返回值的泛型信息;

  • 可变参数:

    • 当传入无参的时候,会传入一个空的数组,而不会传入一个null【new String[]{},为了避免空指针异常】;
    String... args;
    //=>
    String[] args;
    
  • foreach循环

    • foreach和数组的配合使用,是使用下标取值;

      int[] array = {1, 2, 3, 4};
      for (int e : array) {System.out.print(e);
      }
      // =>
      int[] array = new int[]{1, 2, 3, 4};
      for (int i=0; i<array,length; i++) {int e = array[i];System.out.print(e);
      }
      
    • foreach和集合【Set,没有下标】的配合使用,是使用迭代器;

      List<Integer> list = Array.asList(1, 2, 3);
      for (Integer e : list) {System.out.print(e);
      }
      // =>
      List<Integer> list = Array.asList(1, 2, 3);
      Iterator iter = list.iterator();
      while (iter.hasNext()){Integer e = (Integer)iter.next();System.out.print(e);
      }
      
  • switch匹配

    • jdk7开始,switch才可以作用于字符串和枚举类【对应变量不能用空】;

    • String:一个switch匹配会产生两个switch;

      • 引入一个byte变量,通过第一个switch确定变量的值【通过,hasCode和equals方法已经比较】;
        • hasCode()是为了提高效率;
        • equals()是为了防止hash冲突;
      • 第二个switch通过byte变量值,选择具体应该执行的代码块;
      switch(str) {case "hello": {}case "world": {}
      }
      //=>
      byte x = -1;
      switch(str.hasCode()){case "hello".hasCode(): {if(str.equals("hello")){x = 0;}break;}case "world".hasCode(): {if (str.equals("world")) {x = 1;}break;}
      }
      switch(x) {case 0:{}case 1:{}
      }
      
    • enum:枚举类的switch匹配

      • 会在对应位置定义一个静态合成类【未命名】,因此仅jvm可见,
      • 通过枚举的ordinal()的值,和数组进行映射;
      enum Sex {MALE, FEMALE;
      }switch(sex) {case MALE:{}case FEMALE:{}
      }
      // =>
      static class $MAP{static in[] map = new int[2];static {map[Sex.MALE.ordinal] = 1;map[Sex.MALE.ordinal] = 2;}
      }
      int x = $MAP.map(sex.ordinal());
      switch(x) {case 1:{}case 2:{}
      }
      
  • 枚举类:

    enum Sex{MELE, FEMMALW;
    }
    //=>
    public final class Sex extends Enum<Sex> {public static final Sex MALE;public static fianl Sex FEMALE;private static final Sex[] $VALUES;static {MALE = new Sex("MALE", 0);FEMALE = new Sex("FEMALE", 1);$VALUES = new Sex[]{MALE, FEMALE};}private Sex(String name, int ordinal) {super(name, ordinal);}public static Sex[] values(){return $VALUES.clone();}public static Sex valueOf(String name) {return Enum.valueOf(Sex.class, name);}
    }
    
  • try-with-resources

    • jdk7开始新增了对关闭资源处理的特殊语法;

    • 资源对象需要实现 AutoClaseable接口;

    • 可以同时保留资源操作异常和资源关闭异常;

      try(资源变量 = 创建资源对象){
      }
      catch(){   
      }
      //相当于python的with,自动关闭;
      //eg:
      try(InputStream is = new FileInputStream(file)) {System.out.println(is);
      }catch(Exception e) {e.printStackTrace();
      }
      // =>
      try{InputStream is = new FileInputStream(file);Throwable t = null;    //增加临时局部变量,为了后续判断;try {System.out.println(is);}catch (Throwable e1) {  //try{}的资源处理代码块出现异常;t = e1;throw e1;}finally{if (is != null) {  // 为null,不用释放资源if (t != null) { // 资源处理代码块出现异常,此时至少有一个异常;try{is.close();}catch (Throwable e2) {//保留资源操作异常和资源关闭异常,最后通过throw e1抛出,e1和t是同一个对象;t.addSuppressed(e2);}}else {is.close;  //资源处理代码块出现没有异常时,当关闭资源出现异常时,会被Exception捕获【仅仅一个异常】}}}
      }catch(Exception e){  		//这部分没变;e.printStackTrace();
      }
      
  • 方法重写时的桥接方法:

    • 方法重写时候的返回值分两种情况:

      • 子类父类的返回值相同;

      • 子类的返回值是父类返回值的子类;

        • synthetic bridge方法仅虚拟机可见,并且没有命名冲突,可以通过反射验证;
        //父类方法
        public Number m(){return 1;
        }
        //子类方法
        @OVerrider
        public Integer m(){return 2;
        }
        // 编译器=> 
        public Integer m(){return 2;
        }
        // 这个方法才是正真重写了父类 pblic Number m()方法;
        public systhetic bridge Number m(){return m();
        }
        
  • 匿名类内部类

    • 匿名内部类会被编译器创建类;
    • 因此也解释了匿名内部类引用局部变量时,局部变量必须时final的,因为一旦创建,内部类的变量和外部类的变量就是两个变量,只是值相同;
    class A {final int x = 10;Runnable runnable = new Runnable(){@Overridepublic void run(){System,out.println(x);}}
    }
    //=>
    final class A$1 implements Runnable {int val$x;A$1(int x) {this.val$x = x;}public void run() {System.out.println(this.val$x);}
    }
    public class A{final int x = 10;Runnable runnable = new A$1(x);
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901443.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Azure Fabric Service】分享使用Visual Studio 2022发布中国区Service Fabric服务应用的办法

问题描述 使用Visual Studio 2022如何发布Service Fabric到中国区云服务呢? 因为使用VS2022中的插件无法创建Service Fabric Cluster服务。那么,是否又比较好的替代方案呢?问题解答 是的,有替代方案。 除了昨天介绍使用的Powershell命令外( 【Azure Fabric Service】演示使…

如何让GameObject销毁时无论是否Active过,都调用OnDestroy

1)如何让GameObject销毁时无论是否Active过,都调用OnDestroy2)升级到URP画面会提升吗3)如何用Dynamic Mesh做出在墙上打洞的效果4)UE可以把烘焙好的光照贴图导出吗这是第424篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力…

测序芯片-不同键合工艺对比-flowcell-代加工-外协加工-委外加工-激光代加工-河南郑州-芯晨微纳(河南)

基因测序(包括DNA测序和RNA测序)是研究生命信息的重要方法之一。DNA测序(DNA sequencing,或译DNA定序)是指分析特定DNA片段的碱基序列, 也就是腺嘌呤(A)、胸腺嘧啶(T)、胞嘧啶(C)与鸟嘌呤(G)的排列方式。同理,RNA测序是指分析特定RNA片段的碱基序列,也就是腺嘌呤(A)、鸟嘌呤…

Go语言内存管理机制解析

引言 Go语言以高并发性能和简洁的内存管理著称,其独特的内存分配机制在保证开发效率的同时,实现了接近C/C++的性能。本文将深入剖析Go的内存管理设计,结合内存逃逸、多级缓存池、无锁化分配等核心机制,揭示其高效运作的秘密。 参考文档 https://www.bilibili.com/video/BV1…

HTTP响应拆分漏洞——CRLF注入漏洞

CRLF漏洞 CRLF注入漏洞:web应用没有对用户输入做严格过滤,导致攻击者可以输入一些恶意字符,攻击者向请求行或首部中的字段注入恶意的CRLF,就能注入一些首部字段或报文主题,并在响应中输出。 HTTP报文中,HTTP header之间是由一个CRLF字符序列分隔开的,HTTP Header 与Body…

图案化CCD视觉精密点胶技术-flowcell-代加工-外协加工-委外加工-激光代加工-河南郑州-芯晨微纳(河南)

图案化视觉点胶技术(Patterned Vision Dispensing Technology)是一种结合高精度点胶工艺与机器视觉系统的先进制造技术,能够根据预设的图案或路径精确分配胶水、导电浆料、封装材料等流体,广泛应用于电子封装、微纳制造、生物芯片等领域。技术原理视觉定位:通过高分辨率摄…

充电桩消防火焰检测系统

充电桩消防火焰检测系统的核心在于其强大的识别能力,充电桩消防火焰检测系统一旦检测到火焰或烟雾,系统会立即启动一系列自动响应机制。首先,自动灭火系统会被触发,根据充电桩的具体环境和安全规范,选择合适的灭火方式,如气体灭火或水喷淋系统。这种即时干预能够在火势初…

助你玩转——4G模组Air780EPM的GPIO设计~

本文将结合Air780EPM的硬件架构与软件框架,从管脚分配、电气特性、复用机制、代码开发四个维度,深入解析GPIO设计的全流程要点,为开发者提供从理论到实践的完整技术指南。 一、概述 开发方式:Air780EPM 仅支持 LuatOS 软件开发方式,不支持 AT 指令开发方式。若使用 AT 指令…

【Java】XxlJob入门

xxl-job概念 xxlJob是轻量级的可视化分布式任务调度平台,适用于中小型企业。主要特性如下:简单、动态、轻量级、支持弹性扩容缩容、事件全异步执行、跨语言。 调度中心和执行任务解耦 调度任务支持多种不同场景的路由策略、容错策略、触发策略 运维更便捷环境准备和部署 Gith…

快速掌握!4G模组:Air780EPM 天线设计说明

天线设计,也是4G模组应用中最容易踩坑的地方。今天主要分享讨论Air700ECQ/EAQ/EMQ系列模组,天线管脚到4G天线之间的电路设计和走线规则。 Air700ECQ/EAQ/EMQ模组属于Cat.1 bis R13架构,天线架构精简为单天线架构,去掉了分集接收天线,因此只需要一根天线。 知识点: Cat.1 …

24级数应二班课堂作业2

2024010068 刘晓津 几年几月多少天year = int(input("请输入年份: ")) month = int(input("请输入月份: "))if month in [1, 3, 5, 7, 8, 10, 12]:days = 31 elif month in [4, 6, 9, 11]:days = 30 elif month == 2:if (year % 4 == 0 and year % 100 != …