我的问题是:
非静态内部类如何访问封装类的实例?这是为了在方法调用中使用该实例作为参数并访问内部类和封装类之间具有相同名称的方法和变量。
就像关键字 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()
,输出为:
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