方法重载只发生在同一个类内部,与包、继承无关;子类中同名不同参的方法是独立新方法,非对父类的重载;重写才涉及父子类关系,且受访问权限和包结构约束。

方法重载(Overload)只发生在**同一个类内部**,和包、继承、访问权限都无关。不同包下的父子类之间,**不存在“跨包方法重载”这回事**——重载不涉及子类对父类方法的修改或扩展,它只是编译期根据参数签名在同一作用域内做静态分派。
重载只看所在类,不看包和继承关系
无论父类在哪个包、子类在哪个包,只要重载定义在同一个类里,就成立;如果想在子类中“重载父类方法”,那本质上只是在子类中定义了新方法——它和父类方法同名但参数不同,二者属于**两个独立的方法**,没有覆盖关系,也不构成跨类重载。
例如:
- 父类 com.utils.Calculator 中有
add(int a, int b) - 子类 com.app.math.AdvancedCalc(不同包)中写了
add(double a, double b) - 这个
add(double, double)是子类自己的重载方法,和父类的add(int, int)毫无调用绑定关系 - 编译器只根据你传的实参类型,在 AdvancedCalc 类自身声明的方法中匹配最合适的那个
继承中真正要注意的是“重写”而非“重载”
当子类需要改变父类已有方法的行为时,用的是重写(Override),不是重载。这时包结构会影响能否重写:
立即学习“Java免费学习笔记(深入)”;
- 父类方法是
default(包级私有):子类必须与父类在同一包才能重写 - 父类方法是
protected或public:子类可在任意包中重写 - 重写要求方法签名(名+参数列表+返回类型)完全一致,和重载的“参数不同”原则相反
常见误区澄清
很多人误以为“子类加个同名不同参的方法就是重载了父类方法”,这是不对的。Java 中:
- 重载是单类行为:只在一个类的范围内讨论多个同名方法
- 重写是父子行为:发生在子类对父类可访问方法的重新实现
- 子类中既存在继承来的父类方法,又定义了同名但参数不同的方法 → 这叫“子类方法 + 继承方法共存”,不是“对父类方法重载”
- 返回值类型、异常、访问修饰符差异,不影响重载判断;但这些恰恰是重写的硬性约束点
实际编码建议
若需统一处理多类型计算,推荐方式不是依赖跨包重载,而是:
- 在工具类中集中定义一组
static重载方法(如MathUtils.max(int, int)/max(double, double)) - 用泛型 + 类型擦除配合
Objects.equals()等通用逻辑替代大量重载 - 若涉及继承体系,优先通过抽象方法 + 模板方法模式让子类定制行为,而非靠重载堆砌


















