Java 如何访问封闭类的实例?

Java 如何访问封闭类的实例?,java,nested-class,Java,Nested Class,抽象地说,我的问题是: 非静态内部类如何访问封闭类的实例?这是将实例用作方法调用中的参数以及访问内部类和封闭类之间名称相同的方法和变量时所必需的。 与关键字this和super一样,允许您访问类和父类中名称相同的方法和变量的特定版本,是否有关键字访问封闭类和封闭类中方法和变量的版本 如果您感到困惑,请继续阅读: 考虑以下代码示例,其中包含两个类和一个内部类。Main和Outer是包“myPackage”中的两个类(顺便说一句,没有包/在默认包中,由于未知的原因,我无法使以下代码正常工作)。Inn

抽象地说,我的问题是:

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

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

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

考虑以下代码示例,其中包含两个类和一个内部类。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();
        }
    }
}

请注意,我使用
myOuter.new internal()
构造了一个
internal
。由于internal是非静态的,因此必须在其封闭类的现有实例上构造它:在本例中,
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();
        }
    }
}

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

内部激活

内部激活

内部激活

内部激活

内部激活

内部激活

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

内部激活

外。激活


提前感谢您的帮助。

通过将类名称预先挂起到
this
关键字,您可以访问外部类的
this
,如下所示:

Outer.this.activate();
这将
This
的范围解析为引用外部类的对象,外部类隐式存储在非静态内部类的对象中


完美。正是我所需要的。
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();
    }
}
Outer.this.activate();