JAVA 语法糖 Syntactic surgar

1)语法糖 Syntactic Sugar 糖衣语法,方便开发人员使用,JVM并不识别,会在编译阶段解语法糖,还原为基础语法。
2) com.sun.tools.javac.main.JavaCompiler中的 deSugar方法,负责解语法糖的实现。
3)常见的语法糖有 泛型、变长参数、条件编译、自动拆装箱、内部类等。

1:switch从1.7支持 String和enum类型。
首先对编译器,switch关键字只能使用整型,如byte、char、short、int等。
字符串的switch是通过equals()和hashCode()方法来实现的。
 
2)泛型。
jvm中没有泛型,只有普通类型和普通方法,泛型类的类型参数,在编译时都会被擦除。泛型并没有自己独特的Class类型。
类型擦除: 如果泛型参数指定了上限,如<T extends Comparable>,移除所有类型参数,替换为顶级的父类型,如果没指定则使用Object。

3)自动装箱、拆箱
装箱使用包装器的valueOf方法,拆箱使用包装器的xxxValue方法。
byte、short、char、int、long、float、double、boolean => Byte、Short、Character、Integer、Long、Fload、Double、Boolean等。
int i = 10;
Integer n = i; 自动装箱,反编译class后,Integer.valueof(i)
int j = n; 自动拆箱,反编译class后,使用n.intValue()方法
Integer -128 ~127之间有缓存。
4)可变参数
String... strs,反编译后String[] strs,调用时创建String[]数组,传入方法。
 
5)枚举类型
enum 创建具名值的有限集合。
创建一个enum类型,底层public class MyEnum extend Enum

6)内部类
编译时的概念,编译后生成两个不同的.class文件。Outer.class和Outer$Inner.class
 
7)数值字面量
整数、浮点数,都允许在数字之间插入任意多个下划线。编译阶段会去掉。 主要是为了方便阅读
 
8)for-each
for-each底层使用普通的for循环和迭代器
数组的for each 相当于普通的for循环
List的 for each 相当于iterator迭代   

for(Iterator it =testStr.iterator();it.hasNext();) { xxxxxxxxx}

9)lambda表达式
lambda的实现,依赖了底层lambda的api。编译阶段糖解,将lambda表达式转换为调用内部api的方式。LambdaMetafactory#metafactory

10)Iterator 在工作的时候是不允许被迭代的对象被改变的。会抛出ConcurrentModificationException异常,可以使用Iterator本身的remove方法。

11: 将IO 流放入try()中,可以省略最后关闭流的动作.无需再在 finally{}中添加 close方法块

try (BufferedInputStream br=new BufferedInputStream(new FileInputStream(new File("src/main/java/ScheduledTimeTask.java")));){

} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}

12:—般情况下,程序中的每一行代码都要参加编译。但有时候出于对程序代码优化的考虑,希望只对其中一部分内容进行编译,此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译。

13:断言

assert a == b;
System.out.println("公众号:Hollis");
assert a != b : "xx";//assert后面跟个冒号表达式。如果冒烟前为true,则冒号后面的被忽略,否则抛出AssertionError,错误内容为冒号后面的内容。

14:泛型擦除带来的问题

首先,泛型不能认定为重载

其次,泛型的类型参数不能用在Java异常处理的catch语句中。因为异常处理是由JVM在运行时刻来进行的。由于类型信息被擦除,JVM是无法区分两个异常类型MyException<String>和MyException<Integer>的

猜你喜欢

转载自www.cnblogs.com/kokimiki/p/13370718.html