方法签名是重写的前提条件,仅由方法名和参数列表(类型、数量、顺序)构成;返回类型、异常声明、访问修饰符不属于签名,但影响重写合法性。

方法签名是重写的前提条件
重写不是简单地“名字一样就行”,它严格依赖方法签名是否完全匹配。方法签名只包含两部分:方法名和参数列表(类型、数量、顺序)。返回类型、异常声明、访问修饰符都不属于签名,因此不影响重写判定——但会影响重写是否合法。
签名一致才能触发运行时多态
只有当子类方法与父类方法的签名完全相同时,JVM 才会在运行时根据实际对象类型决定调用哪个版本。比如 Animal a = new Dog(); a.makeSound(); 能输出“Dog barks”,正是因为 makeSound() 的签名在 Dog 中和 Animal 中一模一样。如果参数稍有不同(比如加了个 int volume),那就变成重载,调用行为由编译时的引用类型决定,不再是多态。
签名不匹配会导致重写失败
常见错误包括:
- 参数类型写错(如
String写成Object) - 参数顺序颠倒(
(int, String)vs(String, int)) - 漏掉或多了某个参数
- 用了泛型擦除后不兼容的类型(如
List<String>和List<Object>在字节码层面可能无法精确匹配)
这些情况都不会构成重写,而是被视为一个全新方法,父类逻辑不会被替换,@Override 注解也会报错。
返回类型和访问修饰符的约束是签名之外的规则
签名相同只是起点,重写还需满足额外要求:
- 返回类型可以相同,也可以是父类返回类型的子类型(协变返回,Java 5+ 支持)
- 子类方法不能比父类更私有(
public→protected允许;protected→private不允许) - 子类不能抛出比父类更宽泛的受检异常(可抛出更具体的异常,或不抛)
这些限制不参与签名比较,但违反任一条件,编译器会拒绝该重写。

















