方法签名必须一致,包括方法名、参数列表和类型,返回类型可协变;2. 子类访问权限不能比父类更严格,可相同或更宽松;3. final和static方法不可重写,前者因禁止修改,后者属类级别隐藏而非重写;4. 重写方法抛出的检查异常必须是父类异常的子类或不抛出。

在Java中,方法重写(Override)是指子类提供一个与父类中已有方法具有相同签名的方法实现。为了保证多态的正确性和程序的稳定性,Java对方法重写设置了一系列语法限制。这些限制确保了子类方法能安全地替代父类方法,同时不破坏原有行为契约。
1. 方法签名必须一致
重写的方法必须与父类中的方法具有相同的方法名、参数列表和参数类型。返回类型在大多数情况下也必须相同,但允许协变返回类型(即子类方法可以返回父类方法返回类型的子类)。
例如:如果父类方法是 public String getName(),那么子类重写时不能是 public String getName(int id) 或 public int getName(),否则就不是重写,而是重载或新方法。
2. 访问权限不能更严格
子类重写方法的访问修饰符不能比父类方法的更严格。比如父类方法是 protected,子类就不能用 private 重写,但可以使用 public 或 protected。
立即学习“Java免费学习笔记(深入)”;
- 允许:public ← protected ← default ← private(从宽到严)
- 子类可放宽访问控制,但不能收紧
父类中为 protected void show(),子类可用 public void show() 重写,但不能用 private void show()。
3. 不能重写被 final 或 static 修饰的方法
final 方法:一旦被声明为 final,表示该方法不可被修改,子类无法重写。
static 方法:属于类而非实例,虽然子类可以定义同名静态方法,但这属于隐藏(hiding),不是重写。
注意:即使签名相同,static 方法不会参与动态绑定,调用时依据引用类型决定,而非实际对象类型。
4. 抛出的异常不能更宽泛
子类重写方法所抛出的检查异常(checked exception)必须是父类方法所抛异常的。不能抛出更多或更广泛的检查异常。
- 父类方法 throws IOException,子类可 throws FileNotFoundException(其子类),但不能 throws Exception
- 运行时异常(RuntimeException)不受此限,可随意抛出
5. 必须是继承而来的方法
只有父类中可被继承的方法才能被重写。这意味着:
- private 方法不能被重写(不可见)
- 构造方法不能被重写(不属于实例方法)
- final 类中的方法不能被重写(如 String 类)
6. 使用 @Override 注解推荐但非强制
虽然不是语法要求,但建议在重写方法上添加 @Override 注解。这能让编译器帮助检查是否真的成功重写了父类方法,避免因拼写错误或签名不一致导致意外定义新方法。
基本上就这些关键点。掌握这些语法边界,就能正确使用方法重写,避免常见错误。










