Java程序的初始化顺序

/ 面试题 / 1 条评论 / 582浏览

面试题:下面代码的运行结果是什么?

class B extends Object {

  static {
    System.out.println("Load B1!");
  }

  public B() {
    System.out.println("create B");
  }

  static {
    System.out.println("Load B2!");
  }

}

class A extends B {

  static {
    System.out.println("Load A!");
  }

  public A() {
    System.out.println("create A");
  }
}

public class TestClass {

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


这道题的结果其实不重要,只要我们通过这道面试题能够掌握Java中程序初始化的顺序才是最重要的。在Java中实例化对象时,首先Java会对当前类的成员变量进行初始化。当成员变量初始化后才会执行当前类的构造方法创建对象。 但在Java初始化时会有相应的优先级,下面我们详细了解一下。

在执行Java程序时,初始化工作可能会在不同的代码块中执行,不同的代码块执行的顺序也是不同的,下面我们详细了解一下不同代码块它们之间的顺序。下面顺序越往后越后执行:


下面我们按照上面介绍的顺序来分析一下,上述的代码的执行结果:

首先我们先看程序的执行入口,也就是main方法。main方法创建一个A对象。又因为A对象继承了B对象,又因为B对象包括静态代码块所以,按照上面介绍的那样,程序一定先输出Load B1!和Load B2!。但这两条语句执行完后,而不会输出create B而是会输出Load A!。因为静态代码块的优先级要大于构造方法的优先级的,不管父类还是子类。又因为父类的构造方法的优先级大于子类的构造方法,所以程序的运行结果,就显而易见了。结果就是:

Load B1!
Load B2!
Load A!
create B
create A

这就是上述面试题所考察的知识点。

  1. 受教,学习了

    回复