Java核心:深入理解方法覆盖(Override)与重载(Overload)
引言
覆盖(Overriding)和重载(Overloading)是Java编程的核心概念,它们是实现Java程序中多态性的方法。多态性是面向对象编程(OOP)的基本概念之一。

当超类和子类的方法签名(名称和参数)相同时,称之为方法覆盖(或重写)。当同一类中有两个或更多方法具有相同名称但参数不同时,称之为方法重载。
覆盖与重载的比较
覆盖(Overriding) | 重载(Overloading) |
---|---|
实现“运行时多态” | 实现“编译时多态” |
方法调用在运行时根据对象类型确定 | 方法调用在编译时确定 |
发生在超类和子类之间 | 发生在同一类中的方法之间 |
具有相同的方法签名(名称和方法参数) | 具有相同的方法名称,但参数不同 |
出现错误时,效果将在运行时可见 | 出现错误时,可以在编译时捕获 |
方法覆盖和方法重载的示例
这是一个Java程序中重载和重写的例子。
package com.scdev.examples;
import java.util.Arrays;
public class Processor {
public void process(int i, int j) {
System.out.printf("处理两个整数:%d, %d", i, j);
}
public void process(int[] ints) {
System.out.println("添加整数数组:" + Arrays.toString(ints));
}
public void process(Object[] objs) {
System.out.println("添加对象数组:" + Arrays.toString(objs));
}
}
class MathProcessor extends Processor {
@Override
public void process(int i, int j) {
System.out.println("整数之和为 " + (i + j));
}
@Override
public void process(int[] ints) {
int sum = 0;
for (int i : ints) {
sum += i;
}
System.out.println("整数数组元素之和为 " + sum);
}
}
覆盖
在子类 MathProcessor
中,重写了父类 Processor
中的 process()
方法,该方法接受两个 int
类型参数。这体现在代码的第 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[]
类型参数。这体现在代码的第 11 行和第 28 行。
public class Processor {
public void process(int[] ints) { /* ... */ }
}
/* ... */
class MathProcessor extends Processor {
@Override
public void process(Object[] objs) { /* ... */ }
}
函数重载
在 Processor
类中,process()
方法进行了重载。具体来说,第 7、11 和 15 行展示了 process()
方法的不同重载形式。
public class Processor {
public void process(int i, int j) { /* ... */ }
public void process(int[] ints) { /* ... */ }
public void process(Object[] objs) { /* ... */ }
}
结论
在本文中,我们深入探讨了Java中的方法覆写(Overriding)和方法重载(Overloading)。当子类的方法签名与父类的方法签名完全一致时,即发生了方法覆写。而当同一个类中存在两个或多个方法,它们具有相同的名称但参数列表不同时,则称之为方法重载。