重写是运行时多态的必要前提,需满足继承关系、非private非static方法、签名一致、访问权限不更严格等条件,通过父类引用调用子类重写方法实现动态绑定。

重写方法是多态机制落地的关键环节。没有重写,父类引用就无法在运行时调用子类特有的行为,多态就只是空谈。
重写是运行时多态的必要前提
Java 的多态主要指运行时多态,它依赖两个条件:继承(或实现接口)+ 方法重写。只有子类重写了父类的非 private、非 static 方法,JVM 才能在运行时根据对象实际类型决定调用哪个版本的方法——这个过程叫动态绑定。
- 如果子类没重写父类方法,通过父类引用调用时,执行的仍是父类原方法,不体现子类行为差异
- 重写必须满足签名一致(方法名、参数列表完全相同),返回类型可协变(如父类返回 Number,子类可返回 Integer)
- 子类重写方法的访问权限不能比父类更严格(比如父类是 protected,子类不能用 private 或默认)
典型使用方式:父类引用指向子类对象
这是最常见也最核心的用法。声明时用父类类型,创建时用子类实例,调用被重写的方法时自动触发子类逻辑。
- Animal a = new Dog(); a.cry(); → 输出“汪汪汪”
- Animal a = new Cat(); a.cry(); → 输出“喵喵喵”
- 编译期只认 a 的声明类型 Animal,但运行期看 new 后的实际类型,从而精准调度
配合方法参数实现通用处理逻辑
把父类类型作为方法形参,就能接收任意子类对象,让同一段代码适配多种具体实现。
立即学习“Java免费学习笔记(深入)”;
- 定义:void feed(Animal animal) { animal.eat(); }
- 调用:feed(new Dog()); feed(new Bird()); feed(new Fish());
- 无需为每种动物写一个 feedDog()、feedBird()……方法,扩展新动物类也不用改 feed 方法
注意属性不具有多态性
只有方法调用会动态绑定,成员变量访问始终依据引用的编译时类型。
- 若 Animal 有 public String type = "animal";,Dog 中也有 public String type = "dog";
- Animal a = new Dog(); System.out.println(a.type); → 输出 "animal",不是 "dog"
- 想获得子类特有属性,需向下转型(不推荐)或统一设计 getter 方法并重写


















