gpt4 book ai didi

java - Oracle Java 教程 - 静态类 - 教程中可能存在的错误

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:00 26 4
gpt4 key购买 nike

我是 Java 的新手,正在通过 Oracle Java 教程学习 Java。我现在正在学习嵌套类、静态类和内部类。我发现以下解释似乎很奇怪,我认为这是错误的。

发件人:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

A nested class is a member of its enclosing class. Non-static nested classes (inner classes) have access to other members of the enclosing class, even if they are declared private. Static nested classes do not have access to other members of the enclosing class

最后一句“Static nested classes do not have access to other members of enclosing class”很奇怪,但可能指的是实例成员,说静态类就像一个静态方法,不能访问实例变量。但下一个音符更奇怪:

Note: A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.

这看起来很奇怪,因为它暗示静态类不能访问外部类的私有(private)实例成员。我编写了以下编译和运行的代码,并演示了静态类可以访问外部实例私有(private)变量。

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);
}
}

这是教程中的错误,还是我可能没有很好地理解某些内容?谢谢

最佳答案

Is this a mistake at the tutorial, or maybe I'm not understanding somwthing well?

错误在于您的理解,教程是正确的。在嵌套的静态类中,没有任何地方可以直接操作外部类的实例字段。我说的是没有附加实例的这些字段——如果不将 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 static nested class interacts with the instance members of its outer class just like any other top-level class"?

如上所示——非静态嵌套类可以直接a 字段交互(如 doSomethingElse2() 所示) 而不需要支持的 A 实例,而静态嵌套类和独立类都不需要。它们都需要单独的 A 实例,此处传递到您的 doSomethingElse(A a) 方法 参数


静态嵌套类和独立类之间的主要区别在于前者,即嵌套类,可以访问外部类的私有(private)成员,而独立类则不能。也许这就是您困惑的根源。

关于java - Oracle Java 教程 - 静态类 - 教程中可能存在的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52136350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com