java方法的重载

在之前文章。。。。。。中我们曾学习过构造方法,知道构造方法的名称由类名决定,所以构造方法只有一个名称。如果希望以不同的方式来实例化对象,就需要使用多个构造方法来完成。由于这些构造方法都需要根据类名进行命名,为了让方法名相同而形参不同的构造方法同时存在,必须用到方法重载。虽然方法重载起源于构造方法,但它也可以应用到其他方法中。本节将讲述方法的重载。

方法的重载就是在同一个类中允许存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可。为了更好地解释重载,来看下面 的实例。

【例子1】在项目中创建OverLoadTest类,在类中编写add()方法的多个重载形式,然后在主方法中分别输出这些方法的返回值。

public class OverLoadTest {
	public static int add(int a, int b) { // 定义一个方法
		return a + b;
	}
	
	// 定义与第一个方法相同名称、参数类型不同的方法
	public static double add(double a, double b) {
		return a + b;
	}
	
	public static int add(int a) { // 定义与第一个方法参数个数不同的方法
		return a;
	}
	
	public static int add(int a, double b) { // 定义一个成员方法
		return 1;
	}
	
	// 这个方法与前一个方法参数次序不同
	public static int add(double a, int b) {
		return 1;
	}
	
	public static void main(String args[]) {
		System.out.println("调用add(int,int)方法:" + add(1, 2));
		System.out.println("调用add(double,double)方法:" + add(2.1, 3.3));
		System.out.println("调用add(int)方法:" + add(1));
	}
}
方法的重载
方法的重载

在本实例中分别定义了5个方法,在这5个方法中,前两个方法的参数类型不同,并且方法的返回值类型也不同,所以这两个方法构成重载关系;前两个方法与第3个方法相比,第3个方法的参数个数少于前两个方法,所以这3个方法也构成了重载关系;最后两个方法相比,发现除 了参数的出现顺序不同之外,其他都相同,同样构成了重载关系。下图表明了所有可以构成了重载的条件。

构成方法重载的条件
构成方法重载的条件

根据上图所示的构成方法重载的条件,可以总结出编译器是利用方法名、方法各参数类型和参数的个数以及参数的顺序来确定类中的方法是否唯一。方法的重载使得方法以统一的名称被管理,使程序代码有条理。

注意:虽然在方法重载中可以使两个方法的返回类型不同,但只有返回类型不同并不足以区分两个方法的重载,还需要通过参数的个数以及参数的类型来设置。

在谈到参数个数可以确定两个方法是否具有重载关系时,会想到定义不定长参数方法。

【例子2】修改本文实例1,在例子2中添加如下方法。

add()重载方法

上述方法又是一个add()重载方法,它与例1中方法的不同之处在于该方法为不定长参数方法。

不定长方法的语法如下:返回值 方法名(参数数据类型…参数名称)

在参数列表中使用“…”形式定义不定长参数,其实这个不定长参数 a就是一个数组,编译器会将(int…a)这种形式看作是(int[]a),所以在add()方法体做累加操作时使用到了for循环语句,在循环中是根据数组a 的长度作为循环条件的,最后将累加结果返回。

如果将上述代码放在例1中,关键代码如例3。

【例子3】在项目中创建OverLoadTest2类,在类中编写add()方法的多种重载形式,并编写该方法的不定长参数形式。然后在主方法中调用这些重载方法,并输出返回值。

public class OverLoadTest2 {
	public static int add(int a, int b) {
		return a + b;
	}
	
	public static double add(double a, double b) {
		return a + b;
	}
	
	public static int add(int a) {
		return 1;
	}
	
	public static int add(int a, double b) {
		return 1;
	}
	
	public static int add(double a, int b) {
		return 1;
	}
	
	public static int add(int... a) { // 定义不定长参数方法
		int s = 0;
		for (int i = 0; i < a.length; i++)
			// 根据参数个数做循环操作
			s += a[i]; // 将每个参数累加
		return s; // 将计算结果返回
	}
	
	public static void main(String args[]) {
		System.out.println("调用add(int,int)方法:" + add(1, 2));
		System.out.println("调用add(double,double)方法:" + add(2.1, 3.3));
		System.out.println("调用add(int)方法:" + add(1));
		// 调用不定长参数方法
		System.out.println("调用不定长参数方法:" + add(1,2, 3,4, 5,6, 7, 8, 9));
		System.out.println("调用不定长参数方法:" + add(1));
	}
}
调用不定长参数方法
调用不定长参数方法

从例3中可以看出,定义不定长参数依然可以作为add()方法的重载方法,由于它的参数是不定长的,所以满足根据参数个数区分重载的条件。

发表评论