深入java初始化
http://blog.csdn.net/axman/article/details/167955
在类装载(load)时,JVM会调用内置的<clinit>方法对类成员和静态初始化块进行初始化调用。它们
的顺序按照源文件的原文顺序。
要明白的是,"<clinit>"方法不仅是类初始化方法,而且也是接口初始化方法。并不是所以接口
的属性都是内联的,只有直接赋常量值的接口常量才会内联。而
[public static final] double d = Math.random()*100;
这样的表达式是需要计算的,在接口中就要由"<clinit>"方法来初始化。
下面我们再来看看实例初始化方法"<init>"
"<init>"用于对象创建时对对象进行初始化,当在HEAP中创建对象时,一旦在HEAP分配了空间。最
先就会调用"<init>"方法。这个方法包括实例变量的赋值(声明不在其中)和初始化块,以及构造
方法调用。如果有多个重载的构造方法,每个构造方法都会有一个对应的"<init>"方法。构造方法
隐式或显示调用父类的构造方法前,总是先执行实例变量初始化和初始化块.同样,实例变量和初始
化块的顺序也是按源文件的原文顺序执行,构造方法中的代码在最后执行
初始化顺序 (父类会首先加载)static->实例变量初始化和初始化块->constructor
package learnthread.basic; public class Test2 extends Test1 { { System.out.print("1"); } Test2() { System.out.print("2"); } static { System.out.print("3"); } { System.out.print("4"); } public static void main(String[] args) { new Test2(); } } class Test1 { Test1() { System.out.print("5"); } static { System.out.print("6"); } }
输出为635142
如果没有new Test2()只对static变量进行初始化

浙公网安备 33010602011771号