类加载过程(参考 深入理解java虚拟机 7.3节内容)
1.加载(通过类的全限定名获取二进制字节流、二进制字节流按一定格式存到方法区中、内存中生成类的java.lang.Class对象、)
2 连接( 验证:确保Class文件中字节流对虚拟机是安全的、准备:为静态变量分配内存到方法区设初始值为零值、解析:不深究,可能在初始化之后进行解析以支持动态绑定)
3. 初始化(执行静态变量和静态语句块相关操作)
/**
*初始化顺序:先静态语句,后构造方法
父类静态代变量、
父类静态代码块、
子类静态变量、
子类静态代码块、
父类非静态变量(父类实例成员变量)、
父类构造函数、
子类非静态变量(子类实例成员变量)、
子类构造函数。
执行结果:
super.static属性2 //静态变量有值说明static变量在static块之前执行,
super-static{} //静态块只能访问定义在其前面的静态变量。
child.static属性4
child-static{}
super-a 1 //非静态属性有值说明初始化在构造方法之前
child-c 3
*/
public class initializeOrder {
public static void main(String[] args) {
new Child();
}
}
class Super{
int a =1;
static int b=2;
static {
System.out.println("super.static属性"+b);
System.out.println("super-static{}");
}
public Super() {
System.out.println("super-a "+a);
}
}
class Child extends Super{
int c = 3;
static int d=4;
static {
System.out.println("child.static属性"+d);
System.out.println("child-static{}");
}
public Child() {
System.out.println("child-c "+c);
}
}