访问外部类的领域

fre*_*low 9 java field inner-classes

在给定内部类对象的引用的情况下,如何访问外部类的字段?

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试了Outer.parameter.field许多其他变种.有没有做我想要的语法?

小智 11

这个解决方案怎么样:

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; 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ted*_*opp 8

从内部类的外部,我相信在引用内部类实例时,没有办法引用外部类实例的成员.当然,从非静态内部类中,您可以使用Outer.this.*语法引用它们.

可以这样想:内部类实际上是一个完全独立的类.它有一个编译器生成的字段(通常称为奇怪的东西this$0).在内部类中,语言允许您使用引用该字段Outer.this; 然而,在内部类本身之外,语法糖是不可用的.编译器生成的字段也不是.


jto*_*ron 3

有两种方法可以查看您正在执行的操作:静态方法或非静态方法。

乍一看,您的示例看起来更像是静态方法,因为它正在操纵参数的状态而不是其自身的状态。静态问题之前已经介绍过,例如参见在Java中,当我不在内部类中时如何访问外部类?

但你的例子是一个非静态方法,我想我明白你得到了什么以及为什么你认为外部引用应该是可能的。毕竟,在其他情况下,您可以访问自己类型的其他实例的实现细节——例如,在重写 equals 时引用输入参数的私有成员字段是很常见的。不幸的是,我只是不认为 java 提供了一种引用另一个词法封闭实例的方法。这可能与java实际实现非静态内部类的方式有关。Javathis$0有其自身的用途,但您无权访问此合成字段。