这可能是一个奇怪的问题,但我不知道如何设法使它起作用。我的意图是从覆盖该字段的对象访问超级字段。首先,什么起作用(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; }
}

08-18 05:39
查看更多