静态代码块和静态内部类的加载顺序:当调用外部类的构造函数是,外部类的静态代码块同时被加载,但是其内部类不会同时被加载;当且仅当内部类的静态域或其构造方法或其静态方法被调用时,内部内才被加载。
因此,通过内部内实现单例,就能实现延迟加载。
package instance.innerClass; public class InstanceInnerClass { private String str; private Long currentTime; private static class InnerClass { private static final InstanceInnerClass instance = new InstanceInnerClass(); } public static InstanceInnerClass getInstance() { return InnerClass.instance; } private InstanceInnerClass() { initProperties(); } private void initProperties() { this.str = "hello world!"; this.currentTime = System.currentTimeMillis(); } public void print() { System.out.println("time:" + currentTime + " >>> " + str ); } public static void main (String[] args) { for (int i = 0; i < 3; i++) { new Thread( new Runnable() { @Override public void run() { InstanceInnerClass instance = InstanceInnerClass.getInstance(); System.out.println("hashCode:" + instance.hashCode()); instance.print(); } }).start(); } } }
其他:
使用静态内部类实现单例设计模式:http://www.cnblogs.com/zeng1994/p/7397637.html
朝花夕拾——Java静态内部类加载:https://blog.csdn.net/zhang_yanye/article/details/50344447
内部类加载顺序及静态内部类单例模式:https://blog.csdn.net/zmx729618/article/details/69227762