Anish Singh Walia 2022-10-01
重写(Overriding)和重载(Overloading)是 Java 编程中的核心概念。它们是我们在 Java 程序中实现多态性(Polymorphism)的方式。多态性是面向对象编程(OOP)的基本概念之一。
当超类(父类)和子类中的方法签名(方法名和参数)完全相同时,称为重写(Overriding)。
当同一个类中存在两个或多个方法名相同但参数不同的方法时,称为重载(Overloading)。
重写与重载对比
| 特性 | 重写(Overriding) | 重载(Overloading) |
|---|---|---|
| 实现的多态类型 | 运行时多态(Runtime Polymorphism) | 编译时多态(Compile-time Polymorphism) |
| 方法调用时机 | 在运行时根据对象的实际类型决定 | 在编译时就已确定 |
| 发生位置 | 超类与子类之间 | 同一个类内部 |
| 方法签名要求 | 方法名和参数必须完全相同 | 方法名相同,但参数列表不同 |
| 错误检测时机 | 出错会在运行时显现 | 出错可在编译时被捕获 |
重写与重载示例
以下是一个包含重写和重载的 Java 程序示例:
package com.journaldev.examples;
import java.util.Arrays;
public class Processor {
public void process(int i, int j) {
System.out.printf("Processing two integers: %d, %d\n", i, j);
}
public void process(int[] ints) {
System.out.println("Adding integer array: " + Arrays.toString(ints));
}
public void process(Object[] objs) {
System.out.println("Adding integer array: " + Arrays.toString(objs));
}
}
class MathProcessor extends Processor {
@Override
public void process(int i, int j) {
System.out.println("Sum of integers is " + (i + j));
}
@Override
public void process(int[] ints) {
int sum = 0;
for (int i : ints) {
sum += i;
}
System.out.println("Sum of integer array elements is " + sum);
}
}
重写(Overriding)
Processor类中的process(int i, int j)方法在子类MathProcessor中被重写(第 7 行 与 第 23 行):
public class Processor {
public void process(int i, int j) { /* ... */ }
}
class MathProcessor extends Processor {
@Override
public void process(int i, int j) { /* ... */ }
}
Processor类中的process(int[] ints)方法也在子类中被重写(第 11 行 与 第 28 行):
public class Processor {
public void process(int[] ints) { /* ... */ }
}
class MathProcessor extends Processor {
@Override
public void process(int[] ints) { /* ... */ }
}
注意:虽然
Processor类还有一个process(Object[] objs)方法,但它没有被重写,因为MathProcessor中没有提供对应签名的实现。
重载(Overloading)
Processor类中对process()方法进行了三次重载(第 7、11、15 行):
public class Processor {
public void process(int i, int j) { /* ... */ }
public void process(int[] ints) { /* ... */ }
public void process(Object[] objs) { /* ... */ }
}
这三个方法具有相同的名称 process,但参数类型不同,因此构成了方法重载。
结论
本文介绍了 Java 中的重写与重载:
- 重写发生在父类与子类之间,要求方法签名完全一致,用于实现运行时多态。
- 重载发生在同一个类中,要求方法名相同但参数列表不同,用于实现编译时多态。