如何访问封闭 class 的实例?
How do I access the instance of an enclosing class?
我的问题,抽象地说,是:
非静态内部 class 如何访问封闭 class 的实例?这是为了在方法调用中使用实例作为参数以及访问内部和封闭 class.
之间具有相同名称的方法和变量的目的所必需的
像关键字 this
和 super
允许您访问特定版本的方法和变量在 class 和父级中具有相同的名称,是否有关键字可以访问的版本封闭 classes 和封闭 classes?
中的方法和变量
如果您感到困惑,请继续阅读:
考虑以下代码示例,其中包含两个 class 和一个内部 class。 Main 和 Outer 是包“myPackage”中的两个 classes(附带说明,如果没有 package/in 默认包,我无法使以下代码工作,原因不明)。 Inner 是 Outer.
的内部非静态 class
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 是非静态的,因此它必须在其封闭 class 的现有实例之上构建:在本例中为 myOuter
。因此,当我调用 myInner.go()
时,myInner
调用 activate()
,后者在其封闭 class 的链接实例上调用 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
使用该版本而不是封闭 class 实例中的版本。所以myInner
调用myInner.activate()
,输出为:
Inner.activate
Inner.activate
Inner.activate
Inner.activate
Inner.activate
Inner.activate
...
一遍又一遍,以堆栈溢出错误结束。所以我在这种情况下的问题是如何更改 Inner.activate()
使其输出,然后调用其封闭实例版本的 activate()
而不是它自己的。输出将是:
Inner.activate
Outer.activate
在此先感谢您的帮助。
您通过在 class 的名称前加上 this
关键字来访问外部 class 的 this
,如下所示:
Outer.this.activate();
这将 this
的范围解析为引用外部 class 的对象,该对象隐式存储在非静态内部 classes 的对象中。
我的问题,抽象地说,是:
非静态内部 class 如何访问封闭 class 的实例?这是为了在方法调用中使用实例作为参数以及访问内部和封闭 class.
之间具有相同名称的方法和变量的目的所必需的像关键字 this
和 super
允许您访问特定版本的方法和变量在 class 和父级中具有相同的名称,是否有关键字可以访问的版本封闭 classes 和封闭 classes?
如果您感到困惑,请继续阅读:
考虑以下代码示例,其中包含两个 class 和一个内部 class。 Main 和 Outer 是包“myPackage”中的两个 classes(附带说明,如果没有 package/in 默认包,我无法使以下代码工作,原因不明)。 Inner 是 Outer.
的内部非静态 classpackage 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 是非静态的,因此它必须在其封闭 class 的现有实例之上构建:在本例中为 myOuter
。因此,当我调用 myInner.go()
时,myInner
调用 activate()
,后者在其封闭 class 的链接实例上调用 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
使用该版本而不是封闭 class 实例中的版本。所以myInner
调用myInner.activate()
,输出为:
Inner.activate
Inner.activate
Inner.activate
Inner.activate
Inner.activate
Inner.activate
...
一遍又一遍,以堆栈溢出错误结束。所以我在这种情况下的问题是如何更改 Inner.activate()
使其输出,然后调用其封闭实例版本的 activate()
而不是它自己的。输出将是:
Inner.activate
Outer.activate
在此先感谢您的帮助。
您通过在 class 的名称前加上 this
关键字来访问外部 class 的 this
,如下所示:
Outer.this.activate();
这将 this
的范围解析为引用外部 class 的对象,该对象隐式存储在非静态内部 classes 的对象中。