访问外部类的领域

时间:2011-06-30 15:18:13

标签: 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;
        }
    }
}

我还尝试了Outer.parameter.field和许多其他变体。有没有我想要的语法?

3 个答案:

答案 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用于其自身目的,但您无权访问此合成字段。