- Java code
package mysql;public class Test extends Test1 { static{ System.out.print("3"); } { System.out.print("1"); } Test() { System.out.print("2"); } { System.out.print("4"); } public static void main(String[] args) { new Test(); }}
- Java code
package mysql;public class Test1 { Test1() { System.out.print("5"); } static { System.out.print("6"); }}
- Java code
执行顺序是:635142
4为什么会在2前面。
------解决方案--------------------------------------------------------
下面给你参考。
http://java-mzd.iteye.com/blog/838683
这个为什么得问JVM设计时候怎么想的了。。。
而且我觉得挺合理的。 嘿嘿。
------解决方案--------------------------------------------------------
初始化顺序就是这样的. (每一层)构造方法是最后执行的.
------解决方案--------------------------------------------------------
1、进入 启动类 Test 的main
2、因为 Test extends Test1,所以加载 Test1,加载时先 执行static部分的代码 ,加载完 Test1;
6
3、接着加载 Test,执行Test的static部分的代码
3
4、new Test() ,需要先初始化 Test1的非static部分代码 即类定义中{}中的代码,因为没有{}部分代码,所以执行构造函数
5
5、接着执行Test的非static部分代码即类定义中{}中的代码,从类定义由上往下
1
4
6、执行Test的构造函数
2
所以顺序:635142
------解决方案--------------------------------------------------------
请参考下这个链接吧,可能对你有帮助
JAVA初始化顺序
------解决方案--------------------------------------------------------
建议看看<深入java虚拟机>一书关于类初始化的顺序
4为什么在2前面?
答:
因为每个对象在堆中创建的时候,都要执行类的<init>方法来初始化对象,这个init方法执行如下三个步骤:
1.如果有父类,则执行父类的init方法
2.执行对象的初始化方法(直接给成员变量赋值,初始化块都在这阶段执行,谁放在前面就先执行谁)
3.执行构造方法
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
没静态的代码块也会被执行