04JVM_语法糖

2023-09-12 10:37:10

一、编译期处理

语法糖java编译器把*.java源码编译为*.class字节码的过程中,自动生成和转换的一些代码(添加的class字节码),减轻程序员的负担。

1.默认构造器

默认构造器没有写任何的构造方法,但经过编译器编译成字节码过程中,会加上调用父类Object的无参构造方法。调用java/lang/Object.”<init>”()V

2.自动拆装箱

①在JDK 5之前,基本类型int转换成包装类型Integer需要手动装箱

Integer x = Integer.valueOf(2);

包装类型Integer转换为基本类型int需要手动拆箱

int y = x.intValue();

②在JDK 5 之后,由编译器在编译阶段实现自动拆装箱

补充:

Integer在-128~127会复用对象。地址相同

3.泛型集合取值

1.泛型擦除

JDK5后,java在编译泛型代码后执行泛型擦除的动作,泛型信息都当作Object类型处理。

取值的时候会进行Object强制类型转换。

 

①当调用list.add(10)时,实际调用的是list.add(Object e)这个方法。把泛型信息当成Object处理

②当调用 Integer x = list.get(0),实际调用Object obj = list.get(int index)方法。最后Object类型转换为Integer。Integer x = (Integer)list.get(0)

③如果调用 int x = list.get(0)。类型转换是int x = ((Integer)list.get(0)).intValue();

2.泛型反射

局部变量类型表LocalVariableTable:方法内参数的泛型信息

只有方法参数方法返回值,带的泛型信息才能反射获取到。

 

4.可变参数

可变参数是JDK 5加入的特性,String... args其实是String []

调用foo(实参1,实参2)方法,编译器会根据实参的数量生成一个String数组new String[]{”hello”,”world”}

注意:

如果调用foo()无参方法,那么创建一个空的数组new String[]{},而不是传递null

4.foreach循环

数组循环,JDK 5 加入语法糖,按照下标区遍历的循环结构

①int[] array = {1, 2, 3, 4, 5};编译器转换

int[] array = new int[] {1, 2, 3, 4, 5};

②int e: array 编译器会转换为按照下标区遍历的循环结构。

集合循环

foreach循环被编译器转换为迭代器的调用 list.iterator()

注意:

foreach循环,配合数组和实现了Iterator()接口的集合类一起使用。

5.switch字符串

JDK7开始switch可以用字符串枚举类

switch配合字符串枚举类,变量不为null.编译后的字节码文件如下。

第一遍是根据字符串的hashCode和equals将字符串转换为byte类,第二遍根据byte进行比较。

 

 6.switch枚举

原始代码

 

 

转换后代码

①定义一个合成类,用来映射枚举的ordinal与数组关系

②枚举的ordinal表示枚举对象的序号,从0开始

③MALE的ordinal()=0,FEMALE的ordinal()=1

 

7.枚举类

JDK 7 新增

枚举类本质是class,枚举值是class的一个对象。

 转换后

 8.try-with-resources关闭资源处理

①JDK 7 开始,只要资源对象实现了AutoCloseable接口(文件输入输出流),使用try-with-resources不用写finally语句。编译器在finally会新增正常结束或者抛出异常的方法。

②设计一个addSuppressed(Throwable e)添加被压制异常的方法呢?

为了防止异常信息的丢失。

9.方法重写时的桥接方法

方法重写时返回值有2种情况

①子类的返回值跟父类一致

②子类的返回值是父类返回值的子类

对于子类的返回值是父类返回值的子类。编译器会自动生成一个重写父类的方法,采用桥接的方式

public synthetic bridge Number m()调用子类的方法,同时符合重写的规则。

10.匿名内部类

源代码 

转换后的代码

①生成一个额外的类Candy11$1实现Runnable接口。

 ②创建匿名内部类Candy11$1的对象

注意:

匿名内部类引用局部变量时,局部变量必须是final不可变的。因为编译器在创建匿名对象时,将复制给匿名对象的value属性,x就不能发生变化了,值固定住了。

更多推荐

浏览量5.54亿,“平替大军”击退“钱包刺客”?丨小红书消费趋势分析

当代年轻人的消费观念,从贷款买大牌的“精致穷”,逐渐演变为人间清醒式地购物...他们爱上麦当劳的“穷鬼套餐”,爱喝瑞辛9.9元畅饮,爱和小学生成为“饭搭子”吃小饭桌,爱买低价打折出售的剩菜盲盒,爱出门吃饭前先查看团购套餐,似乎所有省钱技巧都被他玩得轻车熟路。是大牌不香了吗?还是当代年轻人的消费趋势有了新的变化?本篇内容

