什么是语法糖?
糖衣语法( Syntactic Suger),方便开发人员使用,在JVM编译阶段会还原成基础语法。通过语法糖可以写出很飘逸、很漂亮、很让人(或者是自己)看不懂的代码。这可以让代码看上去好像很高级。使用语法糖可以少敲几下键盘。代价是代码可读性变差。
常见语法糖
泛型
JVM没有泛型。泛型在JVM编译时会自动擦除,在编写时如果使用了不符合泛型要求的数据类型就会报错。
在类名(引用类型)后添加<>在<>内添加其他数据类型约束引用类型内的适用内容。添加多个类型时用逗号隔开。添加的类型也可以有泛型。
由于泛型在JVM编译阶段会被擦除,所以泛型的存在更多是提醒程序员这里的引用类型限定用什么类型,避免用错数据类型的尴尬。
自动装箱/自动拆箱
自动装箱底层是执行valueof(),自动拆箱则是xxxValue()。
自动装箱和自动拆箱是数据类型和对应包装类型的快速变换,比如:
int i = 10;
Integer j = i;
//此处的Integer j = i 其实是执行了:
// Integer j = new Integer().valueof(i);
Int k = j ;
//此处的Int k = j 其实是执行了:
// Int k = new Integer().intValue(i);
枚举类
创建枚举类:
Public enum xxxxx{}
底层代码:
Public class xxxxx extend Enum {}
内部类
Public/private/default(不写)/protected class xxxxx{}
编写代码时可以在一个类内部创建内部类,可以在类前添加任何访问权限,但是如果要在其他类中调用这个内部类,就要先床架这个内部类的外部类的对象。对外部类而言,内部类的private成员是可以随便调用的。
JVM编译会把一个内部类单独编译成一个class文件,文件名是外部类名$内部类名.class 比如:
Public class a{
Public class b {}
}
编译完成后会有两个class文件,一个是a.class另一个是a$b.class
数值字面量
数字类型的字面值有不同的表达方法
十进制:默认
八进制:数值前加个0(零)
十六进制:数值前加0x(零和小写英文x)或者0X(零和大写英文X)
二进制:数值前加0b(零和小写英文b)或者0B(零和大写英文B)
添加了这些前缀后,后面可以直接书写对应进制的数字比如0b1010的十进制值是10
数字之间可以加下划线”_”,JVM编译时会自动去掉这些下划线,必须是数字之间,数字和字母、符号之间加了都会报错。