JAVA静态内部类加载顺序

    xiaoxiao2022-07-14  163

    今天偶然机会碰到了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编程思想》也没发现答案。。。。

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

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

    最新回复(0)