静态嵌套 class 可以访问封闭 class 的哪些成员?
What members of the enclosing class can a static nested class access?
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"是什么意思?
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.
这两个句子是否相互冗余?这两个句子有什么区别?
- 这两本书中的引述相互矛盾吗?首先
引用说静态嵌套 class 可以访问的非静态成员
包含 class,而第二个引号表示静态成员类型
只能访问封闭 class.
的静态成员
谢谢。
在 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 非常相似。不同的是,对于前者,关联是显式的依赖注入;而对于后者,实例之间的关联是隐式的。
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"是什么意思?
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.
这两个句子是否相互冗余?这两个句子有什么区别?
- 这两本书中的引述相互矛盾吗?首先 引用说静态嵌套 class 可以访问的非静态成员 包含 class,而第二个引号表示静态成员类型 只能访问封闭 class. 的静态成员
谢谢。
在 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 非常相似。不同的是,对于前者,关联是显式的依赖注入;而对于后者,实例之间的关联是隐式的。