向上转型是子类对象通过父类或接口类型引用,实现统一调用、松耦合与开闭原则的关键手段;它不改变对象本身,仅改变编译器视角,但转型后无法访问子类特有成员。

向上转型是让子类对象通过父类或接口类型来引用,从而实现统一调用和松耦合的关键手段。它不改变对象本身,只改变了编译器“看待”这个对象的方式。
接口统一调用:用一个类型处理多种实现
当多个类实现同一个接口时,可以把它们的对象都赋给该接口类型的变量,后续只需面向接口编程。
- 比如定义 Runnable 接口,Dog、Cat 都实现它,就可以写:Runnable r = new Dog(); 或 r = new Cat();
- 调用 r.run() 时,实际执行的是各自类中重写的版本,行为不同但调用方式完全一致
- 集合也能统一存取:List
tasks = new ArrayList(); tasks.add(new Dog()); tasks.add(new Cat());
方法参数统一化:新增子类无需改老代码
把方法参数设为父类或接口类型,就能天然兼容所有子类实现。
- 写一个方法 public void start(Runnable task) { task.run(); }
- 以后加新类 Bird 实现 Runnable,直接传入即可:start(new Bird());
- 原有方法体不用动一行,符合开闭原则
代码解耦:调用方不依赖具体实现类
使用向上转型后,业务逻辑层只依赖抽象(接口/父类),不感知具体是谁在干活。
- 例如支付模块接收 Payment 接口,背后可以是 WechatPay、Alipay 或 CreditCard
- 切换支付方式只需替换 new 的对象,不用修改调用它的任何业务代码
- 单元测试也更容易——可传入模拟实现(Mock),不依赖真实第三方服务
注意事项:转型后不能访问子类特有成员
向上转型是安全的,但有明确边界:
- 接口变量只能调用接口中声明的方法,即使对象实际是某个子类实例
- 子类自己新增的方法(如 Dog.fetch())无法通过 Runnable r = new Dog(); 调用
- 如需访问特有功能,必须向下转型,且要先用 instanceof 检查,否则可能抛异常










