在面向对象编程中,转型(Casting) 是指改变对象的引用类型,主要涉及 继承关系 和 多态。
向上转型(Upcasting) ⬆️
定义
将 子类对象 赋值给 父类引用(自动完成,无需强制转换)。
特点
✅ 安全:子类一定 “是” 父类(Dog 是 Animal)。
✅ 自动转型:编译器隐式完成,无需手动转换。
✅ 丢失子类特有方法:父类引用只能调用父类定义的方法。
代码示例
class Animal {
void eat() { System.out.println("动物在吃"); }
}
class Dog extends Animal {
void bark() { System.out.println("狗在叫"); }
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog(); // 子类对象
Animal animal = dog; // 向上转型(自动)
animal.eat(); // 可以调用父类方法
// animal.bark(); // ❌ 编译错误!父类引用无法调用子类特有方法
}
}
输出
动物在吃
关键点
Animal animal = dog;
是向上转型,animal
只能访问Animal
类的方法(eat()
)。- 如果调用
bark()
,编译器会报错,因为Animal
类没有定义该方法。
向下转型(Downcasting) ⬇️
定义
将 父类引用 强制转回 子类引用(需手动转换,且可能抛出异常)。
特点
⚠️ 不安全:必须确保父类引用 实际指向该子类对象,否则会抛出 ClassCastException
。
🔹 需显式转换:必须用 (子类名)
强制转换。
🔹 恢复子类特有方法:转型成功后,可以调用子类的方法。
代码示例
Animal animal = new Dog(); // 向上转型(Animal引用指向Dog对象)
// 向下转型(强制转换)
Dog dog = (Dog) animal; // 安全,因为animal实际是Dog
dog.bark(); // 可以调用子类方法
// 危险的情况!
Animal catAnimal = new Cat(); // Animal引用指向Cat对象
// Dog badDog = (Dog) catAnimal; // ❌ 运行时抛出ClassCastException!
输出
狗在叫
关键点
(Dog) animal
是向下转型,前提是animal
实际指向Dog
对象。- 如果
animal
实际指向Cat
,强制转Dog
会抛出异常。
如何安全地向下转型? 🔒
使用 instanceof
检查对象类型,避免 ClassCastException
。
示例
Animal animal = getRandomAnimal(); // 可能返回Dog或Cat
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // 安全转型
dog.bark();
} else if (animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.meow();
}
向上转型 vs 向下转型对比表 📊
特性 | 向上转型(Upcasting) ⬆️ | 向下转型(Downcasting) ⬇️ |
---|---|---|
方向 | 子类 → 父类 | 父类 → 子类 |
安全性 | 安全(自动完成) | 不安全(需手动检查) |
是否需要强制转换 | 不需要(隐式) | 需要(显式,如 (Dog) animal ) |
方法访问 | 只能调用父类方法 | 可调用子类特有方法 |
典型用途 | 多态、通用代码设计 | 需要调用子类特有方法时 |
实际应用场景 🛠️
向上转型的用途
多态:统一处理不同子类对象。
List<Animal> zoo = Arrays.asList(new Dog(), new Cat());
for (Animal animal : zoo) {
animal.eat(); // 父类引用调用,实际执行子类方法
}
向下转型的用途
调用子类特有方法:
Animal animal = getAnimal(); // 可能是Dog或Cat
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.bark(); // 只有Dog才有bark()
}
一句话总结 🎯
- 向上转型:子类对象 → 父类引用(自动,用于多态)。
- 向下转型:父类引用 → 子类引用(手动,需用
instanceof
检查)。
记住:
- 向上转型是 “放宽视野”(把狗当成动物)。
- 向下转型是 “缩小范围”(把动物还原成狗)。