通过一个例子来看下类初始化过程:
Base:
public class Base {
static{
System.out.println("我是Base,static代码块");
}
{
System.out.println("我是Base,代码块");
}
public Base(){
System.out.println("我是Base构造");
}
public Base(String name){
System.out.println("我是Base构造,"+name);
}
}
Myclass:
public class Myclass extends Base{
static{
System.out.println("我是Myclass,static代码块");
}
{
System.out.println("我是Myclass,代码块");
}
public Myclass(){
System.out.println("我是Myclass构造");
}
}
Test:
public class Test {
Base base = new Base("Test");
static{
System.out.println("我是Test,static代码块");
}
{
System.out.println("我是Test,代码块");
}
public Test(){
System.out.println("我是Test构造");
}
public static void main(String[] args){
System.out.println("m1");
Myclass m1 = new Myclass();
System.out.println("m2");
Myclass m2 = new Myclass();
}
}
结果:
我是Test,static代码块
m1
我是Base,static代码块
我是Myclass,static代码块
我是Base,代码块
我是Base构造
我是Myclass,代码块
我是Myclass构造
m2
我是Base,代码块
我是Base构造
我是Myclass,代码块
我是Myclass构造
分析:
- 首先加载Test类,因此会执行Test类中的static代码块
- 接着执行m1 = new Myclass(),而Myclass类还么有被加载,因此需要加载Myclass类,在加载Myclass类的时候发现继承自Base类,所以要先加载Base类先执行Base中的static再执行Myclass中的static
- 加载完成后,通过构造器生成对象,而在生成对象的时候,必须先初始化父类的成员变量,因此会执行Base中的代码块和构造,完成父类初始化,然后初始化自身Myclass
- 在执行m2 = new Myclass()时,因为static已经执行过,则不再执行,但是非静态代码块和构造还会在执行