使用场景: 在java程序中,当实例化对象时,对象的所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,
才会调用对象所在类的构造函数创建对象。
初始化的原则:
(1)静态对象优先于非静态对象初始化,静态对象只能初始化一次,但非静态对象可以初始化多次。
(2)超类优先于派生类初始化。
(3)按照成员变量定义的顺序来进行初始化,即使变量定义散布于方法定义之中,它们仍然在任何方法(包括构造器)被调用前初始化。
package test; /*java程序初始化的顺序:超类静态变量 超类静态代码块 子类静态变量 子类静态代码块 * 超类非静态变量 超类非静态代码块 超类构造函数 子类非静态代码块 子类非静态代码块 * 子类构造函数*/ class Base { static { System.out.println("父类静态块");//(1) } { System.out.println("父类块");//(3) } public Base() { System.out.println("父类构造方法");//(4) } public static void A() { int a;//静态方法中不能有静态常量,因为static方法共享一块内存区域,主要用于累加,如果静态常量的话就不能累加了,就冲突了 System.out.println("父类普通静态方法"); } } public class Derived extends Base { static int a=1; static int b=2; static { System.out.println("子类静态块");//(2) } { System.out.println("子类块");//(5) } public Derived() { System.out.println("子类构造器");//(6) } public static void main(String[] args) { Base.A(); new Derived(); } } /* *public static void main(String[] args) { new Derived(); Base.A(); } 父类静态块 子类静态块 父类块 父类构造方法 子类块 子类构造器 父类普通静态方法 */ /* *public static void main(String[] args) { Base.A(); new Derived(); } 父类静态块 子类静态块 父类普通静态方法 父类块 父类构造方法 子类块 子类构造器 * */