我遇到了一段奇怪的代码。我想知道它是否有任何用途。
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 类的公共(public) xB 字段值为 10。
在Java中,只能直接继承单个类。但是你可以有多个间接父类(super class)。这可以用于将“this”引用转换为其中之一吗?还是这是糟糕的编程习惯,我应该忘掉它?
最佳答案
So "((B)this)" basically acts as if it is "super". We could just use super instead of it.
它通常不会做与 super
相同的事情。
在这种情况下是这样,因为字段没有动态分配。它们由它们的编译时类型解析。你用类型转换改变了这一点。
但是 super.method()
和 ((SuperClass)this).method()
是不一样的。方法在运行时根据实例的实际类型进行分派(dispatch)。类型转换根本不会影响这一点。
I was wondering if people are using this structure to upcast "this" to indirect superclasses.
他们不必这样做,因为他们不会像那样重复字段名称。
在子类中隐藏继承的(可见的)字段是不好的做法(正是因为它会导致像这样的困惑)。所以不要那样做,你想要有这个类型转换。
而且你不能在所有涉及方法的地方“向上转换到间接父类(super class)”:你可以直接调用super.method()
(如果你在子类中) ,但不是像 super.super.method()
这样的东西。
关于java - 在 Java 中向上转换 "this"引用是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57624717/