我的问题,用抽象的术语来说:
非静态内部类如何访问封闭类的实例?为了在实例调用中使用实例作为参数以及访问内部类和封闭类之间具有相同名称的方法和变量,这是必需的。
与关键字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();
}
}
}
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()
,输出为:
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
提前感谢您的协助。
答案 0 :(得分:3)
您可以通过将类的名称预先挂起到this
关键字来访问外部类的this
,如下所示:
Outer.this.activate();
这解析了this
引用外部类的对象的范围,该对象隐式存储在非静态内部类的对象中。