多态以继承为前提、重写为基础,通过父类引用调用子类重写方法实现动态绑定;字段访问、静态方法、私有方法等不参与多态;其核心价值在于解耦与可扩展性,而非单纯语法形式。

父类引用指向子类对象,是Java多态的起点,不是语法技巧,而是编译期与运行期分工协作的结果:编译时认类型(左边),运行时看实例(右边)。
继承是多态的前提,但不等于多态
只有存在继承(或实现接口)关系,才可能用父类类型“装下”子类对象。比如 Dog extends Animal,意味着 Dog 是一种 Animal,所以 Animal a = new Dog() 合法。但这行代码本身不触发多态——真正起作用的是后续对重写方法的调用。
- 没有继承,就无法向上转型,多态无从谈起
- 仅有继承,但子类没重写方法,调用时仍执行父类逻辑,不体现“不同行为”
- 继承提供 is-a 关系,重写提供行为差异,两者结合才构成多态基础
动态绑定只发生在重写的方法上
当执行 a.sound() 时,JVM 不是查 Animal 类里怎么写的,而是顺着对象实际内存地址,找到它所属类(如 Dog)的虚方法表(vtable),从中取出 sound() 的真实入口。这个过程叫动态绑定。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 仅限非 private、非 static、非 final 的实例方法
- 字段访问不走这套机制:哪怕 Dog 和 Animal 都有 name 字段,a.name 拿到的永远是 Animal.name 的值
- 子类特有方法(如 bark())无法通过 Animal a 调用,编译直接报错
多态的价值在解耦,不在写法本身
同一行 pet.eat(food),传入 new Cat() 或 new Duck(),自动执行各自版本——调用方不用知道具体是谁,也不用改代码。
- 方法参数用父类类型,新增子类不影响原有方法签名
- 集合统一存取:List
可混装任意子类,遍历时自然分发 - 工厂返回抽象类型,使用者只依赖契约,不依赖具体实现
常见误解要避开
很多人以为“写了 Animal a = new Dog() 就算用了多态”,其实关键在怎么用这个引用。
- 如果只访问字段、调用静态方法、或子类没重写该方法,那只是向上转型,没触发动态绑定
- 把多态当成“让子类方法被父类变量调用”的手段,容易忽略设计意图:降低依赖、提升可扩展性
- 向下转型((Dog) a)绕过抽象,破坏多态优势,应优先考虑是否该把行为提到父类中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










