如果引用了内部类的对象,我如何访问外部类的字段?
class Outer
{
int field;
class Inner
{
void method(Inner parameter)
{
// working on the current instance is easy :)
field = 0;
Outer.this.field = 1;
// working on another instance is hard :(
parameter.field = 2; // does not compile
parameter.Outer.this.field = 3; // does not compile
parameter.outer().field = 4; // This works...
}
// ...but I really don't want to have to write this method!
Outer outer()
{
return Outer.this;
}
}
}
我还尝试了Outer.parameter.field
和许多其他变体。有没有我想要的语法?
答案 0 :(得分:10)
这个解决方案怎么样:
class Outer
{
int field;
class Inner
{
final Outer outer = Outer.this;
void method(Inner parameter)
{
// working on the current instance is easy :)
field = 0;
Outer.this.field = 1;
// working on another instance:
parameter.outer.field = 2;
}
}
}
答案 1 :(得分:8)
从内部类的外部,我相信在引用内部类实例时,没有办法引用外部类实例的成员。当然,在非静态内部类中,您可以使用Outer.this.*
语法引用它们。
以这种方式思考:内部类实际上是一个完全独立的类。它有一个编译器生成的字段(通常命名为奇怪的this$0
)。在内部类中,该语言允许您使用Outer.this
引用该字段;然而,在内部类本身之外,语法糖是不可用的。编译器生成的字段也不是。
答案 2 :(得分:2)
有两种方法可以查看您正在做的事情,静态方法或非静态方法。
乍一看,您的示例看起来更像是一个静态方法,因为它正在操纵参数的状态而不是它自己的状态。之前已经涵盖了静态问题,例如:见In Java, how do I access the outer class when I'm not in the inner class?
但是你的例子是一个非静态的方法,我想我知道你得到了什么以及为什么你认为外部引用应该是可能的。毕竟,在其他情况下,您可以访问自己类型的其他实例的实现细节 - 例如,在覆盖equals时引用输入参数的私有成员字段是很常见的。不幸的是,我只是不认为java提供了一种引用另一个词法封闭实例的方法。这可能与the way that java actually implements non-static inner classes有关。 Java使用this$0
用于其自身目的,但您无权访问此合成字段。