首页 > 解决方案 > 显式向下转型和向上转型的区别

问题描述

如果我有以下情况,我定义了一个类 Animal 和另一个类 Dog,它使用以下两行代码扩展 Animal:

1) 狗 d = (狗) 新动物(); //显式向下转换

2) 动物 a = new Dog(); //自动上调

以这种方式定义两种动物的优缺点是什么?具体来说,在什么情况下我更喜欢(1)而不是(2),反之亦然?

据我了解,我们很沮丧以访问 Dog 的方法,但是为什么不直接称它为狗呢?

提前致谢!

标签: javapolymorphismdowncastupcasting

解决方案


听起来您有兴趣了解有关向上转换和向下转换的更多信息,在这种情况下,您可能会发现此答案很有帮助。

为了扩展您的问题并从链接的答案中提取,始终允许向上转换,但向下转换涉及类型检查,这可能会抛出ClassCastException.

不过,您可以在执行强制转换之前使用 instanceof 运算符检查对象的运行时类型,这样您就可以防止这些异常,如下面的代码所示。

您可能选择向下转型的一个原因是因为您想要一种适用于所有动物的方法,但让它为狗做一些特别的事情,这可能导致如下代码:

public void pet(Animal animal) {

    // Do something else if animal is a Dog
    if (animal instanceof Dog) {
        Dog dog = (Dog) animal;
        dog.growl();
    }
}

推荐阅读