- 无论在子类还是在父类中都是先执行静态的,后执行非静态的。(先静态后非静态) 第一优先级。
- 在继承关系中,首先进行父类的初始化,后进行子类的初始化。(先父后子) 第二优先级
- 无论是静态的代码还是非静态的代码,都是按照:变量的默认初始化->变量的显式初始化->代码块->构造方法 第三优先级
- 在执行构造方法时总是先执行父类的构造方法(若未指明调用父类的哪一个构造方法,默认调用无参的构造方法),后执行子类构造方法中的代码。 第四优先级
- 注意点:只有实例化时,才会执行非静态代码。
总结顺序:
父类中的静态变量的默认初始化->父类中的静态变量的显式初始化->父类中的静态代码块->
子类中的静态变量的默认初始化->子类中的静态变量的显式初始化->子类中的静态代码块->
父类中的非静态变量的默认初始化->父类中的非静态变量的显式初始化->父类中的构造代码块->父类中的构造方法 ->
子类中的非静态变量的默认初始化->子类中的非静态变量的显式初始化->子类中的构造代码块->子类中的构造方法
案例1:
package 实验;
class Fu {
public static int num1 = method(); //后显式初始化
int num2; //先默认初始化,默认值为0
public Fu() {
System.out.println("Fu中的构造方法");
}
static { //静态代码块
System.out.println("Fu类中的静态代码块");
}
{//构造代码块
System.out.println("Fu类中的构造代码块");
}
public static int method() {
System.out.println("Fu类中的method()方法");
return 10;
}
}
class Zi extends Fu {
public static int num1 = method(); //后显式初始化
int num2; //先默认初始化,默认值为0
public Zi() {
super();
System.out.println("Zi中的构造方法");
}
static { //静态代码块
System.out.println("Zi类中的静态代码块");
}
{//构造代码块
System.out.println("Zi类中的构造代码块");
}
public static int method() {
System.out.println("Zi类中的method()方法");
return 10;
}
}
public class Demo {
public static void main(String[] args) {
Zi z=new Zi();
}
}
运行结果如下图:
案例2:
package 实验;
class X {
Y b = new Y();
X() {
System.out.println("X类的构造方法");
}
}
class Y {
Y() {
System.out.println("Y类的构造方法");
}
}
class Z extends X {
Y y = new Y();
Z() { //默认调用父类的无参构造方法
System.out.println("Z类的构造方法");
}
}
public class Demo{
public static void main(String[] args) {
new Z(); //先父类后子类
}
}
运行结果如下图: