静态嵌套 class 可以访问封闭 class 的哪些成员?

What members of the enclosing class can a static nested class access?

  1. Java 完整参考说

    A static nested class is one that has the static modifier applied. Because it is static, it must access the non-static members of its enclosing class through an object. That is, it cannot refer to non-static members of its enclosing class directly. Because of this restriction, static nested classes are seldom used.

    "through an object"和"cannot ... directly"是什么意思?

  2. Java 一言以蔽之

    • A static member type can access (only) the static members of the class that contains it.

    • A static member type has access to all the static members (including any other static member types) of its containing type.

    这两个句子是否相互冗余?这两个句子有什么区别?

  3. 这两本书中的引述相互矛盾吗?首先 引用说静态嵌套 class 可以访问的非静态成员 包含 class,而第二个引号表示静态成员类型 只能访问封闭 class.
  4. 的静态成员

谢谢。

在 Java 中,嵌套的非静态 classes 具有对父 class 实例的隐藏引用。这就是他们可以访问所有 non-static 成员的原因。嵌套的 class 没有这样的实例。但是,如果父 class 通过 this.

,它的范围允许它访问父成员

所以第二个引用是说访问不会自动发生。您将引用传递给封闭的 class 并且嵌套的静态 class 可以访问它。否则,它不知道封闭 class 的地址。

没有静态方法可以直接访问实例字段,而无需先使用包含 class.

的对象对其进行限定。
class Foo {
   int myField;

   public void main(String[] args) {
       Foo foo = new Foo();
       access(foo);
   }
   public static void access(Foo obj) {
      System.out.println(myField); // <-- error, can't access myField from static 
                                   //context.
      System.out.println(obj.myField); // OK here  
   }
}

通过内部静态classes访问实例字段也是如此。

一个java静态嵌套class可以访问嵌套class的静态成员和父class的静态成员。当您了解 class 和对象在内存中的位置时,这是有道理的——只有一个 class 但有多个对象,您需要确定对象的每个实例绝对需要什么,什么是实际上是多余的,可以留在 class 中(不需要重复),所以所有方法(静态和非静态)和所有静态成员

What members of the enclosing class can a static nested class access?

您可以通过为 Java 关键字 static 指定以下含义来明确此问题的答案:

Java 中的

"Static" 表示 不考虑或与任何 class.

的任何实例相关联
  • 一个静态字段属于声明它的class并且没有被那个class的任何实例封装.随后构造的 class 的任何实例(或范围内任何 class 的任何实例或任何方法)都可以访问静态字段(这就是静态字段在并发环境中可能很危险的原因) .

  • 静态方法 是为声明它的 class 定义的,并且没有 class 的关联实例。静态方法不知道 class 个实例并且不能访问其中任何一个,除非将对实例的引用作为参数传递给它。

  • 一个static成员class在各方面都和一个普通的顶级class打包一样重要在封闭的 class 内以方便打包。就像顶级 class 一样,它的实例对封闭 class 的任何实例一无所知(除非在构造期间将对封闭 class 实例的引用传递给它们)。

  • 一个静态初始化程序块用于初始化class的静态字段,但它不知道[=52]的任何实例=].因此,他们无法初始化实例字段,因为他们无法访问它们。

因此,答案变得直观:静态嵌套 class 可以访问封闭 class 的所有成员,而无需 class 的实例即可访问这些成员。

如果将封闭的 class 实例传递给静态嵌套 class 的构造函数,则该实例的成员(包括私有成员)将在范围内。从逻辑上讲,将封闭 class 实例传递给静态嵌套 class 构造函数与使用嵌套成员 class 非常相似。不同的是,对于前者,关联是显式的依赖注入;而对于后者,实例之间的关联是隐式的。