gpt4 book ai didi

java - 为什么我不能从其内部类的非静态方法中引用封闭类的非静态变量?

转载 作者:行者123 更新时间:2023-11-29 03:08:25 27 4
gpt4 key购买 nike

在我看来,非静态方法将为其类 obj 和所有封闭类分配“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,这让我很困惑,因为 this指向 TestNested 的变量应该是方法本身的非静态隐藏变量,那为什么不能使用自己的变量呢?

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

最佳答案

这是因为你的嵌套类a 不是 TestNested 的内部类.它是一个static 嵌套类,这意味着它没有链接到 TestNested 的特定实例。 .

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

TestNested 的实例你会期待你的表情吗TestNested.this引用?

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

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

指出对象a未链接到 t完全没有。


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

首先,this总是指一个对象:一个类的实例。

假设我们在类 b 中的非静态方法的上下文中.因为该方法是非静态的,代码将相对于 b 的特定实例执行。 .我采用快捷方式将此特定实例称为“您所在的 b 的实例”。

ba 的内部类, 没有 b 的实例可以存在于 a 的实例之外.这意味着 b 的实例您所在的位置包含在 a 的实例中.我采用快捷方式将此特定实例称为“您所在的 a 的实例”(从技术上讲,您所在的 b 位于 a 中)。

因此,在 b 的非静态方法的上下文中:

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

关于java - 为什么我不能从其内部类的非静态方法中引用封闭类的非静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30809390/

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