java类初始化顺序及过程

来源:互联网 发布:电音软件 编辑:程序博客网 时间:2024/06/14 16:30

  当一个类被首次使用时,它会执行初始化,为类变量赋予初始值,这里所说首次使用包括:

  1. 创建类的实例
  2. 初始化某个类的子类
  3. 调用类的静态成员或方法
  4. 含有main()方法的类启动
  5. 调用反射方法
可结合如下例子说明:

class Bowl {Bowl(int marker) {System.out.println("Bowl(" + marker + ")");}void f(int marker) {System.out.println("f(" + marker + ")");}}class Table {static Bowl b1 = new Bowl(1);Table() {System.out.println("Table()");b2.f(1);}void f2(int marker) {System.out.println("f2(" + marker + ")");}static Bowl b2 = new Bowl(2);}class Cupboard {Bowl b3 = new Bowl(3);static Bowl b4 = new Bowl(4);Cupboard() {System.out.println("Cupboard()");b4.f(2);}void f3(int marker) {System.out.println("f3(" + marker + ")");}static Bowl b5 = new Bowl(5);}public class StaticInitialization {public static void main(String[] args) {System.out.println("Creating new Cupboard() in main");new Cupboard();System.out.println("Creating new Cupboard() in main");new Cupboard();t2.f2(1);t3.f3(1);}static Table t2 = new Table();static Cupboard t3 = new Cupboard();} ///:
运行结果如下:



首先是主方法调用,会进行StaticInitialization类的初始化,其中static的类成员会被优先初始化,因此t2会执行初始化,可看到table类中存在静态字段b1,由于静态成员会优先构造方法执行,故b1进行初始化,直接调用构造方法,输出Bowl(1)。静态成员b1之后还有静态成员b2,因此输出Bowl(2),成员赋值完毕后会执行构造方法,输出Table()和f(1).以此类推,又回到StaticInitialization类,开始初始化t3,先为类成员赋值,同理,static的类成员会优先被初始化,因此输出Bowl(4)和Bowl(5),之后初始化非静态成员,输出Bowl(3),之后调用构造方法输出Cupboard()和f(2).最后在进入main方法执行,可根据之前的规则类推,可能有些同学会有些疑问,为什么main方法里面new Cupboard()的时候只初始化了b3?这是因为b4和b5都是静态字段,只会执行一次初始化。


    总结:

1、先执行父类的静态代码块和静态变量初始化,静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。 
2、执行子类的静态代码块和静态变量初始化。 
3、执行父类的非静态变量初始化 
4、执行父类的构造函数 
5、执行子类的非静态变量初始化 

6、执行子类的构造函数 

7、静态字段只会被初始化一次

0 0