Java程序初始化的顺序
java程序初始化工作可以在许多不同的代码块中来完成(例如:静态代码块、构造函数等),他们执行的顺序如下:
- 父类静态变量
- 父类静态代码块
- 子类静态变量
- 子类静态代码块
- 父类非静态变量
- 父类非静态代码块
- 父类构造器
- 子类非静态变量
- 子类非静态代码块
- 子类构造器
public class Base { static{ System.out.println("Base static block"); } { System.out.println("Base Block"); } public Base(){ System.out.println("Base Constructor"); }}
public class Derived extends Base { static { System.out.println("Derived static block"); } { System.out.println("Derived block"); } public Derived(){ System.out.println("Derived constructor"); } public static void main(String[] args) { new Derived(); }}
执行Derived类,可以看到运行结果:
Base static blockDerived static blockBase BlockBase ConstructorDerived blockDerived constructor
Java程序初始化一般遵循3个原则
- 静态对象(变量)由于非静态对象(变量)初始化。其中静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化很多次
- 父类优先于子类进行初始化
- 按照成员变量的定义顺序进行初始化。即使变量定义散布于方法之中,他们依然在任何方法(包括构造函数)被调用前先初始化
所以,知道怎么优先于main方法,执行” Hello World”么
public class Test { static{ System.out.println("Hello World"); } public static void main(String[] args) { System.out.println("Hello Main Fun"); }}
程序输出如下:
Hello WorldHello Main Fun