美文网首页Code设计模式
单例模式(Java内部类加载顺序)

单例模式(Java内部类加载顺序)

作者: gadfly_only | 来源:发表于2016-04-22 10:06 被阅读885次

    你真的会写单例模式吗——Java实现
    Android设计模式源码解析之单例模式
    深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题
    [转+注]单例模式的七种写法

    其中提到静态内部类方法:
    Java内部类详解
    关于java内部类加载顺序的问题

    顺序是:父类静态属性-》父类静态代码块-》子类静态变量-》子类静态代码块-》父类非静态变量-》父类非静态代码块-》父类构造函数-》子类非静态变量-》子类非静态代码块-》-》子类构造函数

    这样的加载顺序不是绝对的 因为静态变量和静态代码块跟声明顺序有关。

    对于如果静态代码块中调用静态变量,那么静态变量必须在静态代码块前面声明;如果静态代码块中没有调用静态变量,那么就跟顺序有关了,谁先声明谁先被加载。说白了还是顺序加载,之所以会出现“如果静态代码块中调用静态变量,那么静态变量必须在静态代码块前面声明”,是因为变量是声明,所以出现编译错误。

    应用到内部类中 静态变量和静态代码块跟声明顺序有关。 这样就可以解释你的问题了。内部类也是类。

    测试所用jdk版本1.8.0_20

    类静态块-类静态属性这个跟顺序有关系 如果类静态属性在类静态代码块之前 那么类静态属性先初始化

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

    相关文章

      网友评论

        本文标题:单例模式(Java内部类加载顺序)

        本文链接:https://www.haomeiwen.com/subject/gfbmlttx.html