今天偶然机会碰到了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编程思想》也没发现答案。。。。
-----------------------------------------------------------后续更改------------------------------------------------------
由于没考虑周到,导致结果出现误差,其实外部类和内部类加载顺序一样,静态代码都是顺序执行。