多态是“同一种调用,不同对象干不同的事”,核心是父类引用+子类对象+方法重写三者缺一不可,依赖继承或接口实现、子类重写非private/final/static方法、父类类型声明指向子类实例,实现运行时动态绑定。

多态就是“同一种调用,不同对象干不同的事”。它不靠猜、不靠 if 判断,而是让 JVM 在运行时自动决定该执行哪个类的方法——核心是“父类引用 + 子类对象 + 方法重写”三者缺一不可。
多态的三个硬性条件
少了任意一个,代码看起来像多态,实际只是普通赋值:
- 必须有继承关系(或接口实现),比如 Student extends Person 或 Dog implements Animal
- 子类必须重写父类的非 private / 非 final / 非 static 方法(只有重写了,运行时才有“可替换”的逻辑)
- 必须用父类类型声明变量,并指向子类实例,例如:Person p = new Student(); 或 Animal a = new Dog();
代码怎么写才体现多态
关键不是“能不能编译”,而是“运行时是否调用子类方法”。看这个最小可运行例子:
// 父类
class Animal {
public void speak() { System.out.println("发出声音"); }
}
// 子类1
class Cat extends Animal {
@Override public void speak() { System.out.println("喵喵喵"); }
}
// 子类2
class Dog extends Animal {
@Override public void speak() { System.out.println("汪汪汪"); }
}
// 测试
Animal a1 = new Cat();
Animal a2 = new Dog();
a1.speak(); // 输出:喵喵喵
a2.speak(); // 输出:汪汪汪
注意:变量类型是 Animal,但真正干活的是 Cat 和 Dog 的 speak() —— 这就是动态绑定。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
哪些情况“看似多态,实则失效”
新手常踩坑的地方,本质是破坏了多态前提:
- 用子类类型声明:如 Cat c = new Cat(); → 这只是普通对象创建,和多态无关
- 没重写方法:子类里没加 @Override,也没改方法体 → 调用的仍是父类逻辑
- 调用子类独有方法:如 a1.catchMouse()(而 catchMouse() 在 Animal 中不存在)→ 编译报错,因为编译只认左边类型
- 调用 static / private / final 方法:这些方法绑定在编译期,无法被重写,也就没有运行时多态
多态不只是语法,更是设计思维
它解决的核心问题是:**当新增子类时,原有调用代码不用改**。比如你有个喂养系统:
void feed(Animal a) { a.eat(); }
以后加 Bird、Fish,只要它们继承 Animal 并重写 eat(),feed 方法一行都不用动。
这种“对修改封闭,对扩展开放”的特性,正是多态在真实项目中最有价值的部分。

















