java - 在 Java 中向上转换 "this"引用是否有意义?

标签 java this super upcasting

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

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/

相关文章:

java - 什么是 PECS(生产者扩展消费者 super )?

java - while 循环不向每个循环新创建的对象添加数据?在 java

objective-c - 指定要获取哪个对象的 super

python - 除了继承之外,在 `super() ` 内部使用 python `__init__ ` 的目的是什么?

C++ this(在这种情况下,什么是指向当前类的链接)

php - 在 PHP 中重新分配 $this

javascript - 更改此元素的颜色

java - 如何在表单提交后显示消息并具有幂等性

java - 如何在 Android 上管理从后台恢复的 Xamarin 表单应用程序?

java - java 分词器(字符串)