深入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变量进行初始化

posted @ 2016-03-09 16:57  程序猿进化之路  阅读(114)  评论(0)    收藏  举报