在我的意识中,非静态方法将为其类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'无法从静态上下文中引用,这真让我感到困惑,因为指向this
的{{1}} var应该是方法本身的非静态隐藏var,那么为什么它不能使用自己的var?< / p>
或者,如果我的意识错误,则在方法类的每个类中分配了每个TestNested
var,但that
不是静态方法,这意味着它可以引用非静态var仪式?或者甚至该方法不是静态的,但如果它的一个封闭类是静态的,它会被自动识别为静态成员吗?
答案 0 :(得分:4)
这是因为您的嵌套类a
不是TestNested
的内部类。它是一个 static 嵌套类,这意味着它没有链接到TestNested
的特定实例。
注意:内部类是非静态嵌套类。
您期望表达式TestNested
引用TestNested.this
的哪个实例?
顺便说一句,您可以在此处看到您未引用变量t
:
TestNested.a a=new TestNested.a();
指出对象a
根本没有链接到t
。
在上面的回答中,我认为你对this
所做的事情很清楚。根据你的评论,似乎并非如此,所以我将在这里尝试澄清它。
首先,this
总是引用一个对象:一个类的实例。
我们假设我们在类b
中的非静态方法的上下文中。因为该方法是非静态的,所以代码将相对于b
的特定实例执行。我使用快捷方式将此特定实例称为&#34; b
的实例在&#34;。
由于b
是a
的内部类,因此在b
的实例之外不能存在a
的实例。这意味着您所在的b
实例包含在a
的实例中。我使用快捷方式将此特定实例称为&#34; a
的实例在&#34; (从技术上讲,您位于b
中的a
。
因此,在b
的非静态方法的上下文中:
this
指的是您所在的b
的实例。这是此关键字的标准用途。b.this
,a.b.this
或TestNested.a.b.this
与此处的this
相同,不同之处仅在于您更准确地限定了类b
。a.this
或TestNested.a.this
都引用了您a
的实例(TestNested.a
只是a
的更精确的限定条件) 。存在此a
对象是因为b
是a
的内部类,这意味着b
的每个实例都链接到a
的实例。这是引用a
。TestNested.this
会引用您TestNested
的实例。但您不在TestNested
的任何实例中,所以它没有任何意义,因此编译错误。您位于b
的实例中,该实例位于a
的实例中(因为b
是a
的内部类)。 a
的实例本身就存在,因为a
是TestNested
的静态嵌套类,因此它未链接到TestNested
的实例。答案 1 :(得分:0)
TestNested.a
&lt; - 引用静态类的静态变量
this.a
&lt; - 引用对象的实例变量
TestNested.this
&lt; - 尝试从静态上下文引用一个对象,但是&#34;这个&#34;在静态上下文中不存在。
您可以引用非静态内容,但反之亦然。