Java程序的初始化顺序

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

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


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

Java

IntegerCache

2018-5-22 21:34:50

Java异常

com.mysql.jdbc.Driver

2019-10-13 14:50:28

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索