向上转型无需类型检查,向下转型必须配合运行时类型检查才安全;前者是子类对象赋值给父类引用,编译期自动完成且安全,后者需显式强转并用instanceof等检查避免ClassCastException。

向上转型不需要类型检查,向下转型必须配合类型检查才能安全进行。
向上转型:编译期自动完成,无需检查
向上转型是子类对象赋值给父类引用,比如 Animal a = new Dog();。这种转换由编译器自动允许,因为子类天然包含父类所有公开成员,逻辑上完全兼容。编译器在编译阶段就能确认其安全性,所以不涉及运行时类型检查,也没有性能开销。
- 转型后只能调用父类声明的方法,即使实际执行的是子类重写版本(多态)
- 无法访问子类独有的字段或方法,编译直接报错
- 对象真实类型不变,a.getClass() 仍返回 Dog.class
向下转型:必须显式强转 + 运行时类型检查
向下转型是把父类引用还原为具体子类类型,例如 Dog d = (Dog) a;。由于父类引用可能实际指向任意子类甚至父类自身,JVM 必须在运行时验证实际类型是否匹配,否则抛出 ClassCastException。
- 强制语法 (Dog) 是编译通过的前提,但不保证运行安全
- instanceof 是最常用且推荐的前置检查手段,如 if (a instanceof Dog)
- null 对 instanceof 返回 false,可自然跳过转型分支,避免空指针
为什么不能跳过类型检查直接向下转型
跳过检查强行转型,等于让程序依赖不确定的类型假设。例如:Animal a = new Cat(); Dog d = (Dog) a; 编译能过,但运行必定崩溃。类型检查不是冗余步骤,而是对“这个引用到底是不是我要的类型”的必要确认——它把潜在错误从运行时提前暴露,或在逻辑上规避风险。
替代方案:优先用多态代替转型
频繁出现向下转型,往往说明设计可以优化。比如用抽象方法统一行为,而不是先向上再向下获取子类特有能力:
- 定义 void makeSound() 在 Animal 中为 abstract
- 各子类实现自己的 makeSound(),调用时无需知道具体类型
- 集合存 List<Animal>,遍历调用 animal.makeSound() 即可

















