Jvm笔记总结(十二):Java语法糖
PS : 本文乃学习整理参考而来 ,目录参考 [ Jvm系列目录 ]
语法糖
可以看做是编译器实现的一些“小把戏”,这些他们或许能提高效率,提升语法的严谨性,减少编码出错等,目的是为了让程序员写代码的效率提升。
主要体现有:
1.泛型与类型擦除
2.自动装箱、拆箱与遍历循环
3.条件编译
1.泛型与类型擦除:
如下代码:
public static void main(String[] args) {
Map<String,String> map = new HashMap<String, String>();
map.put("one","1");
map.put("two","2");
System.out.println(map.get("one"));
System.out.println(map.get("two"));
}
如上代码,编译后,再经过反编译得如下代码:其中泛型都不见了,泛型类型都变成了原生的写法。编译期进行了解语法糖操作。
public static void main(String[] args)
{
Map map = new HashMap();
map.put("one", "1");
map.put("two", "2");
System.out.println((String)map.get("one"));
System.out.println((String)map.get("two"));
}
如下代码: 无法通过编译,因为经过类型擦除后,方法参数一致,无法实现重载。(且返回值不参与重载)
public class Test {
public void method(List<String> list) {
}
public void method(List<Integer> list) {
}
}
2.自动装箱、拆箱与遍历循环
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4);
int sum = 0;
for (int i : list) {
sum += i;
}
}
如上代码编译后,再经反编译得以下代码:其中包含了泛型、自动装箱、自动拆箱、循环遍历与变长参数等5中语法糖。自动装箱和拆箱在编译后转变为了对应的包装和还原方法,如:Integer.valueOf()、Integer.intValue();而循环遍历代码则被还原成了迭代器的实现。
public static void main(String[] args)
{
List list = Arrays.asList(new Integer[] { Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3), Integer.valueOf(4) });
int sum = 0;
for (Iterator i$ = list.iterator(); i$.hasNext(); ) { int i = ((Integer)i$.next()).intValue();
sum += i;
}
}
3.条件编译:Java中的条件编译的实现,是根据布尔常量值的真假,编译器会把分支中不成立的代码块消除。
public static void main(String[] args) {
if (true) {
System.out.println(true);
} else {
System.out.println(false);
}
}
以上代码编译后,再经反编译得如下代码:其中不成立的false分支被消除掉了。
public static void main(String[] args)
{
System.out.println(true);
}
除了泛型、自动装箱、自动拆箱、遍历循环、变长参数和条件编译以外,Java语言还有其他语法糖,如:内部类、枚举类、对枚举和字符串的switch支持等等。