子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?

时间:2021-12-11 15:42:45

(1)子类A继承父类B, A a = new A(); 则:

父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数

(2)若子类构造函数中显式的调用了父类的某构造函数,则调用该构造函数

class C {
C() {
System.out.print("C");
}
}

class A {
C c = new C();

A() {
this("A");
System.out.print("A");
}

A(String s) {
System.out.print(s);
}
}

class Test extends A {
Test() {
super("B");
System.out.print("B");
}

public static void main(String[] args) {
new Test();
}
}

CBB
首先new了一个子类对象,那么就要调用构造方法来初始化该子类对象,但是该类继承自A,所以要先调用父类的构造方法,这里通过super(“B”)显示的调用了父类的带参构造。执行父类的带参构造前要先对父类中的对象进行初始化,对父类中的c成员进行初始化,调用了C类的无参构造,所以调用顺序为:
先调用C类的无参构造
再调用A类的带参构造
最后调用调用子类的构造

(3)在JVM调用mian方法之前先用进行静态内容的初始化。顺序为:父类的静态变量, 父类的静态代码块 ,子类的静态变量,子类的静态代码块。

public class Test{
static int cnt = 6;
static{
cnt += 9;
}
public static void main(string[] args){
System.out.println(“cnt =” + cnt);
}
static{
Cnt /=3;
};
}

Cnt=5