参考文献

语法糖

  • 语法糖的存在主要是方便开发人员使用,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖

Java支持的语法糖

switch 支持 String 与枚举

  • 对于编译器来说,switch中其实只能使用整型,任何类型的比较都要转换成整型。比如byte。short,char(ackii码是整型)以及int

泛型

  • 通常情况下,一个编译器处理泛型有两种方式:Code specialization和Code sharing。
  • C++和C#是使用Code specialization的处理机制,而Java使用的是Code sharing的机制。
  • Code sharing方式为每个泛型类型创建唯一的字节码表示,并且将该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字节码表示是通过类型擦除(type erasue)实现的。
  • 也就是说,对于Java虚拟机来说,他根本不认识Map<String, String> map这样的语法。需要在编译阶段通过类型擦除的方式进行解语法糖。
  • 类型擦除的主要过程如下:
    • 将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
    • 移除所有的类型参数。

自动装箱与拆箱

  • 自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。

方法变长参数

  • 可变参数(variable arguments)是在Java 1.5中引入的一个特性。它允许一个方法把任意数量的值作为参数。
  • 可变参数在被使用的时候,他首先会创建一个数组,数组的长度就是调用该方法是传递的实参的个数,然后再把参数值全部放到这个数组当中,然后再把这个数组作为参数传递到被调用的方法中。

枚举

  • Java SE5提供了一种新的类型-Java的枚举类型,关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。

内部类

  • 内部类又称为嵌套类,可以把内部类理解为外部类的一个普通成员。
  • 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念。
    • outer.java里面定义了一个内部类inner,一旦编译成功,就会生成两个完全不同的.class文件了,分别是outer.class和outer$inner.class。所以内部类的名字完全可以和它的外部类名字相同

数值字面量

  • 在java 7中,数值字面量,不管是整数还是浮点数,都允许在数字之间插入任意多个下划线。这些下划线不会对字面量的数值产生影响,目的就是方便阅读。

for-each

  • for-each的实现原理其实就是使用了普通的for循环和迭代器。

try-with-resource