关于这个问题,我这么和你说吧。注意看。
java中关于执行顺序的问题在构造代码块、静态代码块、以及主函数之间有几个小细节要注意。 java中静态代码块Static{}随着类的第一次加载而执行,只执行一次,并优于主函数执行。 而构造代码块{}的作用是给所有对象统一初始化。对象一建立就运行,而且优先于构造函数执行。 构造代码块和构造函数的区别:构造代码块是给所有对象初始化,而构造函数是给对应的对象初始化。 比如有如下代码: class StaticCode { //静态代码块 static { System.out.println("a"); } //下面是构造代码块 { System.out.println("b"); } public static void show() { System.out.println("show run"); } } class StaticCodeDis { static { System.out.println("主函数中的静态代码块优先于主函数执行的例子!执行第一次"); } public static void main(String[] args) { System.out.println("Hello World!"); StaticCode.show(); StaticCode s=new StaticCode(); } static { System.out.println("主函数中的静态代码块优先于主函数执行的例子!执行第二次"); } }我们javac和java之后得到的运行结果会是: 主函数中的静态代码块优先于主函数执行的例子!执行第一次 主函数中的静态代码块优先于主函数执行的例子!执行第二次 Hello World! 因为当StaticCodeDis加载后,该类会执行该类下的静态代码块,该类下有两处静态代码块。因此打印出 “ 主函数中的静态代码块优先于主函数执行的例子!执行第一次 主函数中的静态代码块优先于主函数执行的例子!执行第二次 Hello World! a show run b ” 这时类再调用主函数StaticCodeDis.main(),在main中我们又调用了StaticCode.show() 方法,这时StaticCode类就被加载进来,同理,静态代码块优先执行,这时会执行StaticCode下的静态代码块,因此输出a,当静态代码块执行完毕后,会执行调用的show()方法,输出show run。当执行到StaticCode s=new StaticCode()时;对象建立,因此会优先执行构造代码块{System.out.println("b");},因此打印出一个b。 java中构造代码块、构造函数、静态代码块、以及主函数之间的一些小细节要多加注意,不然面试的时候就会出问题。 |