首页 > 解决方案 > Oracle Java 教程 - 静态类 - 教程中可能出现的错误

问题描述

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

这是教程中的错误,还是我可能不太了解某些内容?谢谢

标签: java

解决方案


这是教程中的错误,还是我不太了解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)方法参数中。


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


推荐阅读