Java类的初始化执行顺序
1. 无继承关系的类
静态变量→静态代码块→非静态变量→非静态代码块→构造方法
public class Base {
static int i = 0;
int j = 0;
{
i++;
j++;
System.out.println("代码块i="+i+"\t实例代码块j="+j);
}
static {
System.out.println("静态代码块设置前i="+i);
i++;
System.out.println("静态代码块设置后i="+i);
}
public Base() {
i++;
j++;
System.out.println("构造器中i="+i+"\t实例代码块j="+j);
}
public static void main(String[] args) {
new Base();
}
}
执行结果:
静态代码块设置前i=0
静态代码块设置后i=1
代码块i=2 实例代码块j=1
构造器中i=3 实例代码块j=2
2.有继承关系的类
父类静态变量→父类静态代码块→子类静态变量→子类静态代码块→父类非静态变量→父类非静态代码块→父类构造方法→子类非静态变量→子类非静态代码块→子类构造方法
Father类:
public class Father {
static int i=0;
static {
i++;
System.out.println("Father静态代码块i="+i);
}
{
i++;
System.out.println("Father代码块i="+i);
}
public Father() {
System.out.println("Father构造器i="+i);
}
}
Son类:
public class Son extends Father{
static int i=0;
static {
i++;
System.out.println("Son静态代码块i="+i);
}
{
i++;
System.out.println("Son代码块i="+i);
}
public Son() {
System.out.println("Son构造器i="+i+"\tFather的变量i="+Father.i);
}
public static void main(String[] args) {
Father father = new Son();
}
}
执行结果:
Father静态代码块i=1
Son静态代码块i=1
Father代码块i=2
Father构造器i=2
Son代码块i=2
Son构造器i=2 Father的变量i=2
3. 总结
- 静态变量和静态代码块初始化是平级的,按照从上往下的顺序执行
- 静态变量(代码块)比非静态变量(代码块)先初始化
- 静态变量(代码块)只初始化一次,非静态变量(代码块)可以初始化多次
- 父类比子类先初始化
文章详细阐述了Java类在无继承关系和有继承关系时的初始化顺序。在无继承的情况下,初始化顺序为静态变量、静态代码块、非静态变量、非静态代码块、构造方法。如果有继承关系,父类的静态部分先于子类,然后是父类的非静态部分,最后是子类的非静态部分。静态变量和静态代码块只初始化一次,而非静态部分可能多次初始化。
407

被折叠的 条评论
为什么被折叠?



