Java 中的方法重写(Overriding)与方法重载(Overloading)
作者:Pankaj
导语
方法重写和方法重载是 Java 编程中的核心概念,用于在 Java 程序中应用多态。多态是 OOPS 概念之一。
![](https://journaldev.nyc3.digitaloceanspaces.com/2019/08/overriding-vs-overloading-in-java.png)
方法重写 出现在基类与子类的方法签名(名称与形参)一致时。而 方法重载 指一个类中的两个或多个方法使用相同名称,而形参不同。
方法重写 | 方法重载 |
---|---|
应用了“运行时多态” | 应用了“编译时多态” |
运行时基于对象类型决定调用的方法 | 编译时决定调用的方法 |
出现在基类与子类之间 | 出现在同一类中的方法之间 |
拥有相同签名(名称与方法实参原文之前用的是parameter,这里变成了argument。还是都直接翻成参数?) | 拥有相同名称,但形参不同 |
错误在运行时出现 | 错误在编译时出现 |
方法重写与方法重载的例子
以下是一个 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", 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);
}
}
方法重写
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(Object[] objs) { /* ... */ }
}
方法重载
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) { /* ... */ }
}
结语
本文介绍了 Java 中的方法重写与重载。方法重写发生在基类与子类的方法签名相同时。而方法重载发生在同一类中,当两个或多个方法名称相同但参数不同时。