This question already has answers here:
Calling outer class function from inner class [duplicate]
(2个答案)
4年前关闭。
我的问题,抽象地讲是:
非静态内部类如何访问封闭类的实例?为了将实例用作方法调用中的参数,并在内部类和封闭类之间使用名称相同的方法和变量进行访问,这是必需的。
就像关键字
如果您感到困惑,请继续阅读:
考虑下面的代码示例,其中包含两个类和一个内部类。 Main和Outer是软件包“myPackage”中的两个类(顺便说一句,由于未知原因,如果没有软件包/默认软件包,我无法使以下代码正常工作)。内部是外部的内部非静态类。
外部激活
现在,请考虑以下更改:
内部激活
内部激活
内部激活
内部激活
内部激活
内部激活
...
一遍又一遍,最终导致堆栈溢出错误。因此,在这种情况下,我的问题是如何更改
内部激活
外部激活
提前感谢你的帮助。
这将
Demo.
(2个答案)
4年前关闭。
我的问题,抽象地讲是:
非静态内部类如何访问封闭类的实例?为了将实例用作方法调用中的参数,并在内部类和封闭类之间使用名称相同的方法和变量进行访问,这是必需的。
就像关键字
this
和super
允许您访问类和父级中具有相同名称的方法和变量的特定版本一样,是否存在用于访问封闭类和封闭类中方法和变量版本的关键字?如果您感到困惑,请继续阅读:
考虑下面的代码示例,其中包含两个类和一个内部类。 Main和Outer是软件包“myPackage”中的两个类(顺便说一句,由于未知原因,如果没有软件包/默认软件包,我无法使以下代码正常工作)。内部是外部的内部非静态类。
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()
,输出为:外部激活
现在,请考虑以下更改:
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()
而不是其自身的实例版本。输出将是:内部激活
外部激活
提前感谢你的帮助。
最佳答案
您可以通过在类名之前添加this
关键字来访问外部类的this
,如下所示:
Outer.this.activate();
这将
this
的范围解析为引用外部类的对象,该对象隐式存储在非静态内部类的对象内部。Demo.
09-16 00:43