静态代码块,非静态代码块,无参构造,有参构造,这些代码片段分别在什么时候加载执行?

1.父类Father

package com.java4all.test10;
public class Father {

static {
System.out.println("father的静态代码块");
}

{
System.out.println("father的非静态代码块");
}

public Father() {
System.out.println("father的构造方法");
}

}

2.子类Son

package com.java4all.test10;
public class Son extends Father{

static {
System.out.println("son的静态代码块");
}

{
System.out.println("son的非静态代码块");
}

public Son() {
System.out.println("son的构造方法");
}

}

3.测试类

package com.java4all.test10;
public class Test1 {
public static void main(String[] args){
System.out.println("创建son对象前");
Son son = new Son();
System.out.println("创建son对象后");
}
}

结果:

创建son对象前
father的静态代码块
son的静态代码块
father的非静态代码块
father的构造方法
son的非静态代码块
son的构造方法
创建son对象后

4.如果父类没有无参构造,只有有参构造

这种情况,子类需要在构造方法中显示的调用父类的有参构造

父类

public class Father {

static {
System.out.println("father的静态代码块");
}

{
System.out.println("father的非静态代码块");
}

//public Father() {
// System.out.println("father的构造方法");
//}

public Father(Integer a) {
System.out.println("father的带参构造方法");
}

}

子类

public class Son extends Father{

static {
System.out.println("son的静态代码块");
}

{
System.out.println("son的非静态代码块");
}

public Son() {
//父类没有无参,只有有参,需要显示调用父类的有参构造
super(5);
System.out.println("son的构造方法");
}

public Son(Integer a) {
//父类没有无参,只有有参,需要显示调用父类的有参构造
super(5);
System.out.println("son的带参构造方法");
}
}

结果:

创建son对象前
father的静态代码块
son的静态代码块
father的非静态代码块
father的带参构造方法
son的非静态代码块
son的构造方法
创建son对象后

5.如果父类没有无参构造,也没有有参构造

子类的构造只管自己就好,不用管父类的构造了。

6.总结

总的来说,按照如下的大顺序调用:
父类静态代码块
子类静态代码块

父类非静态代码块
父类构造函数

子类非静态代码块
子类构造函数