参考http://blog.csdn.net/davidluo001/article/details/50173823
question 1:类加载的时候,其静态内部类是否被加载?
public class SingleDemo {
public static void main(String[] args) {
CEO ceo=new CEO();
}
}
class CEO {
{
System.out.println("@@");
}
static class InnerClass{
static{
System.out.println("!!");
}
}
}
运行结果:
所以,加载一个类的时候其静态内部类(包括内部类)不会被加载。因为一个类被加载,当且仅当某个静态成员(静态域、构造器、静态方法等)被调用时发生。
根据内部类不会在外部类加载的时候同时被加载这一特性,引出单例模式的另一种实现方式:
public class SingleDemo {
public static void main(String[] args) {
CEO ceo=CEO.getInstance();
CEO ceo1=CEO.getInstance();
System.out.println(ceo);
System.out.println(ceo1);
}
}
class CEO {
private CEO(){
System.out.println("@@");
}
public static CEO getInstance(){
return InnerClass.INSTANCE;
}
static class InnerClass{
public static final CEO INSTANCE=new CEO();
static{
System.out.println("InnerClass");
}
}
}
运行结果:
由此可以看出:虽然调用了两次getInstance(),但最终生成了一个实例,并且内部类只加载了一次
由于内部静态类只会被加载一次,故该实现方式时线程安全的