java - 显式向下转型和向上转型的区别
问题描述
如果我有以下情况,我定义了一个类 Animal 和另一个类 Dog,它使用以下两行代码扩展 Animal:
1) 狗 d = (狗) 新动物(); //显式向下转换
2) 动物 a = new Dog(); //自动上调
以这种方式定义两种动物的优缺点是什么?具体来说,在什么情况下我更喜欢(1)而不是(2),反之亦然?
据我了解,我们很沮丧以访问 Dog 的方法,但是为什么不直接称它为狗呢?
提前致谢!
解决方案
听起来您有兴趣了解有关向上转换和向下转换的更多信息,在这种情况下,您可能会发现此答案很有帮助。
为了扩展您的问题并从链接的答案中提取,始终允许向上转换,但向下转换涉及类型检查,这可能会抛出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();
}
}
推荐阅读
- deployment - 在哪里部署 Java XMPP 服务器应用程序?
- ruby-on-rails - 我应该在创建对象的循环中引用实例还是类方法?
- mysql - 没有重复输入的评级系统的 DB 设计
- swift - 将 4 个 UI 标签(与 4 个滑块链接)值一起添加
- swift - 从 Swift 中的类型别名覆盖调用字符串相等运算符
- android - 我的第一个 android 应用程序,智能手机屏幕上没有显示任何内容
- java - 擦除在其上绘制的视图的内容
- objective-c - 使我的代码符合 ARC 模型
- java - 除了(速记,在增量之前或之后获取值)之外,java中的前增量和后增量用于什么?
- c# - 在 Xamarin 窗体上更改 ListView 项的背景颜色