向上转型是将子类对象赋给父类引用,无需强制转换,如Animal animal = new Dog();转型后只能访问父类成员,但调用重写方法时体现多态,执行子类版本。

向上转型(Upcasting)就是把子类对象赋给父类引用,不需要强制转换,Java 自动完成,安全且常用。
怎么写:基本语法很简单
只要子类继承自父类(或实现父接口),就能直接用父类类型接收子类实例:
- 父类名 引用变量 = new 子类名();
- 例如:Animal animal = new Dog();
- 也可以是已有子类对象赋值:Dog dog = new Dog(); Animal a = dog;
能干什么:调用范围与多态体现
转型后,变量只能访问父类中定义的成员(方法和 public 字段),但实际执行的是子类重写后的方法:
- 可以调用 父类声明过的方法,比如 animal.sound()
- 如果子类重写了该方法,运行时自动调用子类版本(这就是多态)
- 不能调用子类独有的方法,比如 dog.bark() —— 编译报错
为什么用:三个典型场景
向上转型不是为了“降级”,而是为了统一处理、解耦设计:
- 集合统一存储:用 List<Animal> 装 Dog、Cat、Bird,遍历时统一调用 sound()
- 方法参数泛化:定义 void feed(Animal a),传入任意子类对象都合法
- 返回值抽象化:工厂方法返回 Animal,具体创建哪个子类由内部决定,调用方无需关心
注意事项:看似简单,但别踩坑
向上转型本身不会出错,但要注意它的“能力边界”:
- 转型后丢失子类特有行为,想用必须向下转型(需配合 instanceof 安全检查)
- 不能通过父类引用来访问子类新增字段(哪怕同名),因为编译期只认父类结构
- 静态方法不参与多态:若父类和子类都有 static void show(),调用 animal.show() 永远执行父类版本

















