繁体   English   中英

从子类对象访问超级字段

[英]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;
}

那也不起作用。

因此,请参考上面的编号部分:

  1. 为什么return this强制转换返回给Foo会返回对b.super对象的引用?
  2. main ,我还以为b.super将是参照实例化对象“B”的超级参考。 有什么方法可以从包含对象访问对超级对象的引用? 也许是从反思中得到的东西,但是我不想访问.class对象( b.getClass().getSuper() ),而是访问b中包含的实例化Foo。
  3. 为什么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

  1. 因为字段不是以多态的动态方式访问的。 返回的对象的声明类型为Foo,因此可以访问Foo的字段。 字段不能被覆盖。 在子类中定义i会创建另一个字段,该字段恰好与超类中的名称相同,因此将其隐藏。
  2. 不可能。 您绝不应该直接访问对象的字段。 使用方法代替。
  3. 因为那是无效的Java代码。 return super没有意义。 super不是不同的对象。 superthis是同一对象。

您的问题得到了回答:

  1. 为什么return.this投向Foo会返回对b.super对象的引用?

    • 事实并非如此。 它返回对“ this”的引用,这是Bar以及Foo的实例,因为Bar扩展了Foo。
  2. 总的来说,我会认为b.super是对实例化对象“ b”的super引用的引用。 有什么方法可以从包含对象访问对超级对象的引用? 也许是从反思中得到的东西,但是我不想访问.class对象(b.getClass()。getSuper()),而是访问b中包含的实例化Foo。

    • b和b.super是相同的。 您可以从条形码访问Foo保护的字段而不会出现问题
  3. 为什么return.super不返回对b.super对象的引用?

    • 同样,b和b.super是同一实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM