方法重写是子类重新定义父类中非private、非static、非final的实例方法以实现运行时多态;需满足父子类继承关系、方法名与参数列表完全一致、返回类型兼容、访问权限不更严格、不可重写特殊修饰方法五大前提。

方法重写(Override)是 Java 面向对象编程的核心机制之一,面试官常借此考察你对继承、多态和访问控制的理解深度。回答时抓住“前提条件 + 关键规则 + 典型误区 + 实际价值”四点,就能既准确又自信。
一、先说清楚什么是方法重写
方法重写是指子类重新定义父类中已有的非私有、非静态、非 final 的实例方法,实现运行时多态。关键不是“名字一样”,而是 JVM 在运行时根据对象实际类型决定调用哪个版本的方法。
举个例子:
class Animal { void sound() { System.out.println("Animal makes a sound"); } }class Dog extends Animal { @Override void sound() { System.out.println("Dog barks"); } }
Animal a = new Dog(); a.sound(); // 输出 "Dog barks" —— 这就是重写的运行时效果
二、必须满足的五个前提条件
回答时可以按逻辑顺序列出来,显得条理清晰:
立即学习“Java免费学习笔记(深入)”;
- 必须发生在父子类之间(继承关系)
- 方法名、参数列表(类型、个数、顺序)必须完全一致
- 返回类型要兼容:可以是相同类型,或是父类返回类型的子类型(协变返回类型,Java 5 起支持)
- 访问修饰符不能更严格:比如父类是 protected,子类只能是 protected 或 public,不能是 private 或包访问
- 不能重写被 private、static、final 修饰的方法(它们不属于多态范畴)
三、高频陷阱题怎么接住
面试官可能会突然问:“重写和重载有什么区别?”或“为什么 private 方法不能被重写?”这时别只背定义,带点原理:
- @Override 注解不是必须的,但强烈建议加上——它让编译器帮你检查是否真满足重写条件,避免拼错名、改错参数等低级错误
- 构造方法不能被重写——它不是继承来的,每个类都有自己的构造器
- 重写看运行时类型,重载看编译时类型——这是区分两者最本质的一句话
- 子类重写后,想调用父类版本怎么办?用 super.method()——这是体现你懂设计意图的加分点
四、一句话点出它的设计价值
方法重写不是为了“换个实现”,而是为了在保持统一接口的前提下,让不同子类提供符合自身语义的行为。它是开闭原则(对扩展开放、对修改关闭)在 Java 中最直接的落地方式——新增子类不用改已有代码,就能自然融入多态体系。


















