文章共 791 字,阅读完预计需要 1 分钟 20 秒。文章篇幅适中,可以放心阅读。

二十四、方法重载

1 什么是方法重载

Java 允许同一个类中定义多个同名方法,只要它们的形参列表不同即可。如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,这种情况被称为方法重载(overload)

例如,在 JDK 的 java.io.PrintStream 中定义了十多个同名的 println() 方法。

public void println(int i){…}
public void println(double d){…}
public void println(String s){…}

这些方法完成的功能类似,都是格式化输出。根据参数的不同来区分它们,以进行不同的格式化处理和输出。它们之间就构成了方法的重载。实际调用时,根据实参的类型来决定调用哪一个方法。例如:

System.out.println(102);    // 调用println(int i)方法
System.out.println(102.25);    // 调用println(double d)方法
System.out.println("价格为 102.25");    // 调用println(String s)方法

方法重载的要求是两同一不同:同一个类中方法名相同,参数列表不同。至于方法的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系。

使用方法重载其实就是避免出现繁多的方法名,有些方法的功能是相似的,如果重新建立一个方法,重新取个方法名称,会降低程序可读性。

2 案例

我们在打招呼时,一般最快想到的方式,是说一句“你好!”。而当我们知道对方的名字时,我们会在打招呼时,带上对方的名字:“你好,XXX!”。最后,为了彰显我们的有礼貌,我们常使用“嘿!”与年龄较小的人打招呼;使用“你好!”与青年人打招呼;而使用“您好!”与中老年人打招呼。

那么这样的打招呼方式,应该怎样体现在代码中呢?

public class Test5 {
    public static void main(String[] args) {
        Person ming = new Person();
        ming.name = "Xiao Ming";
        ming.sayHello();
        ming.sayHello("小红");
        ming.sayHello("小红", 8);
    }
}

class Person {
    public String name;    // 姓名

    public void sayHello() {
        System.out.println("你好!");
    }

    public void sayHello(String name) {
        System.out.println("你好," + name + "!");
    }

    public void sayHello(String name, int age) {
        if (age < 20){
            System.out.println("嘿," + name + "!");
        }else if (age < 40){
            System.out.println("你好," + name + "!");
        }else {
            System.out.println("您好," + name + "!");
        }

    }
}

3 为什么方法重载不能用方法的返回值类型区分呢?

我们假设有以下两个方法:

int f(){...}
String f(){...}

如果我们使用如下方式调用这两个方法:

int    a =  f();
String b =  f();

那么计算机确实可以分析出,第一处使用 int f(){...} ,而第二处使用 String f(){...}

Java 调用方法时允许忽略方法返回值,如果采用如下方法来调用f();,你能判断是调用哪个方法吗?

f();
f();

如果你尚且不能判断,那么 Java 系统也会糊涂。在编程过程中有一条重要规则就是不要让系统糊涂,系统一糊涂,肯定就是你错了。因此,Java 里不能用方法返回值类型作为区分方法重载的依据。

My favorite thing is to leave this blank :)

Switch Theme | SCHEME TOOL