我遇到了一段奇怪的代码。我想知道它是否有用处。
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()那样。