Java核心:深入理解方法覆盖(Override)与重载(Overload)

引言

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

Java中的覆盖与重载

当超类和子类的方法签名(名称和参数)相同时,称之为方法覆盖(或重写)。当同一类中有两个或更多方法具有相同名称但参数不同时,称之为方法重载。

覆盖与重载的比较

覆盖(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)。当子类的方法签名与父类的方法签名完全一致时,即发生了方法覆写。而当同一个类中存在两个或多个方法,它们具有相同的名称但参数列表不同时,则称之为方法重载。

bannerAds