This question already has answers here:
Calling outer class function from inner class [duplicate]

(2个答案)


4年前关闭。




我的问题,抽象地讲是:
非静态内部类如何访问封闭类的实例?为了将实例用作方法调用中的参数,并在内部类和封闭类之间使用名称相同的方法和变量进行访问,这是必需的。
就像关键字thissuper允许您访问类和父级中具有相同名称的方法和变量的特定版本一样,是否存在用于访问封闭类和封闭类中方法和变量版本的关键字?
如果您感到困惑,请继续阅读:
考虑下面的代码示例,其中包含两个类和一个内部类。 Main和Outer是软件包“myPackage”中的两个类(顺便说一句,由于未知原因,如果没有软件包/默认软件包,我无法使以下代码正常工作)。内部是外部的内部非静态类。
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();
    }
}
请注意,我使用Inner构造了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();
        }
    }
}
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()使其输出,然后调用其封闭实例版本的activate()而不是其自身的实例版本。输出将是:

内部激活
外部激活

提前感谢你的帮助。

最佳答案

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

Outer.this.activate();

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

Demo.

09-16 00:43