【发布时间】:2015-10-08 20:27:52
【问题描述】:
抽象地说,我的问题是:
非静态内部类如何访问封闭类的实例?这是为了将实例用作方法调用中的参数以及在内部类和封闭类之间访问具有相同名称的方法和变量。
就像关键字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();
}
}
请注意,我用myOuter.new Inner() 构造了一个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() 而不是它自己的。输出将是:
内部激活
外部.激活
提前感谢您的帮助。
【问题讨论】:
标签: java nested-class