java多态通过父类或接口引用调用子类重写方法,核心是“编译看左边,运行看右边”;依赖继承+重写或接口实现,结合向上转型与动态绑定,static/final/private方法不参与多态。

Java 中多态让不同类的对象能通过同一接口或父类引用被统一调用,实际执行的是各自重写的方法。核心在于“编译看左边,运行看右边”——编译时检查引用类型,运行时决定调用哪个子类的具体实现。
用继承 + 方法重写构建基础多态
定义一个父类(或接口),子类继承并重写关键方法,就能在不修改调用代码的前提下切换行为。
- 父类声明通用方法(如 void makeSound()),不写具体逻辑或提供默认实现
- 每个子类(如 Dog、Cat)重写该方法,实现自己的动作
- 用父类类型变量引用子类对象:Animal a = new Dog(); a.makeSound(); —— 运行时调用 Dog 的版本
接口是更灵活的多态入口
接口不关心“是什么”,只约定“能做什么”,适合行为差异大、无继承关系的类统一操作。
- 定义接口 Drawable,含 void draw()
- Circle、Rectangle、Text 都实现它,各自画法完全不同
- 方法参数直接用接口类型:public void render(Drawable d) { d.draw(); },传入任意实现类都可运行
向上转型与动态绑定是运行关键
多态生效依赖两个机制:把子类对象赋给父类/接口变量(向上转型),以及 JVM 在运行时根据实际对象类型查找方法(动态绑定)。
- 向上转型自动发生,安全且无需强转;向下转型需显式强制,且必须确保类型正确,否则抛 ClassCastException
- 被 static、final 或 private 修饰的方法不参与动态绑定,它们在编译期就绑定好了
- 构造器、成员变量访问不具多态性——访问的是引用类型声明的字段,不是实际对象的字段
避免常见陷阱
多态容易误用的地方往往藏在细节里。
- 别在父类构造器中调用可能被重写的方法——子类字段可能还未初始化,导致空指针或默认值问题
- 重写时方法签名(名称、参数、返回类型)必须严格一致;返回类型协变(子类返回更具体的类型)是允许的
- 如果子类新增了独有方法,必须向下转型才能调用,但这会破坏多态初衷,应优先考虑是否该抽到父类或接口中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











