Java多态的核心是运行时动态绑定,必须满足继承或实现关系、子类重写父类/接口方法、父类或接口引用指向子类对象三个条件;仅实例方法(非static、非private、非final)可参与多态。

Java 中多态实现“同一个方法的多种表现形式”,核心在于运行时动态决定调用哪个具体实现,而不是编译时就固定下来。它不是靠写多个同名方法应付不同场景,而是让不同对象对同一方法调用做出各自的行为响应。
必须满足三个硬性条件
缺一不可,否则看似像多态,实际只是普通调用或编译报错:
- 存在继承关系(类继承)或实现关系(类实现接口)
- 子类重写了父类/接口中定义的方法(不是重载,是覆盖)
- 使用父类或接口类型的引用变量,指向子类或实现类的对象(即向上转型)
关键在运行时绑定,不是编译时决定
当你写 Animal a = new Cat(); a.makeSound();,编译器只检查 Animal 类里有没有 makeSound() 方法;真正执行哪段代码,JVM 到运行时才看 a 实际指向的是 Cat 还是 Dog 对象,再调用对应类里重写的版本。
这意味着:方法调用的“归属”由对象真实类型决定,和引用变量声明类型无关。
立即学习“Java免费学习笔记(深入)”;
两种主流实现方式
实际开发中,主要通过以下两类结构达成多态效果:
- 基于继承的多态:抽象父类(如 Animal)定义通用行为,子类(Cat/Dog)各自重写。适合有明确“is-a”关系的场景
- 基于接口的多态:接口(如 Payment)只声明契约,各类支付实现(Alipay/Wechat)独立实现。更松耦合,推荐用于扩展性强的模块(比如新增 ApplePay 只需新写一个类,不改原有逻辑)
静态方法、私有方法不参与多态
只有实例方法(非 static、非 private、非 final)才能被重写并体现多态。因为:
- 静态方法属于类,调用看引用类型(
Parent.staticMethod()永远执行 Parent 的版本) - 私有方法不能被继承,自然无法重写
- final 方法禁止重写,也就没有“多种表现”的空间


















