语法糖(Syntactic Sugar):也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。通常来说,使用语法糖能够增加程序的可读性,减少程序代码出错的机会。
Java中的语法糖包括但不限于以下10颗:泛型与类型擦除、自动装箱和拆箱、遍历循环、变长参数、
条件编译、内部类、枚举类、断言语句、对枚举和字符串的switch支持、在try语句中定义和关闭资源。
1.泛型与类型擦除
Java中的参数化类型只在源码中存在,在编译后的字节码中,已经被替换为原来的原生类型了,并且在
相应的地方插入了强制转换代码。对于运行期的Java语言来说,ArrayList<Integer>和ArrayList<String>就是同一个类。所以说泛型技术实际上就是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型称为伪泛型。
// 泛型与类型擦除
public void parameterizedType() {
List<String> list = new ArrayList<String>();
list.add("Fans.Lei");
}
2.自动装箱和拆箱
自动装箱和拆箱实现了基本数据类型与对象数据类型之间的隐式转换。
// 自动装箱和拆箱
public void autobox() {
Integer one = 1;
if (one == 1) {
System.out.println(one);
}
}
3.foreach循环
foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。
foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach
语句都可以改写为for语句版本。 foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。
// foreach循环
public void foreach() {
Integer[] array = { 1, 2, 3, 4, 5 };
for (Integer i : array) {
System.out.println(i);
}
}
4.变长参数
Arrays.asList(1, 2, 3, 4, 5);
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
5.条件编译
// 条件编译
public void ifdef() {
if (true) {
System.out.println("true");
} else {//此处有警告--DeadCode
System.out.println("false");
}
}
6.内部类
public class JavaTenSugar {
class Name {
String firstName;
String secondName;
}
}
7.枚举类
public enum SEX {
MAN, WOMAN
}
8.断言语句
//运行时需要加上 VM参数 -ea
public static void main(String[] args) {
String str = "fans2";
boolean flag = "fans".equals(str);
assert (flag);
}
//程序结果
Exception in thread "main" java.lang.AssertionError
at sugar.JavaTenSugar.main(JavaTenSugar.java:102)
9.对枚举和字符串的switch支持
// 对枚举和字符串的switch支持
public void enumStringSwitch() {
String str = "fans";
switch (str) {
case "fans":
break;
case "leiwen":
break;
default:
break;
}
}
10.在try语句中定义和关闭资源
jdk7提供了try-with-resources,可以自动关闭相关的资源(只要该资源实现了AutoCloseable接口,jdk7为绝大部分资源对象都实现了这个接口)
static String readFirstLineFromFile(String path)throws IOException {
try (BufferedReader br =new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
特别说明:
1.Eclipse3.7并不支持jdk1.7,据说eclipse3.8才支持jdk1.7.
2.如果想要深入探究编译器到底是如何处理这些语法糖的,可以通过反编译工具查看编译后的class文件。
参考资料:《深入理解Java虚拟机》、Sun公司官网文档、其它互联网资源
思考:C++、C#等语言中有哪些语法糖呢?和Java中的语法糖有什么区别呢?