首页 > 解决方案 > 为什么我可以使用来自静态内部类的私有构造函数来实例化外部类?

问题描述

当调用 getInstance() 方法时,Singleton 类的实例将被实例化。我想知道为什么我可以从静态内部类实例化外部类?

public class Singleton{
   private Singleton(){}

   private static class SingletonHolder{
      private static Singleton INSTANCE = new Singleton();
   }

   public static Singleton getInstance(){
      return SingletonHolder.INSTANCE;
   }
}

标签: java

解决方案


JLS 6.6.1

否则,成员或构造函数被声明为私有,并且当且仅当它出现在包含成员或构造函数声明的顶级类型(第 7.6 节)的主体内时才允许访问。

您的访问发生在包含私有构造函数声明的顶级类型的主体内,因此允许访问。


所以,虽然你有什么是允许的,但这不会是:

public class Singleton{
   private Singleton(){}
   // ..
}

// Second top-level class in same file.
class Foo {
  Singleton s = new Singleton();
}

推荐阅读