先记录,再分析
class HelloB extends HelloA {
public HelloB(String a) {
System.out.println("Constructor B");
}
static {
System.out.println("static B");
}
{
System.out.println("block B class");
}
public static void main(String[] args) throws ClassNotFoundException {
new HelloB("B");
System.out.println("-----------");
new HelloB("B");
//Class.forName(HelloA.class.getName());
//Class.forName(HelloA.class.getName(), false, HelloB.class.getClassLoader());
}
}
class HelloA {
public HelloA() {
System.out.println("Constructor A");
}
static {
System.out.println("static A");
}
{
System.out.println("block A class ");
}
}
输出结果
static A
static B
block A class
Constructor A
block B class
Constructor B
-----------
block A class
Constructor A
block B class
Constructor B
结论: 按 静态块 -> 普通块 -> 构造方法 的顺序执行
类加载的情况:
- 实例化
- 访问其静态变量或对静态变量赋值
- 调用静态方法
- 反射class.forName("");forName有(string,boolean,classLoader) 方法,指定boolean init=false时不会初始化、
- 初始化一个类的子类、
- 虚拟机启动被标注为启动的类(Main方法)