在以下情况下,我定义了Animal类,而另一个Dog定义了以下两行代码来扩展Animal:
1)狗d =(狗)new Animal(); //明示沮丧
2)动物a = new Dog(); //自动上传
以这种方式定义两只动物的利弊是什么?具体来说,在什么情况下我更喜欢(1)胜过(2),反之亦然?
据我了解,我们垂头丧气,无法使用Dog的方法,但是为什么不将它称为Dog?
谢谢!
答案 0 :(得分:0)
听起来您有兴趣了解更多有关上播和下播的信息,在这种情况下,您可能会发现此answer会有所帮助。
要扩展您的问题并从链接的答案中提取一点,总是允许进行向上转换,但是向下转换涉及类型检查,可能会引发ClassCastException
。
尽管如此,您可以在执行强制转换之前使用instanceof运算符检查对象的运行时类型,这可以防止出现以下in代码中的异常。
之所以选择垂头丧气的一个原因是,您想要一种对所有动物都适用的方法,但又让它对狗特别有用,这可能会导致如下代码:
public void pet(Animal animal) {
// Do something else if animal is a Dog
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.growl();
}
}