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();