先类初始化,后实例初始化。
类初始化从 main 函数所在类开始。如果这个类有父类,则父类先于子类初始化。
类初始化执行的是<clinit>()
方法,执行这个方法是按照下面顺序:
- 静态变量赋值代码块和静态代码块,谁在前先执行谁。
实例初始化是执行<init>()
方法。实例化时调用的构造方法,最前默认有一行super()
调用父类的构造方法。这时执行顺序如下:
- 按从上到下执行父类中的非静态变量赋值,非静态代码块。
- 父类的无参构造,固定在实例化最后执行。
- 按从上到下执行子类中的非静态变量赋值,非静态代码块。
- 子类的无参构造,也固定在实例化最后执行。
在上面过程中,如果父类初始化时调用了和子类同名的方法,那么执行的是子类的方法,因为父类方法被重写了。注意静态代码块、final 修饰、private修饰的方法不会被重写。