为什么我不能从其内部 class 的非静态方法中引用包含 class 的非静态变量?

Why can't I refer enclosing class's non-static var from its inner class's non-static method?

据我所知,非静态方法将为其 class obj 和所有包含的 classes 分配 "this" 个变量。

public class TestNested {

int a=4;

public static class a{

    int a=5;

    static int c=10;

    class b{

        int a=6;

        void aaa(){

            int a=7;

            TestNested t=new TestNested();

            System.out.println(this.a);

            System.out.println(b.this.a);

            System.out.println(TestNested.a.b.this.a);

            System.out.println(TestNested.a.this.a);

            System.out.println(a.this.a);

            System.out.println(t.a);

            System.out.println(TestNested.this.a);

        }
    }
}

void r(){

    TestNested t=new TestNested();

    TestNested.a a=new TestNested.a();

    a.b b=a.new b();

    b.aaa();
}

public static void main(String[] args) {

    TestNested t=new TestNested();

    t.r();
}
}

在这种情况下void aaa()的最终语句是System.out.println(TestNested.this.a);会被判编译错误,原因是:'com.xxx.TestNested.this' cannot be referenced from static context ,这让我很困惑,因为指向TestNestedthis var应该是方法本身的非静态隐藏var,那为什么它不能使用自己的var呢?

或者如果我的意识是错误的,每个 that var 都被分配到方法的 class 中的每个 class 中,但是 void aaa() 不是静态的这意味着它可以引用非静态 var rite 的方法?甚至该方法不是静态的,但如果它的封闭 class 之一是静态的,它会被自动识别为静态成员吗​​?

这是因为您的嵌套 class a 而不是 TestNested 的内部 class。它是一个 static 嵌套 class,这意味着它没有链接到 TestNested.

的特定实例

Note: an inner class is a non-static nested class.

您希望表达式 TestNested.this 指的是 TestNested 的哪个实例?

顺便说一句,你可以看到你在这里没有引用你的变量 t:

TestNested.a a=new TestNested.a();

指出对象 a 根本没有链接到 t


在我上面的回答中,我假设你很清楚你在用 this 做什么。根据您的评论,情况似乎并非如此,所以我将在这里尝试澄清一下。

首先,this 总是引用一个对象:class 的一个实例。

假设我们在 class b 中的非静态方法的上下文中。因为该方法是非静态的,代码将相对于 b 的特定实例执行。我使用快捷方式将此特定实例称为 "the instance of b you're in".

由于 ba 的内部 class,因此 b 的实例不能存在于 a 的实例之外。这意味着您所在的 b 实例包含在 a 实例中。我采用快捷方式将此特定实例称为 "the instance of a you're in"(从技术上讲,您在 b 中,它在 a 中)。

所以,在b的非静态方法的上下文中:

  • this指的是你所在的b实例。这是这个关键字的标准用法。
  • b.thisa.b.thisTestNested.a.b.this 与此处的 this 相同,区别仅在于您更精确地限定了 class b.
  • a.thisTestNested.a.this 都指的是您所在的 a 的实例(TestNested.a 只是对 a 的更精确限定) .这个 a 对象存在是因为 ba 的内部 class,这意味着 b 的每个实例都链接到 [=11= 的实例].这是引用 a.
  • 实例的唯一方法
  • TestNested.this 会引用您所在的 TestNested 的实例。但是 您不在 TestNested 的任何实例中,所以它没有任何意义,因此编译错误。您在 b 的实例中,它在 a 的实例中(因为 ba 的内部 class)。 a 的实例本身存在,因为 aTestNested 的静态嵌套 class,因此它没有链接到 TestNested 的实例。

TestNested.a <-- 引用一个静态变量 class

this.a <-- 引用一个对象的实例变量

TestNested.this <-- 尝试从静态上下文引用对象,但 "this" 在静态上下文中不存在。

您可以从非静态引用静态内容,但反之则不行。