语法糖(Syntactic sugar):也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
简单理解:代码的简写方式;对java而言,简写方式经过编译器处理后(解语法糖)生成的class文件与原始方式的一致,虚拟机不认识也不关心源码怎么编写;
不同的反编译工具生成的代码会有出入,上方为源码,下方为反编译出来的代码
1、泛型
ArrayList<String> arrayList = new ArrayList<String>();
ArrayList arrayList = new ArrayList();
2、自动装箱,自动拆箱
装拆箱的陷阱见基本数据类型包装类“==”判定
int primitiveInt = new Integer(1);
Integer warpperInt = 1;
int primitiveInt = (new Integer(1)).intValue();
Integer warpperInt = Integer.valueOf(1);
3、数组简写
String[] intArray = {"1", "2"};
String[] intArray = new String[]{"1", "2"};
4、foreach循环
//对于实现了Iterator借口的数据类型
for (String i : arrayList) {
System.out.println(i);
}
Iterator innerClass = arrayList.iterator();
while(innerClass.hasNext()) {
String str = (String)innerClass.next();
System.out.println(str);
}
//对于数组
for (String i : intArray) {
System.out.println(i);
}
int var23 = intArray.length;
for(int string = 0; string < var23; ++string) {
String e = var22[string];
System.out.println(e);
}
5、条件编译
if (true) {
System.out.println("if branch");
} else {
System.out.println("else branch");
}
System.out.println("if branch");
6、变长参数
Java变长参数
7、switch对字符串和枚举的支持
不同的Java版本支持的类型不同,jdk1.8支持的数据类型是:char、byte、short、int、枚举、字符型
使用idea自带的反编译工具出来的代码,用jd-GUI已经可以完全还原为源码
//switch枚举的支持
EnumTest str = EnumTest.FRI;
switch (str) {
case MON:
System.out.println(str);
break;
default:
System.out.println("unknown");
}
EnumTest var24 = EnumTest.FRI;
switch(null.$SwitchMap$javaCompile$EnumTest[var24.ordinal()]) {//不知道为什么反编译出来是这样,通过下方的case语句可以看出来还是转换为判断int来达到目的;
case 1:
System.out.println(var24);
break;
default:
System.out.println("unknown");
}
//switch对string支持
String string = "1";
switch (string) {
case "1":
System.out.println(string);
break;
default:
System.out.println("unknown");
}
String var13 = "1";
byte var9 = -1;
switch(var13.hashCode()) {
case 49:
//转换为int来做判断
if(var13.equals("1")) {
var9 = 0;
}
default:
switch(var9) {
case 0:
System.out.println(var13);
break;
default:
System.out.println("unknown");
}
}
8、try语句中定义和关闭资源
从 1.7 开始AutoCloseable方式关闭资源
try(BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(""))))) {
System.out.println(reader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader e = new BufferedReader(new InputStreamReader(new FileInputStream(new File(""))));
Throwable var2 = null;
try {
System.out.println(e.readLine());
} catch (Throwable var12) {
var2 = var12;
throw var12;
} finally {
if(e != null) {
if(var2 != null) {
try {
e.close();
} catch (Throwable var11) {
var2.addSuppressed(var11);
}
} else {
e.close();
}
}
}
} catch (IOException var14) {
var14.printStackTrace();
}
9、内部类、内部类
通过编译生成fatherclass$innerclass.class文件达到目的,比一般的语法糖规则复杂;枚举类直接继承了Enum抽象类,反编译工具直接按照规则生成代码,看不到中间转换实现;