二十四、方法重载
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 里不能用方法返回值类型作为区分方法重载的依据。