Java中判断重写或重载的核心依据是方法签名是否匹配:重写要求子类方法名、参数列表完全相同且满足访问修饰符、异常、返回类型(协变)等条件;重载仅要求同名但参数列表不同,解析在编译期完成。

Java 中判断一个方法是重写(Override)还是重载(Overload),核心依据是方法签名(Method Signature)是否与父类/接口中已有的方法匹配,以及该方法是否出现在子类中。关键点在于:重写看“同名同参同返回(协变除外)”,重载看“同名不同参”。
什么是方法签名
Java 规定,方法签名由方法名 + 参数类型列表(不包括参数名和顺序)组成,返回类型不是方法签名的一部分。例如:
-
void print(String s)和int print(String s)方法签名相同(都是print(String)),仅返回类型不同 → 不构成重载,也不能同时存在(编译报错) -
void print(String s)和void print(Object o)签名不同(print(String)vsprint(Object))→ 是重载 -
void print(String s, int n)和void print(int n, String s)签名也不同(参数类型顺序不同)→ 是重载
重写的识别条件(必须同时满足)
子类中定义的方法要被视为重写父类方法,需满足:
- 方法名相同
- 参数列表完全相同(类型、个数、顺序一致)
- 返回类型相同,或是父类返回类型的子类型(协变返回类型,如父类返回
Object,子类可返回String) - 访问修饰符不能更严格(如父类是
protected,子类不能是private) - 不能抛出比父类方法更多的受检异常(只能抛出相同、子类或不抛)
- 父类方法不能是
static、final或private(否则无法重写)
只要方法签名匹配且满足上述规则,JVM 就会在运行时根据实际对象类型动态绑定到子类方法 —— 这就是多态的体现。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
重载的识别条件(只看本类或同一作用域)
重载发生在同一个类、或子类继承父类后在子类中新增方法时,只要满足:
- 方法名相同
- 参数列表不同(类型、个数、顺序至少一项不同)
注意:重载与返回类型、访问修饰符、异常声明无关;重载解析在编译期完成,由编译器根据调用处的实参类型静态决定调用哪个方法。
容易混淆的典型场景
以下情况常被误判,需特别注意:
-
子类加了
@Override注解但编译失败 → 很可能是参数类型不一致(如父类是List<String>,子类写了ArrayList<String>),虽然语义接近,但方法签名不同 → 实际是重载,不是重写 -
重写时改了返回类型 → 若新返回类型不是原返回类型的子类型(如父类返回
Number,子类返回String),编译失败;若符合协变规则(如父类返回Number,子类返回Integer),合法且是重写 -
静态方法同名同参 → 不是重写(只是隐藏,
static方法不参与多态),也不是重载(若在同一类中定义两个同签名static方法会编译失败)

















