一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
泛型的类型擦除机制
-
Java从1.5开始支持泛型,为类向前兼容,泛型的类型,只在编译期进行安全检查,并不会编译进字节码,更不会保留到运行时;
-
优势:
- 向前兼容
- 老版本的字节码能够在新版本的JVM上运行
- 老版本的源代码能够通过新版本的编译器编译
- 通过类型擦除实现泛型,比真实的运行时泛型,更节约内存,方法区的压力更小。
- 向前兼容
匿名内部类
- 匿名内部类,持有外部类的引用
- 以编译器自动生成的成员变量的形式持有
- 通过编译器自动生成的构造方法传入
- 匿名内部类,通过这个引用访问外部类的成员变量和方法
- 匿名内部类,访问外部局部变量时,其实是访问自身的一个成员变量
- 这个成员变量是编译器自动生成的
- 这个成员变量由编译器自动生成的构造方法初始化
- 为了保证这个成员变量和外部局部变量时刻保持一致性,二者必须都是final的
语言中的闭包
- 内部作用域 + 访问的外部变量 = 闭包
- 闭包必须是可引用的
- 闭包必须是有状态的
- 闭包的作用
- 保护私有作用域
- 保护上下文
闭包 lambda 匿名内部类的关系
语言编译过程
词法分析
词法分析:把源码的字符流转化成标记(Token)序列,标记是语言的最小语义单位,包括关键字,标识符,运算符,常数等 例子:
int i= x + y ;
1.将源码解析成字符流 2.将代码进行分割去掉无意义的字符变成标记流 3.确定标记的类型 4.语法分析
语法分析
语法分析:把标记序列组合成各类语法短句,判断标记序列在语法结构上是否正确,输出树形结构的抽象语法树
语义分析
结合上下文,检查每一个语法短句,语义是否正确,是否符合语言规范;
检查内容:
- 数据类型匹配
- 重复定义检测
- 访问合法性
- 静态分析
- 受检异常
- 语句可达性
- 展开语法糖