超类:
public class A { public A() { System.out.println("A 类构造方法执行"); } {System.out.println("A 类动态代码块执行");} static {System.out.println("A 类静态代码块执行");} }
子类:
public class B extends A{ public B() { System.out.println("B 类构造方法执行"); } {System.out.println("B 类动态代码块执行");} static {System.out.println("B 类静态代码块执行");} public static void main(String[] args) { System.out.println("start"); new B(); System.out.println("end"); } /* * A 类静态代码块执行 * B 类静态代码块执行 * start * A 类动态代码块执行 * A 类构造方法执行 * B 类动态代码块执行 * B 类构造方法执行 * end */ }
运行结果分析:
1、加载main方法所在的B类,但B类继承了A类,所以在加载B类前先加载A类。
2、加载B类
3、运行main方法,输出start字符串
4、调用构造方法创建B类的对象,但因为B类有父类,所以先调用父类A类的构造方法,但在调用A类的构造方法前要先调用A类的动态方法。
5、调用父类的构造方法
6、调用子类的动态方法
7、调用子类的构造方法
8、输出end字符串