如何访问封闭类的实例?

sni*_*10m 4 java nested-class

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

非静态内部类如何访问封闭类的实例?为了将实例用作方法调用中的参数以及访问内部类和封闭类之间具有相同名称的方法和变量,这是必需的。

像关键字一样thissuper允许您访问类和父类中具有相同名称的方法和变量的特定版本,是否有关键字来访问封闭类和封闭类中的方法和变量的版本?

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

考虑以下代码示例,其中包含两个类和一个内部类。Main 和 Outer 是“myPackage”包中的两个类(附带说明,由于未知原因,我无法在没有包/默认包的情况下使以下代码工作)。Inner 是一个内部的、非静态的 Outer 类。

package myPackage;

public class Outer {
    public void activate() {
        System.out.println("Outer.activate");
    }
    
    public class Inner {
        public void go() {
            activate();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
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();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我构造了一个Innerwith myOuter.new Inner()。由于 Inner 是非静态的,它必须在其封闭类的现有实例之上构造:在这种情况下,myOuter. 因此,当我调用myInner.go(),myInner调用activate(),它调用activate()封闭类的链接实例。所以myInner调用myOuter.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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

内部激活

内部激活

内部激活

内部激活

内部激活

内部激活

...

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

内部激活

外激活

提前感谢你的帮助。

das*_*ght 5

您可以this通过在类名前添加this关键字来访问外部类,如下所示:

Outer.this.activate();
Run Code Online (Sandbox Code Playgroud)

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

演示。