我遇到了一段奇怪的代码。我想知道它是否有用处。

class C extends B {
    int xB = 4;

    C() {
        System.out.println(this.xB);
        System.out.println(super.xB);
        System.out.println(((B)this).xB); // This is the weird code.
    }
}

这打印4,10,10 .B类的公共xB字段的值为10。

在Java中,您只能直接从单个类继承。但是你可以拥有多个间接超类。这可以用于将"this"引用向上转换其中一个吗?或者这是一个糟糕的编程实践,我应该忘记它?

分析解答

So "((B)this)" basically acts as if it is "super". We could just use super instead of it.

它通常不会像super那样做。

在这种情况下,它确实是因为字段没有动态分派。它们由compile-time类型解决。你用演员改变了。

super.method()((SuperClass)this).method()并不相同。根据实例的实际类型在运行时调度方法。 type-cast根本不会影响这一点。

I was wondering if people are using this structure to upcast "this" to indirect superclasses.

他们不必这样做,因为他们不会像这样重复字段名称。

在子类中隐藏继承的(visible)字段是不好的做法(正是因为它导致这样的混乱)。所以不要这样做,你想要有这个演员。

并且你不能在任何涉及方法的地方使用"upcast to indirect superclasses":你可以直接调用super.method()(如果你在子类中),但不能像`super.super.method()那样。