作者:老黑_微笑 | 来源:互联网 | 2022-12-05 20:32
我是Java的新手,从Oracle Java教程学习Java.我现在正在学习嵌套类,静态类和内部类.我发现以下解释似乎很奇怪,我认为这是错误的.
来自:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
嵌套类是其封闭类的成员.非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有.静态嵌套类无权访问封闭类的其他成员
最后一句"静态嵌套类无法访问封闭类的其他成员"很奇怪,但可能引用实例成员,说静态类就像一个静态方法,无法访问实例变量.但下一个注意事项甚至更奇怪:
注意:静态嵌套类与其 外部类(和其他类)的实例成员交互,就像任何其他顶级类一样.实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包.
这看起来很奇怪,因为它意味着静态类无法访问外部类的私有实例成员.我编写了以下编译和运行的代码,并演示了静态类可以访问外部实例私有变量.
public class A {
private int x;
static private int y;
static public class B{
static void doSomething(){
y++;
System.out.println("y is now " + y );
}
static void doSomethingElse(A a)
{
a.x++;
System.out.println("a.x is " + a.x );
}
}
}
// ------
public class Main {
public static void main(String[] args){
A a = new A();
A.B b = new A.B();
b.doSomething();
b.doSomethingElse(a);
}
}
这是教程中的错误,还是我可能不理解某些内容?谢谢
1> Hovercraft F..:
在教程中这是一个错误,或者我可能不理解somwthing?
错误在于您的理解,并且教程是正确的.嵌套的静态类中没有任何地方可以直接操作外部类的实例字段.我在谈论这些没有附加实例的字段 - 在x
没有附加到A
实例的情况下,您无法直接操作.
所以你可以这样做:
static void doSomethingElse(A a) {
a.x++; // x is part of the A instance passed into a parameter
System.out.println("a.x is " + a.x );
}
但你不能这样做:
static void doSomethingElse2() {
x++;
System.out.println("x is " + x );
}
如果B
是静态嵌套或独立的非嵌套类,则此代码将是相同的.
你问:
"静态嵌套类与其外层类的实例成员交互,就像任何其他顶级类一样"?
正如上面所示 - 非静态嵌套类可以直接与a
字段交互(如图doSomethingElse2()
所示),而不需要支持A
实例,而静态嵌套类和独立类都不能.它们都需要单独的A实例,此处将其传递给您的doSomethingElse(A a)
方法参数.
静态嵌套和独立的主要区别在于,前者(嵌套类)可以访问外部类的私有成员,而独立的则不能.也许这是你困惑的根源.