方法的重载

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

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

【例7.8】编写不同形式的加法运算方法(实例位置:资源包\TM\sl\7\8)

创建 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) { // 先int参数,后double参数
        return a; // 输出int参数值
    }

    public static int add(double a, int b) { // 先double参数,后int参数
        return b;// 输出int参数值
    }

    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(int,double)方法:" + add(5, 8.0));
        System.out.println("调用add(double,int)方法:" + add(5.0, 8));

    }
}

运行结果如下:

     调用add(int,int)方法:3
     调用add(double,double)方法:5.4
     调用add(int)方法:1
     调用add(int,double)方法:5
     调用add(double,int)方法:8

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

image 2024 02 29 18 01 20 544
Figure 1. 图7.6 构成方法重载的条件

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

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

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

     返回值 方法名(参数数据类型…参数名称)

如果将上述代码放在例7.8中,关键代码如例7.9所示。

【例7.9】使用不定长参数重载加法运算方法(实例位置:资源包\TM\sl\7\9)

创建 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 a;
    }

    public static int add(int a, double b) { // 先int参数,后double参数
        return a; // 输出int参数值
    }

    public static int add(double a, int b) { // 先double参数,后int参数
        return b;// 输出int参数值
    }

    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(int,double)方法:" + add(5, 8.0));
        System.out.println("调用add(double,int)方法:" + add(5.0, 8));

        // 调用不定长参数方法
        System.out.println("调用不定长参数方法:" + add(1, 2, 3, 4, 5, 6, 7, 8, 9));
        System.out.println("调用不定长参数方法:" + add(1));
    }
}

运行结果如下:

     调用add(int,int)方法:3
     调用add(double,double)方法:5.4
     调用add(int)方法:1
     调用add(int,double)方法:5
     调用add(double,int)方法:8
     调用不定长参数方法:45
     调用不定长参数方法:1

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

编程训练(答案位置:资源包\TM\sl\7\编程训练)

【训练9】购物车 某商品单价580元,购买两件或多于两件的该商品享8折优惠。在控制台上输入购买商品的数量,编写两个同名的pay()方法,一个方法用于输出购买一件商品的应付金额,另一个方法用于输出购买两件或多于两件商品的应付金额。

【训练10】大写转小写 定义一个值为66的整数,编写两个同名的print()方法,一个方法用于输出在ASCII表中这个整数对应的大写字母,另一个方法用于输出这个大写字母对应的小写字母。运行结果如下:

     在ASCII表中,66对应的大写字母是B。
     B的小写字母是b。