java多态核心是同一方法调用因对象不同而行为不同,其实现需三个条件:继承或接口实现、子类重写父类非private/static/final实例方法、父类引用指向子类对象(向上转型),运行时通过动态绑定调用实际类型的方法。

Java 中的多态,核心是“同一方法调用,因对象不同而行为不同”。它不是语法技巧,而是让程序能灵活应对变化的设计能力——比如调用 sound(),传入 Dog 就汪汪叫,传入 Cat 就喵喵叫,代码不用改。
多态靠三个条件落地
缺一不可:
- 有继承或实现关系:子类
extends父类,或类implements接口 - 有方法重写(
@Override):子类重写了父类的非private、非static、非final实例方法 - 父类引用指向子类对象:如
Animal a = new Dog();—— 这就是向上转型,也是多态发生的唯一入口
父类引用怎么调用子类方法
关键在“编译看左边,运行看右边”:
- 编译时检查
Animal类里有没有sound()方法;有,就通过 - 运行时发现
a实际是Dog对象,JVM 查虚方法表(vtable),自动跳转到Dog.sound() - 这个过程叫动态绑定,是 JVM 在运行期完成的,不是编译器决定的
哪些能多态,哪些不能
多态只对**实例方法**生效:
- ✅ 可以:父类中定义、子类重写的方法(如
a.sound()调用的是Dog的版本) - ❌ 不行:子类独有的方法(如
Dog.bark()),父类引用直接编译报错 - ❌ 不行:字段(
name)、静态方法(print())、private或final方法——它们都按引用类型(父类)处理,不查实际对象
为什么非得用父类引用
直接写 Dog d = new Dog(); 没问题,但一加新类型就卡住:
- 新增
Bird,所有用Dog或Cat声明的地方都要改 - 支付模块写死
WechatPay pay = new WechatPay();,换支付宝就得动业务逻辑 - 用
Payment pay = new WechatPay();,后续换成new Alipay(),只改这一行甚至交给工厂管理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











