如何访问封闭 class 的实例?

How do I access the instance of an enclosing class?

我的问题,抽象地说,是:

非静态内部 class 如何访问封闭 class 的实例?这是为了在方法调用中使用实例作为参数以及访问内部和封闭 class.

之间具有相同名称的方法和变量的目的所必需的

像关键字 thissuper 允许您访问特定版本的方法和变量在 class 和父级中具有相同的名称,是否有关键字可以访问的版本封闭 classes 和封闭 classes?

中的方法和变量

如果您感到困惑,请继续阅读:

考虑以下代码示例,其中包含两个 class 和一个内部 class。 Main 和 Outer 是包“myPackage”中的两个 classes(附带说明,如果没有 package/in 默认包,我无法使以下代码工作,原因不明)。 Inner 是 Outer.

的内部非静态 class
package myPackage;

public class Outer {
    public void activate() {
        System.out.println("Outer.activate");
    }
    
    public class Inner {
        public void go() {
            activate();
        }
    }
}

package myPackage;

import myPackage.Outer.Inner;

public class Main {

    public static void main(String[] args) {
        Outer myOuter = new Outer();
        Inner myInner = myOuter.new Inner();
        myInner.go();
    }
}

请注意,我用 myOuter.new Inner() 构造了一个 Inner。由于 Inner 是非静态的,因此它必须在其封闭 class 的现有实例之上构建:在本例中为 myOuter。因此,当我调用 myInner.go() 时,myInner 调用 activate(),后者在其封闭 class 的链接实例上调用 activate()。所以myInner调用myOuter.activate(),输出为:

Outer.activate


现在,考虑以下更改:

package myPackage;

public class Outer {
    public void activate() {
        System.out.println("Outer.activate");
    }
    
    public class Inner {
        public void activate() {
            System.out.println("Inner.activate");
            activate();
        }
    }
}

package myPackage;

import myPackage.Outer.Inner;

public class Main {

    public static void main(String[] args) {
        Outer myOuter = new Outer();
        Inner myInner = myOuter.new Inner();
        myInner.activate();
    }
}

现在当我调用 myInner.activate() 时,myInner 输出,然后调用 activate()。但是,由于 Inner 现在有一个名为 activate() 的方法,myInner 使用该版本而不是封闭 class 实例中的版本。所以myInner调用myInner.activate(),输出为:

Inner.activate

Inner.activate

Inner.activate

Inner.activate

Inner.activate

Inner.activate

...

一遍又一遍,以堆栈溢出错误结束。所以我在这种情况下的问题是如何更改 Inner.activate() 使其输出,然后调用其封闭实例版本的 activate() 而不是它自己的。输出将是:

Inner.activate

Outer.activate

在此先感谢您的帮助。

您通过在 class 的名称前加上 this 关键字来访问外部 class 的 this,如下所示:

Outer.this.activate();

这将 this 的范围解析为引用外部 class 的对象,该对象隐式存储在非静态内部 classes 的对象中。

Demo.