《Python趣味工具》——自制emoji(4)计算机二级考试题

前面我们学习了如何制作emoji,相信你也是有很多想法了吧!今天我们就来看看几道计算机二级考试真题。1.绘制套圈使用turtle库的circle()函数和seth()函数绘制套圈。最小的圆圈半径为10像素,不同圆圈之间的半径差是40像素。ps:注意要和题目要求的圆形方向一致哦~可以在绘制前先将方向调整为90度。示例代码

Kubernetes介绍(一)

kubernetes官网:Kubernetes1、Kubernetes是什么Kubernetes也称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,k8s是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。Kubernetes可以实现以下功能:自动化容器的部署和复制

Swing程序设计详解(一)

【今日】“若你决定灿烂,山无遮,海无拦”目录初识Swing一Swing简述二Swing常用窗体2.1JFrame窗体2.2JDialog对话框2.3JOptionPane小型对话框(1)通知框(2)确认框(3)输入框(4)自定义对话框三常用布局管理器3.1绝对布局3.2流布局3.3边界布局3.4网格布局四常用面板4.1

如何实现不同MongoDB实例间的数据复制?

作为一种SchemaFree文档数据库,MongoDB因其灵活的数据模型,支撑业务快速迭代研发,广受开发者欢迎并被广泛使用。在企业使用MongoDB承载应用的过程中,会因为业务上云/跨云/下云/跨机房迁移/跨地域迁移、或数据库版本升级、数据库整合、数据库拆分、容灾等业务场景,存在MongoDB迁移或同步的业务诉求。在M

【CV、数据分析、AI产品经理】2024届校招岗位汇总

CV计算机视觉岗位数量公司岗位名称岗位职责截止日期1网易雷火人工智能算法工程师(虚拟交互/图形学和动画方向)岗位描述1.负责面向虚拟角色/虚拟人的创建(捏脸)和驱动(表情合成、动作捕捉和重定向、动作合成、舞蹈合成、物理模拟)等系统的设计和实现2.深度参与上述能力在游戏和泛娱乐产品(短视频、直播、虚拟偶像、VTuber)

【产品经理】深入B端SaaS产品设计核心理念

这几年各企业的B端业务都在做SaaS平台,但对SaaS的了解还不是完全全面,对于一些产品的定位以及设计还在探索中本文讨论“为什么采用SaaS模式”、“SaaS产品有哪些”以及“如何做好SaaS产品设计”三个话题,核心是产品设计,主要从需求定义、方案设计和开发交付3方面,共计讨论10个问题点。一、Why为什么要用SaaS

小谈设计模式(3)—策略模式

小谈设计模式(3)—策略模式专栏介绍专栏地址专栏介绍策略模式主要角色环境(Context)抽象策略(Strategy)具体策略(ConcreteStrategy)角色总结核心思想封装算法定义抽象策略使用环境类思想总结Java代码实现——以一个游戏角色攻击方式的例子首先,我们定义一个抽象策略类AttackStrategy

竞赛选题 基于机器视觉的手势检测和识别算法

0前言🔥优质竞赛项目系列,今天要分享的是基于深度学习的手势检测与识别算法该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!🧿更多资料,项目分享:https://gitee.com/dancheng-senior/postgraduate1实现效果废话不多说,先看看学长实现的效果吧2技术原理2.1手部检测主流的手势

Linux内核源码分析 (B.1)深入理解 Linux 虚拟内存管理

Linux内核源码分析(B.1)深入理解Linux虚拟内存管理文章目录Linux内核源码分析(B.1)深入理解Linux虚拟内存管理写在本文开始之前....1.到底什么是虚拟内存地址2.为什么要使用虚拟地址访问内存3.进程虚拟内存空间4\.Linux进程虚拟内存空间4.132位机器上进程虚拟内存空间分布4.264位机器

二刷力扣--二叉树(2)

226.翻转二叉树给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。使用递归解决。确定函数参数和返回值函数参数为当前节点cur。无返回值。defdd(cur):确定终止条件。当前节点为空则终止。ifnotcur:return单层逻辑反转当前节点的左右,然后递归调用cur.left,cur.rightdef

热文推荐