为什么我不能从其内部 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 ,这让我很困惑,因为指向TestNested
的this
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".
由于 b
是 a
的内部 class,因此 b
的实例不能存在于 a
的实例之外。这意味着您所在的 b
实例包含在 a
实例中。我采用快捷方式将此特定实例称为 "the instance of a
you're in"(从技术上讲,您在 b
中,它在 a
中)。
所以,在b
的非静态方法的上下文中:
this
指的是你所在的b
实例。这是这个关键字的标准用法。
b.this
、a.b.this
或 TestNested.a.b.this
与此处的 this
相同,区别仅在于您更精确地限定了 class b
.
a.this
或 TestNested.a.this
都指的是您所在的 a
的实例(TestNested.a
只是对 a
的更精确限定) .这个 a
对象存在是因为 b
是 a
的内部 class,这意味着 b
的每个实例都链接到 [=11= 的实例].这是引用 a
. 实例的唯一方法
TestNested.this
会引用您所在的 TestNested
的实例。但是 您不在 TestNested
的任何实例中,所以它没有任何意义,因此编译错误。您在 b
的实例中,它在 a
的实例中(因为 b
是 a
的内部 class)。 a
的实例本身存在,因为 a
是 TestNested
的静态嵌套 class,因此它没有链接到 TestNested
的实例。
TestNested.a
<-- 引用一个静态变量 class
this.a
<-- 引用一个对象的实例变量
TestNested.this
<-- 尝试从静态上下文引用对象,但 "this" 在静态上下文中不存在。
您可以从非静态引用静态内容,但反之则不行。
据我所知,非静态方法将为其 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 ,这让我很困惑,因为指向TestNested
的this
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".
由于 b
是 a
的内部 class,因此 b
的实例不能存在于 a
的实例之外。这意味着您所在的 b
实例包含在 a
实例中。我采用快捷方式将此特定实例称为 "the instance of a
you're in"(从技术上讲,您在 b
中,它在 a
中)。
所以,在b
的非静态方法的上下文中:
this
指的是你所在的b
实例。这是这个关键字的标准用法。b.this
、a.b.this
或TestNested.a.b.this
与此处的this
相同,区别仅在于您更精确地限定了 classb
.a.this
或TestNested.a.this
都指的是您所在的a
的实例(TestNested.a
只是对a
的更精确限定) .这个a
对象存在是因为b
是a
的内部 class,这意味着b
的每个实例都链接到 [=11= 的实例].这是引用a
. 实例的唯一方法
TestNested.this
会引用您所在的TestNested
的实例。但是 您不在TestNested
的任何实例中,所以它没有任何意义,因此编译错误。您在b
的实例中,它在a
的实例中(因为b
是a
的内部 class)。a
的实例本身存在,因为a
是TestNested
的静态嵌套 class,因此它没有链接到TestNested
的实例。
TestNested.a
<-- 引用一个静态变量 class
this.a
<-- 引用一个对象的实例变量
TestNested.this
<-- 尝试从静态上下文引用对象,但 "this" 在静态上下文中不存在。
您可以从非静态引用静态内容,但反之则不行。