我试图理解Java. 有一些代码:
class A {
A getThis() {
System.out.println("call getThis() from A");
return this; //(3)
} //(3)
Object getSuper() {
System.out.println("call getSuper() from A");
return null;}
}
class B extends A {
B getThis() {
System.out.println("call getThis() from B");
return this;
}
A getSuper() {
System.out.println("call getSuper() from B");
return super.getThis();
}
}
class Tester {
public static void main (String[] args) {
Object a = new B().getSuper(); //(1)
System.out.println(a);
a = new B().getSuper().getSuper(); //(2)
System.out.println(a);
}
}
结果,控制台上显示以下文本:
从 B 调用 getSuper()
从 A 调用 getThis()
B@25154f
从 B 调用 getSuper()
从 A 调用 getThis()
从 B 调用 getSuper()
从 A 调用 getThis()
B@10dea4e
我预计当第 (1) 行被处理时,a类的一个实例将在 中A,而在第 (2) 行被处理后,a它将是null。为什么this从第 (3) 行返回的结果不是返回父类的引用,而是返回原始类的引用?
据我了解,当创建一个类的实例时B,它会存储对父类实例的引用A。我看到间接证实了我的话:
当调用类构造函数时B,类构造函数被调用A。即使在重写f类 B 中的方法时,您也可以通过;访问f类方法。
尽管如此,在处理类的实例时,我看不到一种方法可以从中返回对其中使用的类实例的引用。有什么办法可以使这成为可能吗?Asuper.f()BA