PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 因为那是一个静态内部类,无论是什么类,现代JVM都是在用到的时候才会初始化。看,RandomNumberGeneratorHolder是个静态内部类,不是一个静态变量。 private static final class RandomNumberGeneratorHolder { static final Random randomNumberGenerator = new Random(); }
作者回复: 没啥特殊的好处吧我感觉。除了能简单优雅的实现单例模式之外,好处可能就是它一方面可以减少类的可见性,或者说减少java source文件的数量,让相关的类都集中在一个文件里;一方面可以在内部类里访问外部类的属性,比如HashMap里就有很多内部类
作者回复: 我们可以用代码实现单例模式,就好像Math里创建random的代码。如果不用我们的代码,那自然随便怎么创建对象
作者回复: JVM规范只是规定类扎在第一次使用之前就必须初始化好。实际情况下类都是在第一次使用时加载和初始化的。而且类的初始化只会执行一次。使用这个性质,可以把需要单例的类A的实例作为一个别的类B的静态变量,可以保证只有在通过B用到A的这个静态变量时候才会创建这个A的实例。也就完美的以最安全、最小代价、最简单可靠的代码,实现了单例模式
作者回复: 执行setPhoneOS方法就会报错了
作者回复: 这个点不在private,而在static。 静态内部类,它是静态的。它不能访问外部类的非静态成员,但是可以访问静态成员(无论是不是private)。
作者回复: ✅,在一个类里面,不分彼此。
作者回复: ✅,同时,外部类也可以通过引用来访问静态内部类的私有成员变量。
作者回复: 是的,每种语言都有些奇怪的语法。有些时候,要解决的问题就是比较奇怪的。 说到你的问题,你说的具体是这一节中的哪个?
作者回复: 这是通过phine引用访问,意思是可以访问private。不是通过this自引用访问。因为静态的东西没有this引用 在静态方法里new一个对象也是可以访问成员方法和变量。 初学编程确实容易在这个地方弄混,我建议你斥巨资买几个小本子,一个本子代表一个对象,一张纸条代表一个引用,理解一下那个是当前对象,哪个是方法里局部变量引用操作的对象。