Java多态核心是父类/接口引用指向子类对象,运行时动态绑定重写方法;字段、静态方法、构造器不参与多态;应优先用于参数和集合以体现开闭原则。

Java 中多态实现灵活调用,核心在于“同一个引用,根据实际对象类型自动执行对应方法”,不需要修改调用代码,就能适配新增子类。关键不在写得多,而在结构设计得对。
父类引用 + 子类对象是基础操作
必须用父类(或接口)类型声明变量,再指向子类实例。这样编译时只认类型约束,运行时才看真实对象。
- 正确写法:Animal a = new Dog(); —— 向上转型,安全且触发多态
- 错误写法:Dog d = new Dog(); —— 类型太具体,失去扩展性,后续加 Cat 就得改调用逻辑
- 接口方式更推荐:Drawable d = new Circle(); 或 Drawable d = new Rectangle();,一个变量能切换任意实现类
方法重写是多态生效的前提
只有被 @Override 的非 static、非 private、非 final 方法,才能在运行时动态绑定到子类实现。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 字段不参与多态:即使子类定义了同名字段,通过父类引用访问的仍是父类字段值
- 静态方法不参与多态:Animal.staticMethod() 永远调用 Animal 的版本,和实际对象无关
- 构造器不能重写,也不具备多态行为
把多态用在参数和集合里才真正灵活
单独一个变量赋值只是入门;把多态融入方法参数、数组或集合,才能体现“开闭原则”——对扩展开放,对修改关闭。
立即学习“Java免费学习笔记(深入)”;
- 参数多态:void feed(Animal a) { a.eat(); } —— 传 Dog 或 Cat 都能直接调用,无需重载多个 feed 方法
- 数组/集合多态:Animal[] animals = {new Dog(), new Cat(), new Bird()}; 遍历时自动调用各自重写的 eat()
- 工厂或策略模式中,返回父类/接口类型,调用方完全不用关心具体是哪个子类
向下转型要谨慎,但有时不可少
当需要调用子类特有方法(比如 Dog 的 bark())时,必须先判断再转型。
- 安全做法:if (a instanceof Dog) { ((Dog) a).bark(); }
- 避免 ClassCastException:不加 instanceof 判断就强转,运行时会崩溃
- 设计上优先考虑提取共性到父类或接口,减少对向下转型的依赖

















