Skip to main content

Java 中的方法重写(Overriding)与方法重载(Overloading)

作者:Pankaj

导语

方法重写方法重载是 Java 编程中的核心概念,用于在 Java 程序中应用多态。多态是 OOPS 概念之一。

Java 代码的截图,箭头分别指向出现方法重写与方法重载的实例

方法重写 出现在基类与子类的方法签名(名称与形参)一致时。而 方法重载 指一个类中的两个或多个方法使用相同名称,而形参不同。

方法重写方法重载
应用了“运行时多态”应用了“编译时多态”
运行时基于对象类型决定调用的方法编译时决定调用的方法
出现在基类与子类之间出现在同一类中的方法之间
拥有相同签名(名称与方法实参原文之前用的是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 中的方法重写与重载。方法重写发生在基类与子类的方法签名相同时。而方法重载发生在同一类中,当两个或多个方法名称相同但参数不同时。