首页 > 编程笔记 > Java笔记 阅读:23

Java方法重载的使用(附带实例)

在 Java 中,方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有的参数类型、参数个数或不同类型的参数顺序不同。

方法重载不要求用户在调用一个方法之前转换数据类型,它会自动地寻找匹配的方法。方法重载对于编写结构清晰而简洁的类有很大的作用。

Java构造方法的重载

在实际开发中定义类时,只提供一个构造方法往往不能满足需求,所以需要提供多个构造方法,以提高类的适用性,这就符合方法重载的条件。

以现实生活中的汽车为例,汽车厂家生产卡车与轿车时,出厂的配置是不一样的,这时就需要设置不同的参数配置。Java 程序中的类也一样,使用构造方法创建对象并初始化成员变量时,也需要根据不同的实际需求配置不同的成员变量,而构造方法的重载就可以满足这一需求。

接下来,通过案例来演示构造方法的重载。
class Dog {
    private String name;        // 声明名字私有属性
    private int age;            // 声明年龄私有属性

    public Dog(String str) {
        name = str;
    }

    public Dog(String str, int n) {
        name = str;
        age = n;
    }

    public void show() {        // 定义显示信息的方法
        System.out.println("名字:" + name + ",年龄:" + age);
    }
}

public class Demo {
    public static void main(String[] args) {
        Dog d1 = new Dog("旺财");       // 创建对象并调用只有1个参数的构造方法
        Dog d2 = new Dog("花花", 5);   // 创建对象并调用有两个参数的构造方法
        d1.show();
        d2.show();
    }
}
程序的运行结果如下:

名字是旺财,年龄:0
名字是花花,年龄:5

程序中,在 Dog 类中定义了两个构造方法,两个方法的参数列表不同,符合重载条件。在创建对象时,根据参数的不同,分别调用不同的构造方法。其中,一个参数的构造方法只对 name 属性进行初始化,此时 age 属性为默认值 0;两个参数的构造方法根据实参分别对 nane 和 age 属性进行初始化。

思考一下,构造方法访问权限可以是 private 的吗?如果使用 private 修饰构造方法,该构造方法只能在当前类中使用,不允许在外边访问,一般用于单例设计模式的设计场景。

Java成员方法的重载

成员方法的重载即在同一个类中定义多个方法名相同,但参数列表不同的成员方法。调用重载的成员方法时,Java 编译器会根据实参列表寻找最匹配的方法进行调用。

接下来,通过在一个类中分别定义求两个整数、浮点数和的重载方法来演示成员方法的重载。
public class Demo {
    public static void main(String[] args) {
        Demo0509 demo0509 = new Demo0509();
        // 调用add(int, int)方法
        System.out.println("5和9的和:" + demo0509.add(5, 9));
        // 调用add(double, double)方法
        System.out.println("5.0和9.0的和:" + demo0509.add(5.0, 9.0));
    }

    public int add(int n1, int n2) {    // 返回两个整数的和
        return n1 + n2;
    }

    public double add(double n1, double n2) {    // 返回两个浮点数的和
        return n1 + n2;
    }
}
程序的运行结果如下:

5和9的和:14
5.0和9.0的和:14.0

在调用重载方法时,出现两个或多个可能的匹配时,编译器无法判断哪个是最精确的匹配,则会产生编译错误,称为歧义调用。

接下来,通过案例来演示重载的成员方法歧义调用的情况。
public class Demo {
    public double add(int n1, double n2) {    // 返回整数和浮点数的和
        return n1 + n2;
    }

    public double add(double n1, int n2) {   // 返回浮点数和整数的和
        return n1 + n2;
    }

    public static void main(String[] args) {
        Demo0510 demo0510 = new Demo0510();
        System.out.println(demo0510.add(5, 9));
    }
}
程序编译错误,并提示“Ambiguous method call. Both”,中文含义为“成员方法重复”,出错的原因在于 min(int, double) 和 min(double, int) 与 min(5,9) 都匹配,从而产生二义性,导致编译错误。

Java 的方法调用符合就近原则,可归结为:向上就近匹配原则。如果方法的参数列表中的数据类型和调用时给出的参数类型不尽相同,则会根据向上匹配的就近原则调用。即类型就近向上转化匹配。此处,int 和 double 处于同一级别,参数同时符合两种参数类型,从而导致了二义性错误。

相关文章