概述

  语法糖(Syntactic Sugar):主要作用是提高编码效率,减少编码出错的机会。

  解语法糖发生在Java源码被编译成Class字节码的过程中,还原回简单的基础语法结构。

语法糖之一:泛型(Generics)

  Java中的泛型又称为类型擦除,它只在Java源码中存在,被编译成字节码后,就已经替换为原生类型了,并在相应的地方加入强制类型转换。

  例如:

public class GenericTypes {
/*
* 两个mothod1方法不能被编译,因为List<Integer>和List<String>被编译成class文件后都被擦除了,
* 变成了一样的原生类型List<T>,擦除之后两个方法的签名一样。
*/
public static void mothod1(List<Integer> list) { }
public static void mothod1(List<String> list) { } /*
* 在jdk1.7
* 两个mothod2方法不能被编译,因为List<Integer>和List<String>被编译成class文件后都被擦除了,
* 变成了一样的原生类型List<T>,擦除之后两个方法的签名一样。返回值不参与重载选择
*
* Sun JDK1.6中Javac才能编译成功
* 在Class文件格式中,只要描述符不是完全一致的两个方法就可以共存。
*/
public static String mothod2(List<String> list) {
return "";
}
public static Integer mothod2(List<Integer> list) {
return 1;
}
}

语法糖之二:自动拆箱和装箱、Foreach、变长参数

  例如:

public class Foreach_Varargs {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4);//变长参数(Varargs)
int sum = 0;
for(int i : list) { //遍历循环Foreach
sum += i;
}
System.out.println(sum);
}
/*
* 反编译之后的代码
* 1、变长参数还原为数组类型的参数:Arrays.asList(...) ----> new Integer[]{...}
* 2、Foreach还原为迭代器实现
* 3、自动拆箱和装箱还原为Integer.valueOf()和Integer.intValue()方法
*
public static void main(String[] args) {
java.util.List<Integer> list = java.util.Arrays.asList(new Integer[] {
Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3),
Integer.valueOf(4) });
int sum = 0;
for (Iterator localIterator = list.iterator(); localIterator.hasNext();) {
int i = ((Integer) localIterator.next()).intValue();
sum += i;
}
System.out.println(sum);
}
*/
}

  一个更复杂的自动装箱拆箱的栗子:

public class Autoboxing {
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
System.out.println(c == d); //(1)
System.out.println(e == f); //(2)
System.out.println(c == (a + b)); //(3)
System.out.println(c.equals(a + b)); //(4)
System.out.println(g == (a + b)); //(5)
System.out.println(g.equals(a + b)); //(6)
}
/*
* 反编译后的代码
*
* 包装类的“==”运算在不遇到算数运算的情况下不会自动拆箱;
* equals方法不处理数据转型的关系。
*
* 在 Java 中,== 比较的是对象引用,而 equals 比较的是值。
*
* 一、(1)为true,(2)为false原因:
* IntegerCache:把-128到127(可调)的整数都提前实例化了,不管创建多少个这个范围内的Integer用ValueOf出来的都是同一个对象;
* 用来节省内存和提高性能。这种 Integer缓存策略仅在自动装箱(autoboxing)的时候有用,使用构造器创建的 Integer 对象不能被缓存。
* 这个缓存会在 Integer 类第一次被使用的时候被初始化出来.是什么原因选择这个 -128 到 127 这个范围呢?因为这个范围的整数值是使用最广泛的。
* Byte,Short,Long 有固定范围: -128 到 127。对于 Character, 范围是 0 到 127。除了 Integer 可以通过参数改变范围外,其它的都不行
*
* 不在缓存范围的会新new Integer对象。
* 二、(3)为true,(5)为true
* 自动拆箱,相当于数值类型int
* 三、(4)为true
* a,b先拆箱计算数值和,再将计算结果装箱为Integer
* 四、(5)为false
* g为Long类型,a + b为Integer,类型不一致
* 五、(6)为false, g为Long类型,a + b为Integer,类型不一致,返回false
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
*
public class Autoboxing {
public static void main(String[] args) {
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(2);
Integer c = Integer.valueOf(3);
Integer d = Integer.valueOf(3);
Integer e = Integer.valueOf(321);
Integer f = Integer.valueOf(321);
Long g = Long.valueOf(3L);
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c.intValue() == a.intValue() + b.intValue());
System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));
System.out.println(g.longValue() == (long)(a.intValue() + b.intValue()));
System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));
}
}
*/
}

