我们知道构造方法的名称是由类名决定的,所以构造方法只有一个名称。如果希望以不同的方式来实例化对象,就需要使用多个构造方法来完成。由于这些构造方法都需要根据类名来进行命名,为了让方法名相同而形参不同的构造方法同时存在,必须用到方法重载。虽然方法重载起源于构造方法,但它也可以应用到其他方法中。方法的重载其实就是在同一个类中允许存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可。
例:方法名为 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 a;
}
// 与上一个方法的参数顺序不同
public static int add(double a, int b) {
return b;
}
public static void main(String args[]) {
System.out.println("调用 add(int,int)方法:" + add(7, 8));
System.out.println("调用 add(double,double)方法:" + add(7.7, 8.8));
System.out.println("调用 add(int)方法:" + add(7));
System.out.println("调用 add(int,double)方法:" + add(7, 8.8));
System.out.println("调用 add(double,int)方法:" + add(7.7, 8));
}
}
运行结果如下:
在上述例子中分别定义了5个方法,在这5个方法中,前两个方法的参数类型不同,并且方法的返回值类型也不同。所以这两个方法构成重载关系;前两个方法与第3个方法相比,第三个方法的参数个数少于前两个方法,所以这三个方法也构成了重载关系;最后两个方法相比,发现除了参数的顺序不同之外,其他都相同,同样也构成了重载关系。于是,上述例子表明了所有可以构成重载的条件。
虽然在方法重载中可以使两个方法的返回值类型不同,但只有返回类型不同并不足以区分两个方法的重载,还需要通过参数的个数以及参数的类型来设置。
根据构成方法重载的条件,可以总结出编译器是利用方法名、方法各参数类型和参数的个数以及参数的顺序来确定类中的方法是否唯一。方法的重载使得方法以统一的名称被管理,使得代码有条理。当然,在谈到参数个数可以确定两个方法是否具有重载关系时,会想到定义不定长参数方法。
不定长参数方法的定义语法为:
返回值 方法名(参数数据类型...参数名称)
在参数列表中使用 "..." 形式定义不定长参数,如 int add(int...a),其实这个不定长参数 a 就是一个数组,编译器会将这种 (int...a) 形式看作是 (int[] a) ,所以在 add() 方法体内做累加操作时使用到了 for 循环语句,在循环中是根据数组 a 的长度作为循环条件的,最后将累加结果返回。如:
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 a;
}
// 与上一个方法的参数顺序不同
public static int add(double a, int b) {
return b;
}
// 定义不定长参数方法
public static int add(int...a) {
int result = 0;
for (int i = 0; i < a.length; i++) {
result += a[i];
}
return result;
}
public static void main(String args[]) {
System.out.println("调用 add(int,int)方法:" + add(7, 8));
System.out.println("调用 add(double,double)方法:" + add(7.7, 8.8));
System.out.println("调用 add(int)方法:" + add(7));
System.out.println("调用 add(int,double)方法:" + add(7, 8.8));
System.out.println("调用 add(double,int)方法:" + add(7.7, 8));
System.out.println("调用 add(int...a)方法:" + add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
}
}
执行结果为:
由上可知,定义不定长参数依然可以作为 add() 方法的重载方法,由于它的参数是不定长的,所以满足根据参数各分区分重载的条件。