java类的初始化
对于一般的java类,其中包含的字段有类字段(static),实例字段。对于每个字段的初始化方式也有多种:
- 直接初始化。
- 使用初始化块。对于实例字段,使用static初始化块;对于实例字段,使用一般初始化块。
- 在构造器中执行初始化逻辑
java类初始化的顺序
由于类加载器在加载class文件,到实例构造前,类字段会得到初始化,也就意味着类字段优先于
实例字段的初始化。对于一个类而言,其中的各种字段的初始化顺序可总结如下:
1.执行父类【类字段】初始化语句,执行static初始化块;
2.执行自身【类字段】初始化语句,执行static初始化块;
3.执行父类【实例字段】初始化语句,执行实例初始化块;执行构造器
4.执行自身【实例字段】初始化语句,执行实例初始化块;执行构造器
代码验证
class Base{
static int baseStaticVal=1;
int baseInstanceVal=1;
static{
System.out.println("init baseStaticVal");
System.out.println("baseStaticVal "+baseStaticVal);
baseStaticVal=2;
}
{
System.out.println("init baseInstanceVal");
System.out.println("baseInstanceVal "+baseInstanceVal);
baseInstanceVal=2;
}
public Base(){
System.out.println("start Base constructor");
System.out.println("baseStaticVal "+baseStaticVal);
System.out.println("baseInstanceVal "+baseInstanceVal);
baseStaticVal=3;
this.baseInstanceVal=3;
System.out.println("baseStaticVal "+baseStaticVal);
System.out.println("baseInstanceVal "+baseInstanceVal);
}
}
class SubClass extends Base{
static int subStaticVal=4;
int subInstanceVal=4;
static{
System.out.println("init subStaticVal");
System.out.println("subStaticVal "+subStaticVal);
subStaticVal=5;
}
{
System.out.println("init subInstanceVal");
System.out.println("subInstanceVal "+subInstanceVal);
subInstanceVal=5;
}
public SubClass(){
System.out.println("start subClass constructor");
System.out.println("subStaticVal "+subStaticVal);
System.out.println("subInstanceVal "+subInstanceVal);
subStaticVal=6;
this.subInstanceVal=6;
}
}
public class Initial{
public static void main(String[] args){
SubClass son=new SubClass();
}
}
实验代码的输出结果为:
init baseStaticVal
baseStaticVal 1
init subStaticVal
subStaticVal 4
init baseInstanceVal
baseInstanceVal 1
start Base constructor
baseStaticVal 2
baseInstanceVal 2
baseStaticVal 3
baseInstanceVal 3
init subInstanceVal
subInstanceVal 4
start subClass constructor
subStaticVal 5
subInstanceVal 5
Done.