java里面的语法糖(糖衣语法)

本文详细介绍了Java中的语法糖,包括泛型、自动装箱拆箱、变长参数、内部类、枚举等,并解析了它们在编译阶段如何被转化为基础语法结构。例如,泛型在编译后会进行类型擦除,自动装箱和拆箱是通过Integer.valueOf和xxxValue方法实现。此外,文章还讨论了lambda表达式、for-each循环和try-with-resource语句的实现原理。
摘要由CSDN通过智能技术生成

语法糖是一种用来方便程序员代码开发的手段,简化程序开发,但是不会提供实质性的功能改造,但可以提高开发效率或者语法的严谨性或者减少编码出错的机会。
总而言之,语法糖可以看作是编译器实现的一种小把戏。

语法糖的存在主要是方便开发人员使用。但其实,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。

说到编译,大家肯定都知道,Java语言中,javac命令可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。

如果你去看com.sun.tools.javac.main.JavaCompiler的源码,你会发现在compile()中有一个步骤就是调用desugar(),这个方法就是负责解语法糖的实现的。

Java 中最常用的语法糖主要有泛型、变长参数、条件编译、自动拆装箱、内部类等

1.泛型和类型擦除
泛型的本质是参数化类型,也就是操作的数据类型本身也是一个参数。这种参数类型可以用在类,接口,方法中,分别叫泛型类,泛型接口,泛型方法。

但是java的泛型是一个语法糖,并非是真实泛型,只在源码中存在,List和List 在编译之后,就是List 并在相应的地方加上了类型转换代码。这种实现方式叫类型擦除,也叫伪泛型。
但是在 C#里面的是真实泛型,List和List就是两个不同的类型。
在java里面 ,如果同一个类的两个方法名称相同,参数分别为List和List,是无法重载的,泛型擦除之后都是 List ,重载需要方法签名不同。

但是,擦除法所谓的擦除,仅仅是对方法的code属性中的字节码进行擦除,实际上元数据中还是保留了泛型信息,这也是我们能通过反射手段获取参数化类型的根本依据。

泛型
在这里插入图片描述
实际上
在这里插入图片描述

2.自动装箱和遍历循环

在这里插入图片描述
实际上
在这里插入图片描述

自动装箱用了Integer.valueOf
for循环用了迭代器

3.变长参数 实际上是数组
在这里插入图片描述

除了泛型,for,可变长参数等语法糖之外
还有内部类,枚举,断言,对枚举和字符串对switch支持,try语句中定义和关闭资源等。

内部类是生成了外部类类名$内部类类名的的类
在这里插入图片描述
在这里插入图片描述

枚举
在这里插入图片描述

实际上是继承自称Enum的final类
在这里插入图片描述

switch 支持 String 与枚举
从Java 7 开始,Java语言中的语法糖在逐渐丰富,其中一个比较重要的就是Java 7中switch开始支持String。

在开始coding之前先科普下,Java中的swith自身原本就支持基本类型。比如int、char等。

对于int类型,直接进行数值的比较。对于char类型则是比较其ascii码。

所以,对于编译器来说,switch中其实只能使用整型,任何类型的比较都要转换成整型。比如byte。short,char(ackii码是整型)以及int。

那么接下来看下switch对String得支持,有以下代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值