📌 目录
- 概述
- 方法重写(Override)
- 2.1 基本概念
- 2.2 语法规则
- 2.3 示例代码
- 2.4
@Override
注解 - 2.5 重写与访问权限
- 方法重载(Overload)
- Override 与 Overload 的区别
- 参考资料
- 出站链接
1. 概述
在 Java 语言中,方法的**重写(Override)和重载(Overload)**是两种不同的技术,它们都提高了代码的可读性和可维护性,但适用场景和规则不同。
- 方法重写(Override):子类对父类的某个方法提供新的实现,覆盖原有方法。
- 方法重载(Overload):在同一个类中,方法名相同但参数列表不同(参数个数或类型不同)。
2. 方法重写(Override)
2.1 基本概念
**方法重写(Method Overriding)**指的是子类提供一个与父类方法相同签名(方法名、参数列表、返回类型相同)的实现,目的是改变或增强父类的行为。
2.2 语法规则
✅ 重写方法的规则:
- 方法名必须相同
- 参数列表必须完全相同
- 返回类型必须相同(Java 5+ 允许返回协变类型,即子类)
- 不能缩小访问权限(如父类方法是
public
,子类不能是protected
) - 不能重写
final
方法 - 不能重写
static
方法(但可以隐藏)
2.3 示例代码
class Parent {
void showMessage() {
System.out.println("父类方法");
}
}
class Child extends Parent {
@Override
void showMessage() {
System.out.println("子类重写的方法");
}
}
public class OverrideExample {
public static void main(String[] args) {
Parent obj = new Child();
obj.showMessage(); // 调用子类重写的方法
}
}
输出:
子类重写的方法
2.4 @Override
注解
@Override
是可选的,但推荐使用,可以帮助编译器检查方法是否正确重写。
✅ 示例(如果方法签名不匹配,编译器会报错):
class Parent {
void show() { }
}
class Child extends Parent {
@Override
void show() { } // ✅ 正确
}
class Child extends Parent {
@Override
void shows() { } // ❌ 编译错误(方法名不匹配)
}
2.5 重写与访问权限
父类方法权限 | 子类方法的最低权限 |
---|---|
public | public |
protected | protected 或 public |
default | default 、protected 或 public |
private | 不能被重写 |
3. 方法重载(Overload)
3.1 基本概念
方法重载(Method Overloading)指的是在同一个类中,方法名称相同,但参数列表不同(参数类型、个数或顺序不同)。
重载的优点:
- 提高代码的可读性
- 便于维护,提高复用性
3.2 语法规则
✅ 方法重载规则:
- 方法名必须相同
- 参数列表必须不同(参数个数、类型或顺序不同)
- 返回值类型可以不同,但不能仅靠返回类型区分重载
- 不能使用
static
或final
仅仅来区分重载
3.3 示例代码
class MathUtils {
// 方法重载:参数个数不同
int add(int a, int b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
// 方法重载:参数类型不同
double add(double a, double b) {
return a + b;
}
}
public class OverloadExample {
public static void main(String[] args) {
MathUtils math = new MathUtils();
System.out.println(math.add(2, 3)); // 5
System.out.println(math.add(2, 3, 4)); // 9
System.out.println(math.add(2.5, 3.2)); // 5.7
}
}
4. Override 与 Overload 的区别
区别 | 重写(Override) | 重载(Overload) |
---|---|---|
适用范围 | 父类与子类 | 同一个类 |
方法名 | 必须相同 | 必须相同 |
参数列表 | 必须相同 | 必须不同(参数类型、个数、顺序) |
返回类型 | 必须相同(Java 5+ 支持协变返回类型) | 可以不同,但不能仅靠返回类型区分 |
访问修饰符 | 不能比父类更严格 | 可以任意 |
static 方法 | 不能重写(但可以隐藏) | 可以重载 |
关键字 | @Override (可选) | 无需特殊关键字 |
适用场景 | 改变父类方法的行为 | 提供多个同名方法,支持不同的参数类型 |
发表回复