java如何分辨覆盖
方法重写(Override)与重载(Overload)的区别
重写(Override)
发生在子类与父类之间,子类重新定义父类中已有的方法。要求方法名、参数列表、返回类型完全相同(协变返回类型除外),且访问权限不能比父类更严格。使用 @Override 注解可显式标记。
重载(Overload)
发生在同一类中,方法名相同但参数列表(类型、顺序、数量)不同。返回类型和访问修饰符可不同,与继承无关。

覆盖的判定条件
- 方法签名一致:方法名、参数类型及顺序必须完全相同。
- 返回类型协变:子类方法的返回类型可以是父类方法返回类型的子类。
- 访问权限不更严格:子类方法的访问修饰符不能比父类更严格(如父类为
protected,子类不能为private)。 - 异常限制:子类方法抛出的检查异常不能比父类更多或更宽泛。
示例代码
class Parent {
protected void display() {
System.out.println("Parent display");
}
}
class Child extends Parent {
@Override
public void display() { // 正确覆盖:访问权限更宽松
System.out.println("Child display");
}
// 以下不是覆盖,是重载
public void display(String msg) {
System.out.println("Overloaded: " + msg);
}
}
常见误区
- 静态方法(
static)不能被覆盖,隐藏(hide)机制替代。 - 私有方法(
private)和 final 方法无法被覆盖。 - 参数列表不同时,即使方法名相同也属于重载而非覆盖。
通过以上规则和示例可清晰分辨 Java 中的方法覆盖。






