1. Java编译机制
java的编译是指从.java文件到.class文件的过程, java的编译过程主要包括词法分析,语法分析, 语义分析,代码生成的过程。
java源代码 |
|
| 词法分析, 将源代码转换成Token流,Token包括Java关键字, 自定义单词(包名、类名、变量名等),符号(+,-等) |
Token流 |
|
| 语法分析, 语法分析将上述的Token序列进行组装一句句话,会对每句话的合法性做校验, 主要包括import, package 和 类(包括interface, enum等) |
语法树 |
|
| 语义分析, 语义分析将语法树转换成对应的注解语法树, 1. 去除永假条件, 2.包装类型到基础类型的转换, 3, 去除语法糖, 如 foreah变为for |
注解语法树 |
|
| 代码生成器,代码生成器将对应的注解语法树转换成JVM可以直接读取.class文件 |
.class文件 |
|
2.Java类加载与初始化的过程
1.加载 | 加载阶段, 将.class文件加载到内存中, 并在堆中创建对应的Class对象。类加载的双亲委托机制, 将加载类先委托给父加载器, 直到根加载器, 若父类加载器不能处理, 则交给子类加载, 可以保证同样的类只会被加载一次 | |
2.链接,链接主要指将二进制流转换成对应的类的信息 | 验证 | 验证.class文件是否合法 |
准备 | 为静态变量分配空间, 并赋予默认初始值; 被final static修饰的变量则会直接赋值 | |
解析 | 将常量池中的符号引用转换成对应的直接引用, 获取方法、类、变量等的指针或偏移量, 以便可以访问。解析的过程可分为静态解析和动态解析。静态解析主要包括static、final修饰的方法或变量、构造器, 可在此阶段执行; 而动态解析可以在运行时再进行。 | |
3.初始化 | 初始化阶段主要对static修饰的变量或代码块进行赋值操作。 |
3.Java对象初始化
1. 父类静态变量 与 代码块执行 | 静态变量初始化 |
2. 子类静态变量 与 代码块执行 | |
3. 父类其他成员初始化 | 父类初始化 |
4. 调用父类构造器初始化 | |
5. 子类其他成员初始化 | 子类初始化 |
6. 调用子类构造器初始化 |