package com;
class BaseTmp {
BaseTmp() {System.out.println(“BaseTmp instance.” );}
}
class Base {BaseTmp tmp = new BaseTmp();
static { System.out. println( “Base static{}.” );
}
Base() { System.out.println(“Base instance.”);
}
}
class BaseChild extends Base {
BaseTmp tmp=new BaseTmp();
static { System. out.println( "BaseChild static{}." );
}
BaseChild() { System. out.println("BaseChild instance.");
}
}
public class Test1 {
public static void main( String argv []) {
new BaseChild ();
}
}
运行结果如下
Base static{}.
BaseChild static{}.
BaseTmp instance.
Base instance.
BaseTmp instance.
BaseChild instance.
首先程序加载了 Demo 类进来,接着执行 Demo 类中程序的入口 main 方法,在 main 方法中我们创建了 BaseChild 实例,而第一次创建 BaseChild 实例前需要先把 BaseChild 类加载进来,而 BaseChild 又继承自 Base 类,所以要加载 BaseChild 得先加载 Base 类,在加载 Base 类时由于 Base 类中有一个静态代码块,所以会先执行打印 Base static{}.,接着加载了 BaseChild 类执行了其中的静态代码块打印为 BaseChild static{}.,当类加载完成以后就开始实例化阶段了,实例化 BaseChild 对象之前得先实例化 Base 对象(因为子类构造方法会调用父类构造方法,所以得先实例化父类),实例化 Base 对象前还得先初始化(即获取类的属性并初始化),所以 Base 类中 BaseTmp 属性先被实例化,所以打印 BaseTmp instance.,接着执行 Base 类的构造方法打印 Base instance.,然后回退到子类也是先初始化然后实例化,同理打印 BaseTmp instance. 和 BaseChild instance