这可能是一个奇怪的问题,但我不知道如何设法使它起作用。我的意图是从覆盖该字段的对象访问超级字段。首先,什么起作用(1):
class Foo {
protected int i = 0;
}
public class Bar extends Foo {
int i = 1;
Foo f() {
return this;
}
public static void main (String[] args) {
Bar b = new Bar();
System.out.println(b.i);
System.out.println(b.f().i);
}
}
我首先尝试使用类似(2)的方法:
System.out.println(b.super.i);
这没有用。然后,我尝试使用(3):
Foo f() {
return super;
}
那也不起作用。
因此,请参考上面的编号部分:
为什么
return this
强制转换为Foo返回对b.super对象的引用?在
main
中,我以为b.super
是对实例化对象“ b”的超级引用的引用。有什么方法可以从包含对象访问对超级对象的引用?也许是从反思中得到的东西,但是我不想访问.class对象(b.getClass().getSuper()
),而是希望访问b中包含的实例化Foo。为什么
return.super
不返回对b.super对象的引用? 最佳答案
我的意图是从覆盖该字段的对象访问超级字段。
您不是在“覆盖”该字段。您正在创建另一个不相关的同名字段。产生的名称冲突是您遇到困难的直接原因。
如果两个字段不相关,请给它们提供不同的名称。
另一方面,如果您尝试实现多态行为,请将其转换为方法:
class Foo {
protected int get_i() { return 0; }
}
public class Bar extends Foo {
@Override
protected int get_i() { return 1; }
}