日期:2014-05-20  浏览次数:20699 次

Java Static 和 构造方法 和 默认{}执行顺序
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.执行构造方法
------解决方案--------------------
探讨

引用:

初始化顺序就是这样的. (每一层)构造方法是最后执行的.

你能把JVM的执行顺序贴出来吗?

------解决方案--------------------
没静态的代码块也会被执行