定义:子类对父类中已有的方法进行重新实现,保持方法名、参数列表和返回值类型完全一致,以适应子类自身的业务逻辑。
核心特点:
-
发生位置:存在继承关系的父类与子类之间
-
方法签名:方法名、参数列表(类型、顺序、数量)必须完全相同
-
返回值类型:
-
基本类型:必须与父类完全一致
-
引用类型:允许是父类返回值类型的子类(协变返回类型,Java 5 + 支持)
-
访问修饰符:子类重写方法的访问权限不能比父类更严格(如父类是public,子类不能是protected)
-
异常处理:子类抛出的异常不能比父类更宽泛(可以是相同或更小范围的异常)
-
关键字:常与@Override注解配合使用(非必需,但推荐,用于编译时检查)
示例:
java
class Animal {
public void makeSound() {
System.out.println("动物发出声音");
}
}
class Dog extends Animal {
// 重写父类方法
@Override
public void makeSound() {
System.out.println("狗叫:汪汪汪");
}
}
作用:实现运行时多态(动态绑定),即程序运行时根据对象的实际类型调用对应的方法。
2. 重载(Overload)
定义:在同一个类中,允许存在多个同名方法,但它们的参数列表(类型、顺序、数量)不同。
核心特点:
- 发生位置:同一个类中(或父类与子类中,但不推荐)
- 方法签名:方法名相同,但参数列表必须不同(参数类型、顺序、数量至少有一个不同)
- 返回值类型:可以相同也可以不同(仅返回值不同不能构成重载)
- 访问修饰符:无限制
- 异常处理:抛出的异常可以不同
- 关键字:无特殊关键字
示例:
java
class Calculator {
// 重载1:两个int相加
public int add(int a, int b) {
return a + b;
}
// 重载2:三个int相加(参数数量不同)
public int add(int a, int b, int c) {
return a + b + c;
}
// 重载3:两个double相加(参数类型不同)
public double add(double a, double b) {
return a + b;
}
// 重载4:int和double相加(参数顺序隐含类型不同)
public double add(int a, double b) {
return a + b;
}
}
作用:实现编译时多态(静态绑定),即编译时根据方法参数决定调用哪个版本的方法,提高代码灵活性。
3. 核心区别对比
发生范围 | 父类与子类之间 | 同一个类中 |
方法名 | 必须相同 | 必须相同 |
参数列表 | 必须相同 | 必须不同(类型 / 顺序 / 数量) |
返回值类型 | 基本类型相同;引用类型可协变 | 可相同或不同 |
访问修饰符 | 子类权限 ≥ 父类权限 | 无限制 |
多态类型 | 运行时多态(动态绑定) | 编译时多态(静态绑定) |
异常处理 | 子类异常 ≤ 父类异常范围 | 无限制 |
与继承的关系 | 依赖继承 | 不依赖继承 |
4. 常见误区
- 认为 “返回值不同即可构成重载”:错误,重载的判定仅看参数列表,与返回值无关。
- 认为 “子类与父类的同名方法一定是重写”:若参数列表不同,则是子类对父类的 “隐藏”(hide),而非重写。
- 混淆访问修饰符规则:重写时子类权限不能更严格(如父类protected,子类不能是private),而重载无此限制。
通过理解两者的应用场景和规则,可以更清晰地在 Java 中设计灵活且易维护的代码结构。
评论前必须登录!
注册