java类的初始化顺序

来源:互联网 发布:鼎捷软件股票 编辑:程序博客网 时间:2024/06/10 22:36

java类的初始化顺序

java类的初始化顺序常会出现在java的笔试和面试题中,本文将通过实践代码对java类的初始化顺序做个分析!

首先结论话语放前面,java类的初始化顺序依次如下:

1.父类静态成员和静态初始化快,按在代码中出现的顺序依次执行。
2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
3. 父类的实例成员和实例初始化块,按在代码中出现的顺序依次执行,且每创建一个对象就执行一次。
4.执行父类的构造方法。
5.子类实例成员和实例初始化块,按在代码中出现的顺序依次执行,且每创建一个对象就执行一次。
6.执行子类的构造方法。

演示实例1:

public class ClassInitOrder {public static void main(String[] args) {Child c1 = new Child();}}class Father{static {System.out.println("Father的static块……");}//初始化块{System.out.println("Father的初始化块……");}//构造方法public Father(){System.out.println("Father的构造方法被调用……");}}class Child extends Father{static {System.out.println("Child的static块……");}        //初始化块{System.out.println("Child的初始化块……");}        //构造方法public Child(){System.out.println("Child的构造方法被调用……");}}

程序结果:

从结果可以看出,类在初始化的时候,顺序是:

静态成员-->初始化块-->构造方法,然后按照这个顺序,父类与子类依次执行,即先父类的静态成员,再子类静态成员,接着父类初始化块,再子类初始化块,依此类推……


演示实例2:

public class ClassInitOrder {public static void main(String[] args) {Child c1 = new Child();Child c2 = new Child();}}class Child{static {System.out.println("Child的static块……");}{System.out.println("Child的初始化块……");}public Child(){System.out.println("Child的构造方法被调用……");}}

程序结果:

从结果可以看出,static块在在整个程序运行过程中,只执行一次,即static块是针对类的,不是针对对象的,static块或者说static的成员,在程序运行时第一次被访问的时候(该类的第一个对象被创建时)只初始化一次,之后不再执行;而初始化块是针对对象的,每创建一个对象,就执行一次。


演示实例3:

public class ClassInitOrder {public static void main(String[] args) {Child c1 = new Child();}}class Child{static int a, b = 3;static {a++;System.out.println("a = " + a);}static {a = b;System.out.println("a = " + a);}}

结果:

把两个static块位置换一下

public class ClassInitOrder {public static void main(String[] args) {Child c1 = new Child();}}class Child{static int a, b = 3;static {a = b;System.out.println("a = " + a);}static {a++;System.out.println("a = " + a);}}

结果:

从结果可以看出,当类中存在多个static块或者static成员时,按照他们在程序中出现的顺序依次执行!


希望对读者有帮助,转载请注明出处!

0 0