目录
求输出结果?
public class A { public A() { System.out.println("1. A的构造方法---------------"); } { System.out.println("2. A的构造块-----------------"); } static { System.out.println("3. A的静态块-----------------"); } }
public class B extends A { public B() { System.out.println("4. B的构造方法--------------"); } { System.out.println("5. B的构造块----------------"); } static { System.out.println("6. B的静态块----------------"); } public static void main(String[] args) { System.out.println("7. main开始"); new B(); new B(); System.out.println("8. main结束"); } }
题解:
若JVM要调用 main,首先要加载主类。由于 main 存在于 B 子类中,加载主类,执行主类的静态块(静态块最先加载且只加载一次)。
因为B 继承了 A,先加载父类再加载子类。3(父类的静态块)——>6(再加载子类的静态块)。
类加载结束后,进入主方法,7。
new B() 产生子类对象,先要产生父类对象;先调用构造块,下来才是构造方法。先调用父类的构造块2,调用父类构造方法1——>父类对象产生完毕;
子类构造块,5子类构造方法4——>子类对象产生完毕。
先调用父类的构造块2,调用父类构造方法1——>父类对象产生完毕;子类构造块,5子类构造方法4——>子类对象产生完毕。
main方法结束8。
最后的执行顺序为:
36 7 2154 2154 8