java中子类同名实例方法只可能重载或重写:参数不同为重载,签名相同且满足条件为重写;实例方法不存在“隐藏”,隐藏仅适用于静态方法和字段。

Java 中子类出现同名方法时,是否属于“重载”还是“隐藏”,取决于它和父类方法的签名关系与所在作用域。这不是语义混淆,而是有明确规则可循——关键看:是否在同一类中定义?参数列表是否不同?是否继承自父类?
子类里的同名方法,只有两种可能:重载 or 重写(不是隐藏)
Java 中,“隐藏(hiding)”只适用于字段(变量)和静态方法,不适用于实例方法。
所以当子类中出现一个和父类同名的方法:
- ✅ 如果参数列表不同 → 是重载(overload),发生在子类自身作用域内
- ✅ 如果方法名 + 参数列表完全相同(且满足重写条件)→ 是重写(override)
- ❌ 不会因为“同名”就自动变成“隐藏”——实例方法不存在“隐藏”一说
⚠️ 常见误解:看到
Child类里写了void show(),而父类也有void show(),就以为“子类把父类方法隐藏了”。错。这是重写(如果签名一致)或重载(如果参数不同),不是隐藏。
如何一眼区分:是重载?还是重写?
| 判断维度 | 重载(Overload) | 重写(Override) |
|---|---|---|
| 发生位置 | 同一个类内部(包括子类自己定义的多个版本) | 子类中定义,且父类已有可访问的同签名方法 |
| 方法签名要求 | 方法名相同,参数列表必须不同 | 方法名相同,参数列表必须完全一致 |
| 返回类型 | 任意(不影响判定) | 必须相同,或为协变返回类型(如父类返回 Object,子类可返回 String) |
| 访问修饰符 | 任意 | 不能比父类更严格(如父类 protected,子类不能 private) |
是否需要 @Override |
❌ 不可用(编译报错) | ✅ 强烈建议加,否则 IDE 和编译器无法帮你检查拼写/签名错误 |
示例:
class Parent {
void print() { System.out.println("Parent"); }
void print(String s) { System.out.println("Parent: " + s); }
}
class Child extends Parent {
// ✅ 重写:签名与父类 void print() 完全一致
@Override
void print() { System.out.println("Child"); }
// ✅ 重载:在 Child 类内部新增,参数不同(与父类的 print(String) 同名但不构成重写,因签名不同)
void print(int n) { System.out.println("Child int: " + n); }
// ✅ 也是重载:和自身上面的 print(int) 参数不同
void print(String s, int n) { System.out.println("Child str+int"); }
}
注意:Child.print(String) 没写,它直接继承自 Parent;Child.print(int) 是子类自己新增的——这跟父类无关,纯属子类内部重载。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
为什么没有“子类方法隐藏父类方法”这种事?
因为 Java 对实例方法采用运行时动态绑定(dynamic dispatch):
调用哪个 print(),取决于对象的实际类型(new Child()),而不是引用类型(Parent p = new Child())。
而“隐藏”是编译期静态绑定的行为,只适用于:
- 静态方法(
static)→ 子类同名static方法会隐藏父类的 - 字段(成员变量)→ 子类同名字段会隐藏父类字段
这两者都不参与多态,也不受 @Override 约束。
所以只要看到 void xxx(...) 这样的实例方法:
- 在子类里写了,且签名和父类一样 → 就是重写(别犹豫)
- 在子类里写了,但参数不同 → 就是重载(和父类方法无关,只是名字碰巧一样)
- 没写 → 就直接用继承来的那个,不存在“被隐藏”
实战建议:避免混淆的三个习惯
永远给重写方法加上
@Override注解
编译器立刻告诉你:是不是真能重写?有没有拼错?返回类型对不对?不要在子类里“仅改名不改参”地复制父类方法
比如父类有void save(),子类写个void save()却忘了加@Override→ 很可能误写成void Save()或void save(String),结果变成重载或新方法,逻辑悄悄跑偏。字段尽量不重名;方法重名但参数不同,要确保意图清晰
比如setPrice(double)和setPrice(BigDecimal)可以共存,但得确认业务上确实需要两种输入方式,而不是为了“看起来功能多”。
不复杂,但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










