Java重写要求方法名、参数列表完全一致,返回类型协变,访问权限不更严格,且不能重写static、final、private方法;@Override注解用于编译期校验重写正确性。

重写方法必须有相同的方法签名
Java中重写(@Override)要求子类方法与父类被重写方法的名称、参数列表(类型、顺序、数量)完全一致,返回类型需协变(即子类返回类型是父类返回类型的子类型,或相同),且不能更宽泛。常见错误是参数类型写错,比如把 Object 写成 String,这实际是重载而非重写。
-
void print(Object obj)和void print(String s)是重载,不是重写 - 父类返回
Number,子类可返回Integer,但不能返回Object - 方法名大小写敏感,
toString()和ToString()视为两个不同方法
访问修饰符不能比父类更严格
子类重写方法的访问权限只能等于或大于父类方法——即 public 可重写 protected 或 public,但不能用 private 或 protected 去重写 public 方法。否则编译直接报错:Cannot reduce the visibility of the inherited method。
- 父类是
protected void run()→ 子类可用protected或public,不可用private - 父类是
public final void close()→ 无法重写(final禁止重写,和访问修饰符无关) - 接口默认方法(
default)可被实现类重写,但若父接口有同名default,实现类必须显式重写才能改变行为
@Override 注解不是必需但强烈建议加上
加 @Override 不影响运行,但它让编译器帮你检查:是否真在重写一个可继承的父类/接口方法。漏加时看似正常,但一旦父类方法被删或改名,子类“假重写”就变成独立方法,逻辑悄然失效。
class Animal {
public void speak() { System.out.println("sound"); }
}
class Dog extends Animal {
@Override // ✅ 编译器确认:speak() 确实来自 Animal
public void speak() { System.out.println("woof"); }
}
// 如果删掉 Animal.speak(),这里立刻编译报错,而不是静默变成新方法
- 不要给私有方法、静态方法、构造器加
@Override(编译报错) - 实现接口方法也应加
@Override(Java 6+ 支持,语义更清晰) - IDE 通常能自动补全该注解,别跳过
static、final、private 方法都不能被重写
这是初学者高频误解点。它们各自被禁止重写的原因不同:
立即学习“Java免费学习笔记(深入)”;
-
static方法属于类,不参与多态;子类定义同名static方法只是“隐藏”(hiding),调用取决于引用类型,不是重写 -
final方法明确禁止子类修改行为,编译器会拒绝任何重写尝试 -
private方法对子类不可见,子类里写的同名方法本质上是全新方法,跟父类毫无关系
如果看到子类里有和父类 private 或 static 同名方法,别假设它被重写了——运行时不会触发多态分派,调试时容易误判调用链。









