关于java 类加载顺序

public class Singleton {
 
    public static class Inner{
        static {
            System.out.println("TestInner Static!");
        }
        public final static Singleton testInstance = new Singleton(3);
    }
 
    public static Singleton getInstance(){
        return Inner.testInstance;
    }
 
    public Singleton(int i ) {
        System.out.println("Test " + i +" Construct! ");
    }
 
    //类静态块
    static {
        System.out.println("Test Static");
    }
 
    //类静态属性
    public static Singleton testOut = new Singleton(1);
 
    public static void main(String args[]){
        Singleton t = new Singleton(2);
        Singleton.getInstance();
    }
 
}
输出结果:
Test Static Test
1 Construct! Test 2 Construct! TestInner Static! Test 3 Construct!

但是把内部类Inner的内部静态块和内部静态属性 testInstance 互换位置后,如下

public class Singleton {
 
    public static class Inner{
        public final static Singleton testInstance = new Singleton(3);
        static {
            System.out.println("TestInner Static!");
        }
    }
 
    public static Singleton getInstance(){
        return Inner.testInstance;
    }
 
    public Singleton(int i ) {
        System.out.println("Test " + i +" Construct! ");
    }
 
    //类静态块
    static {
        System.out.println("Test Static");
    }
 
    //类静态属性
    public static Singleton testOut = new Singleton(1);
 
    public static void main(String args[]){
        Singleton t = new Singleton(2);
        Singleton.getInstance();
    }
 
}

输出如下:

Test Static
Test 1 Construct! 
Test 2 Construct! 
Test 3 Construct! 
TestInner Static!

结论:

规律一、初始化构造时,先父后子;只有在父类所有都构造完后子类才被初始化

规律二、类加载先是静态、后非静态、最后是构造函数

静态构造块、静态类属性按出现在类定义里面的先后顺序初始化,同理非静态的也是一样的,只是静态的只在加载字节码是执行一次,不管你new多少次,非静态会在new多少次就执行多少次

规律三、java中的类只有在被用到的时候才会被加载

规律四、java类只有在类字节码被加载后才可以被构造成对象实例

补充:

类初始化化是分,静态,和非静态,静态是在类的字节码加载到jvm时,仅且只执行一次,按照先父后子,父子静态都初始化完后,跟据需要再初始化父子非静态部分(也就是说静态和非静态是分开的,但往往因为new的时候类即加载类同时也申请内存空间,可以先通过类名加静态方法或者静态属性代码调用来分开两个过程).

非静态是在new申请内存空间并初始化其值。java类是必须先加载字节码,然后通过new(有些不需要new,比如枚举和字符串,可以看jvm规范说明)根据字节码信息申请类的内存空间。上面的四种规律都是java虚拟机的规范严格规定的,只有实现规范的虚拟机才可以叫java虚拟机,所以ibm、oracle的虚拟机都符合上面四个规律。

文章引用于:http://www.oschina.net/question/2273217_217864

posted @ 2015-08-27 11:51  predisw  阅读(119)  评论(0编辑  收藏  举报