JAVA静态内部类加载顺序

今天偶然机会碰到了JAVA的静态内部类加载实例,原本以为和外部类一样,但实验结果确出人意料,特此记录。希望大牛们能指出原因所在。

首先给上代码:

public class LoadTest2 {

    public static class Inner{//静态内部类中的静态熟悉和静态代码块按照顺序加载

        static {
            System.out.println("Innter Static!");
        }
        {
            System.out.println("-----------------");
        }
        public static LoadTest2 load = new LoadTest2(3);
        static int k = 10;
        static {
            System.out.println("Innter Static2!" + k);
        }


    }

    public static LoadTest2 getInstance()
    {
        return Inner.load;
    }

    LoadTest2(int value)
    {
        System.out.println("Construct "+value);
    }

    static {
        System.out.println("LoadTest Static!");
    }

    public static LoadTest2 loadout = new LoadTest2(1);

    public static void main(String[] args) {
        LoadTest2 load = new LoadTest2(2);
        load.getInstance();
        LoadTest2.getInstance();
       //new LoadTest2.Inner();
    }
}

在外部类加载时(暂时不考虑继承),加载顺序是静态代码块-->静态变量-->普通代码块-->普通变量-->构造方法,则在主函数中创建LoadTest2的实例时首先加载外部类中的静态代码块,输出:

LoadTest Static!

再加载静态属性,输出:

Construct 1

加载构造方法,输出:

Construct 2

在第2行调用getInstance方法时,会调用主类静态变量,这时候主类会加载,原本以为也是先加载静态代码块,然后加载静态属性,但输出结果是:

Innter Static!
Construct 3
Innter Static2!10

静态代码块里面的静态代码块和静态变量按顺序输出???翻了下《JAVA编程思想》也没发现答案。。。。

-----------------------------------------------------------后续更改------------------------------------------------------

由于没考虑周到,导致结果出现误差,其实外部类和内部类加载顺序一样,静态代码都是顺序执行。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值