Java语法糖(一)
概述
语法糖(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语法糖(一)的更多相关文章
- Java语法糖1:可变长度参数以及foreach循环原理
语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...
- Java语法糖设计
语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这 ...
- java语法糖---枚举
java语法糖---枚举 在JDK5.0中提供了大量的语法糖,例如:自动装箱拆箱.增强for循环.枚举.泛型等.所谓“语法糖”就是指提供更便利的语法供程序员使用,只是在编译器上做了手脚,却没有提供 ...
- Java语法糖(二)
语法糖之四:内部类 内部类:顾名思义,在类的内部在定义一个类.内部类仅仅是编译时的概念,编译成字节码后,内部类会生成单独的Class文件. 四种:成员内部类.局部内部类.匿名内部类.静态内部类. 1. ...
- Java语法糖4:内部类
内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功 ...
- 转:【深入Java虚拟机】之六:Java语法糖
转载请注明出处:http://blog.csdn.net/ns_code/article/details/18011009 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家P ...
- 早期(编译器)优化--Java语法糖的味道
1.泛型与类型擦除 泛型的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口和泛型方法.在泛型没有出现之前,只能通过 ...
- Java 语法糖详解
语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法. 这种语法对语言的功能并没有影响,但是 ...
- JVM总结-Java语法糖与Java编译器
自动装箱与自动拆箱 首先要提到的便是 Java 的自动装箱(auto-boxing)和自动拆箱(auto-unboxing). 我们知道,Java 语言拥有 8 个基本类型,每个基本类型都有对应的包装 ...
随机推荐
- IDEA整合Mybatis+Struts2+Spring (二)--整合框架
二.搭建目录结构 我这里列出的是搭建完了之后所有的目录和文件,诸位先把目录文件建起来,然后我在给出文件内容 这里的目录建好之后还需要设置一下,让idea识别目录作用,选择File-Project St ...
- jQuery实现复选框的全选、反选功能
<ul id="list"> <li><label><input type="checkbox" value=&quo ...
- java util - Hex转换工具
测试代码 package cn.java.codec.hex; public class Test { public static void main(String[] args) { String ...
- 数据分析处理库Pandas——概述
导入Pandas库 创建DataFrame结构 读取.csv文件 titanic_train.csv文件:https://files.cnblogs.com/files/gloria-zhang/ti ...
- 初学js之多组图片切换实例
需求是以上效果展示.话不多说,直接代码显示,不涉及代码优化.已实现功能为目的. 先看html部分: <body> <div class="dream" id=&q ...
- oracle for update和for update nowait 的区别
原文地址:http://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.html 1.for update 和 for update nowa ...
- Broken robot CodeForces - 24D (概率DP)
You received as a gift a very clever robot walking on a rectangular board. Unfortunately, you unders ...
- (JAVA指针),对象引用问题
引出指针 从表面上看JAVA是没有指针的,或者是说,弱化了指针.但是指针在JAVA中还是真真切切存在的.在Java中我们称之为引用. String a;//引用为空 String a = new S ...
- [转]webservice 采用SSL实现加密传输
本文转自:http://book.51cto.com/art/200906/129770.htm http://yeweiyun868.blog.163.com/blog/static/5637844 ...
- visual studio 2010 自带reporting报表本地加载的使用
原文:visual studio 2010 自带reporting报表本地加载的使用 在这家公司时间不长,接触都是之前没玩过的东东,先是工作流引擎和各种邮件短信的审核信息,后又是部署reporting ...