[英]Access super field from subclass object
这可能是一个奇怪的问题,但我不知道如何设法使它起作用。 我的意图是从覆盖该字段的对象访问超级字段。 首先,什么起作用(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; }
}
您不需要反射,您需要在超类中定义setter和getter方法。
由于字段不能被覆盖,因此当您在子类中使用相同的名称时,它们将保持隐藏状态。 因此,如果您在子类中重新定义了字段,则无法访问这些超类字段。
如果要访问这些,则应提供超类中的getters/setters
。
i
会创建另一个字段,该字段恰好与超类中的名称相同,因此将其隐藏。 return super
没有意义。 super
不是不同的对象。 super
和this
是同一对象。 您的问题得到了回答:
为什么return.this投向Foo会返回对b.super对象的引用?
总的来说,我会认为b.super是对实例化对象“ b”的super引用的引用。 有什么方法可以从包含对象访问对超级对象的引用? 也许是从反思中得到的东西,但是我不想访问.class对象(b.getClass()。getSuper()),而是访问b中包含的实例化Foo。
为什么return.super不返回对b.super对象的引用?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.