如何访问封闭类的实例?

4

我的问题是:

非静态内部类如何访问封装类的实例?这是为了在方法调用中使用该实例作为参数并访问内部类和封装类之间具有相同名称的方法和变量。

就像关键字 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();
        }
    }
}

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是非静态的,它必须基于其封闭类的现有实例进行构造:在这种情况下,是myOuter。因此,当我调用myInner.go()时,myInner调用activate(),该方法调用其链接的封闭类实例上的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使用该版本而不是封闭类实例中的版本。因此,myInner调用myInner.activate(),输出如下:

Inner.activate

Inner.activate

Inner.activate

Inner.activate

Inner.activate

Inner.activate

...

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

Inner.activate

Outer.activate

提前感谢您的协助。
1个回答

6

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

Outer.this.activate();

这会将this的作用域解析为引用外部类的对象,这个对象隐含地存储在非静态内部类的对象中。

演示。


完美。正是我所需要的。 - snickers10m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接