本博文主要讲述Java类的装载、链接和初始化
Java类执行的一般过程:
一般的Java应用开发过程:开发人员编写的是Java源代码文件(.java),IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码(byte
Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象。一个Java类从字节代码到能够在JVM中被使用,需要经过加载、链接和初始化这三个步骤。这三个步骤中,对开发人员直接可见的是Java类的加载,通过使用Java类加载器(class
加载(Loading)
1. 通过类的全名产生对应类的二进制数据流。(注意,如果没找到对应类文件,只有在类实际使用时才抛出错误。)
2. 分析并将这些二进制数据流转换为方法区(JVM
3. 创建对应类的
链接(Linking)
1. 验证(verification):链接的第三部解析会把类中成员方法、成员变量、类和接口的符号引用替换为直接引用,而在这之前,需要检测被引用的类型正确性和接入属性是否正确(就是
2. 准备(preparation):对类的成员变量分配空间。虽然有初始值,但这个时候不会对他们进行初始化(因为这里不会执行任何
3. 解析(Resolution):为类、接口、方法、成员变量的符号引用定位直接引用(如果符号引用先到常量池中寻找符号,再找先应的类型,无疑会耗费更多时间),完成内存结构的布局。
初始化类(Initialization)
1. 如果基类没有被初始化,初始化基类。
2. 有类构造函数,则执行类构造函数。
类构造函数是由
由于博主知识有限,如有误,请指正点评,欢迎交流