计算机语言中的语法糖——JAVA
计算机语言中的语法糖——JAVA
语法糖( Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言本身功能来说没有什么影响,只是为了方便程序员的开发,提高开发效率。
说白了,语法糖就是对现有语法的一个封装。
我们所熟悉的编程语言中几乎都会包含语法糖,当然 JAVA 也不例外。一般来说Java中的语法糖主要有以下几种:
泛型与类型擦除 自动装箱与拆箱 变长参数 增强for循环 内部类 枚举类
泛型与类型擦除
Java语言并不是一开始就支持泛型的。在早期的JDK中计算机语言中的语法糖——JAVA,只能通过类是所有类型的父类和强制类型转换来实现泛型的功能。强制类型转换的缺点就是把编译期间的问题延迟到运行时,JVM并不能为我们提供编译期间的检查。
在JDK1.5中,Java语言引入了泛型机制。但是这种泛型机制是通过类型擦除来实现的,即Java中的泛型只在程序源代码中有效(源代码阶段提供类型检查),在编译后的字节码中自动用强制类型转换进行替代。也就是说strip java,Java语言中的泛型机制其实就是一颗语法糖,相较与C++、C#相比,其泛型实现实在是不那么优雅。
/**
* 在源代码中存在泛型
*/
main( args) {
Map map = ();
map.put(“hello”,”你好”);
hello = map.get(“hello”);
.out.(hello);
当上述源代码被编译为class文件后,泛型被擦除且引入强制类型转换
main( args) {
map = (); //类型擦除
map.put(“hello”, “你好”);
hello = ()map.get(“hello”);//强制转换
.out.(hello);
自动装箱与拆箱
Java中的自动装箱与拆箱指的是基本数据类型与他们的包装类型之间的相互转换。
我们知道Java是一门面向对象的语言,在Java世界中有一句话是这么说的:“万物皆对象”。但是Java中的基本数据类型却不是对象strip java,他们不需要进行new操作,也不能调用任何方法,这在使用的时候有诸多不便。
因此Java为这些基本类型提供了包装类,并且为了使用方便,提供了自动装箱与拆箱功能。自动装箱与拆箱在使用的过程中,其实是一个语法糖,内部还是调用了相应的函数进行转换。
下面代码演示了自动装箱和拆箱功能:
main( args) {
a = 1;
int b = 2;
int c = a + b;
.out.(c);
经过编译后,代码如下
main( args) {
a = .(1); // 自动装箱
byte b = 2;
int c = a.() + b;//自动拆箱
.out.(c);
变长参数
所谓变长参数,就是方法可以接受长度不定确定的参数。变长参数特性是在JDK1.5中引入的,使用变长参数有两个条件,一是变长的那一部分参数具有相同的类型,二是变长参数必须位于方法参数列表的最后面。变长参数同样是Java中的语法糖strip java,其内部实现是Java数组。
{
t(… args) {
for( str : args){
.out.(str);
main( args) {

print(“hello”, “world”);
编译为class文件后如下,从中可以很明显的看出变长参数内部是通过数组实现的
{
() {
t(… args) {
var1 = args;
int var2 = args.;
//增强for循环的数组实现方式
for(int var3 = 0; var3 < var2; ++var3) {
str = var1;
.out.(str);
main( args) {
//变长参数转换为数组
print({“hello”, “world”});
增强for循环
增强for循环与普通for循环相比,功能更强并且代码更简洁。增强for循环的对象要么是一个数组,要么实现了接口。这个语法糖主要用来对数组或者集合进行遍历,其在循环过程中不能改变集合的大小。
main( args) {
= {“hello”,”world”};
//增强for循环对象为数组
for( str : ){
.out.(str);
List lists = .(“hello”,”world”);
//增强for循环对象实现接口
for( str : lists){
.out.(str);
编译后的class文件为
main( args) {
= {“hello”, “world”};
lists = ;
int var3 = .;
//数组形式的增强for退化为普通for
for(int str = 0; str < var3; ++str) {
str1 = lists;
.out.(str1);
List var6 = .({“hello”, “world”});
var7 = var6.();
//实现接口的增强for使用接口进行遍历
while(var7.()) {
var8 = ()var7.next();
.out.(var8);
内部类

内部类就是定义在一个类内部的类 Java语言中之所以引入内部类,是因为有些时候一个类只在另一个类中有用,我们不想让其在另外一个地方被使用。内部类之所以是语法糖,是因为其只是一个编译时的概念,一旦编译完成,编译器就会为内部类生成一个单独的class文件,名为outer$.class。
{
{
使用javac编译后计算机语言中的语法糖——JAVA,生成两个class文件:
Outer.class和Outer$Inner.class
其中Outer$Inner.class的内容如下:
$Inner{
Outer$Inner(Outer var1) {
this.this$0 = var1;
内部类分为四种:成员内部类、局部内部类、匿名内部类、静态内部类,每一种都有其用法。
枚举类型
枚举类型就是一些具有相同特性的类常量。java中类的定义使用class,枚举类的定义使用enum。在Java的字节码结构中,其实并没有枚举类型,枚举类型只是一个语法糖,在编译完成后被编译成一个普通的类。这个类继承java.lang.Enum,并被final关键字修饰。
{
APPLE,
使用jad对编译后的class文件进行反编译后得到:
//继承java.lang.Enum并声明为final
()
(Fruit)$.clone();
( s)
(Fruit)Enum.(Fruit, s);
( s, int i)
super(s, i);
//枚举类型常量
it APPLE;
it ;
uit $;//使用数组进行维护
APPLE = (“APPLE”, 0);
= (“”, 1);
$ = ( {
APPLE,
});
Java远不止这些语法糖,JDK7、JDK8添加的新特性都有很多高级的语法糖。
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299
资源库 - 资源分享下载网 » 计算机语言中的语法糖——JAVA
常见问题FAQ
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