语法糖之三:条件编译

  栗子:

public class ifdef {
public static void main(String[] args) {
final boolean isCompile = true;
if(isCompile) {
System.out.println("11111");
} else {
System.out.println("2222");
}
}
/*
* 条件编译
* System.out.println("2222"); 不会编译
* Java只能实现语句基本块级别的条件编译,而无法实现根据条件调整整个Java类的结构。
*
* 反编译后的代码:
* public class ifdef {
public static void main(String[] args) {
boolean isCompile = true;
System.out.println("11111");
}
}
*/
}

除以上外,语法糖还有:内部类、枚举类、断言语句、对枚举和字符串的switch支持(1.7)、try语句中定义和关闭资源(1.7)等,接下来继续Java语法糖系列。

  

Java语法糖(一)的更多相关文章

  1. Java语法糖1:可变长度参数以及foreach循环原理

    语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...

  2. Java语法糖设计

    语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这 ...

  3. java语法糖---枚举

    java语法糖---枚举   在JDK5.0中提供了大量的语法糖,例如:自动装箱拆箱.增强for循环.枚举.泛型等.所谓“语法糖”就是指提供更便利的语法供程序员使用,只是在编译器上做了手脚,却没有提供 ...

  4. Java语法糖(二)

    语法糖之四:内部类 内部类:顾名思义,在类的内部在定义一个类.内部类仅仅是编译时的概念,编译成字节码后,内部类会生成单独的Class文件. 四种:成员内部类.局部内部类.匿名内部类.静态内部类. 1. ...

  5. Java语法糖4:内部类

    内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功 ...

  6. 转:【深入Java虚拟机】之六:Java语法糖

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/18011009 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家P ...

  7. 早期(编译器)优化--Java语法糖的味道

    1.泛型与类型擦除 泛型的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口和泛型方法.在泛型没有出现之前,只能通过 ...

  8. Java 语法糖详解

    语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法. 这种语法对语言的功能并没有影响,但是 ...

  9. JVM总结-Java语法糖与Java编译器

    自动装箱与自动拆箱 首先要提到的便是 Java 的自动装箱(auto-boxing)和自动拆箱(auto-unboxing). 我们知道,Java 语言拥有 8 个基本类型,每个基本类型都有对应的包装 ...

随机推荐

  1. JavaScript两种创建标签的的方法,实现点击按钮让text自增

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 第三章JavaScript 内置对象

    1 Number 1.1 属性 MAX_VALUE JS可以表示的最大的数字 MIN_VALUE JS可以表示的最小的数字 1.2 方法 toFixed(length) 指定保留长度的小数 toExp ...

  3. ATM-core-src

    from interface import bank, shopping, userfrom lib import common user_data = { 'name': None} def log ...

  4. Laravel 命令行常用命令

    一.简介 1.Artisan 是 Laravel 自带的命令行接口名称,它为我们在开发过程中提供了很多有用的命令.想要查看所有可用的Artisan命令,可使用list命令: php artisan l ...

  5. cut(树形DP)

    Description F大爷热爱切树.今天他找到一棵黑白树,不到两秒钟,F大爷就把这棵树切掉了.已知原先树上共n个点,每个点都是黑点或者白点,F大爷切去若干条边后,分成的若干个连通子树中每块恰有一个 ...

  6. unity安装记录

    官网直接下载(http://unity3d.com/cn/) 下载完后,会要求输入账号密码.我是先在官网进行一个账号注册,然后登陆即可. 首先会要你输入一个已有的邮箱,进行认证.进入自己邮箱,点击链接 ...

  7. 工具类commons-io的Tailer用来监控文件

    一.前言:在Linux下有使用tail命令 在Commons-io中也提供这种方法 二.他采用的是线程方式来监控文件内容的变化 1.Tailer类(采用线程的方式进行文件的内容变法) 2.Tailer ...

  8. 怎么把myeclipse项目导入IDEA中

    先把myeclipse下的项目拷贝到IDEA的部署目录中,把一些不用的配置文件删除,只留下一个干净的项目 打开IDEA,点击import Project,引入一个项目,选择IDEA部署目录下刚拷贝过去 ...

  9. laravel5.2总结--ORM模型

    ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 ...

  10. R语言分析朝阳医院数据

    R语言分析朝阳医院数据 本次实践通过分析朝阳医院2016年销售数据,得出“月均消费次数”.“月均消费金额”.“客单价”.“消费趋势”等结果,并据此作出可视化图形. 一.读取数据: library(op ...