单例模式的静态内部类方法的安全性是因为在类加载的时候静态属性初始化仅一次,之后便不会再进行初始化,达到只有一个实例对象的目的,且静态内部类里面的静态属性或静态代码块不会在外部类加载的时候进行初始化,只在内部类加载的时候加载。
public class StaticInnerClass {
static {
System.out.println("OuterClass");
}
private static class InnerClass {
static{
System.out.println("InnerClass");
}
private static final StaticInnerClass staticInnerClass = new StaticInnerClass();
}
public static StaticInnerClass getStaticInnerClass() {
return InnerClass.staticInnerClass;
}
public static void main(String[] args) {
System.out.println(getStaticInnerClass());
}
}
OuterClass
InnerClass
learnjava.innerClass.StaticInnerClass@4554617c
Process finished with exit code 0
将main中的输出语句注释掉,表示不对内部类进行加载
public class StaticInnerClass {
static {
System.out.println("OuterClass");
}
private static class InnerClass {
static{
System.out.println("InnerClass");
}
private static final StaticInnerClass staticInnerClass = new StaticInnerClass();
}
public static StaticInnerClass getStaticInnerClass() {
return InnerClass.staticInnerClass;
}
public static void main(String[] args) {
// System.out.println(getStaticInnerClass());
}
}
OuterClass
Process finished with exit code 0