下面这段代码,如果Lazyholder没有static修饰,则编译不过
class Singleton2 { private static class LazyHolder { private static Singleton2 singleton; } public Singleton2 getInstance() { return LazyHolder.singleton; } }
"非静态内部类不能拥有静态变量" ,可以这样理解,因为JVM类加载的顺序为:
1.先加载类
2.执行static变量的初始化
3.对象创建
如果LazyHolder没有static,则本质上,它其实是Singleton2的非静态成员,则他必须在Singleton2对象创建之后才会进行加载,然而问题在于,另一方面根据JVM的加载顺序,static 的singleton变量又必须在LazyHolder对象存在之前完成加载,这就矛盾了。
时间: 2024-10-11 01:40:09