0%

类初始化与实例初始化顺序

先类初始化,后实例初始化。

类初始化从 main 函数所在类开始。如果这个类有父类,则父类先于子类初始化。

类初始化执行的是<clinit>()方法,执行这个方法是按照下面顺序:

  • 静态变量赋值代码块和静态代码块,谁在前先执行谁。

实例初始化是执行<init>()方法。实例化时调用的构造方法,最前默认有一行super()调用父类的构造方法。这时执行顺序如下:

  • 按从上到下执行父类中的非静态变量赋值,非静态代码块。
  • 父类的无参构造,固定在实例化最后执行。
  • 按从上到下执行子类中的非静态变量赋值,非静态代码块。
  • 子类的无参构造,也固定在实例化最后执行。

在上面过程中,如果父类初始化时调用了和子类同名的方法,那么执行的是子类的方法,因为父类方法被重写了。注意静态代码块、final 修饰、private修饰的方法不会被重写。