8.1 方法重载概念与特征
方法重载(Overload)是指在同一个类中,多个方法有相同的名称但有不同的参数列表。构造方法作为一种特殊的方法也支持重载。方法重载是Java中实现多态的方式之一。重载的方法在调用时根据所传实参的不同选择不同的方法。
参数列表不同体现在:
-
数量不同
-
数据类型不同
-
顺序不同
方法重载的好处还在于逻辑类似但又不同参数的方法不用花精力为方法起名,也减少了记名的麻烦。
8.2 方法重载声明与调用示例
下面以几种不同的参数形式演示方法重载的语法
1、参数长度不同
public void add(int num1, int num2) {
}
public void add(int num1, int num2, int num3) {
}
2、数据类型不同
public void add(int num1, int num2) {
}
public void add(String s1, String s2) {
}
3、参数顺序不同
public void add(int num, String s) {
}
public void add(String s, int num) {
}
除了参数列表不同之外,其他部分不能作为方法重载的依据,比如返回值:
public void add(int num1, int num2) {
}
public int add(int num1, int num2) {
return num1 + num2;
}
上面两个方法不是合法的重载,
这几组不同参数列表的方法重载,在调用时是很好区分的,但是以下情况需要注意。
1、普通参数与可变长度参数
这种情况下,同类型的多个参数的方法可以被可变长度参数的方法"覆盖掉":
public class OverrideDemo {
public void add(int num1, int num2) {
System.out.println("add(int num1, int num2)");
}
public void add(int num1, int num2, int num3) {
System.out.println("add(int num1, int num2, int num3)");
}
public void add(int... num) {
System.out.println("add(int... num)");
}
}
上面有三个add 方法的重载形式,这是合法的,那么在调用时传入2个 int 实参的话,第一个方法和第三个方法都是可以接收到的,那么会使用哪个方式方法呢?
OverrideDemo demo=new OverrideDemo();
demo.add(2,3); // 输出 add(int num1, int num2)
结论很明显,传入2个int实参,优先找2个int形参的方法;依此类推,传入3个int实参,就会调用3个int形参的方法,如果是其他数量的int实参,就会调用带可变长度参数的add方法了。
2、基本数据类型参数
由于基本数据类型之间有自动转换的特点,所以下面几个方法的调用也要小心:
public class OverrideDemo {
public void print(int num) {
System.out.println("print(int num)");
}
public void print(short num) {
System.out.println("print(short num)");
}
public void print(long num) {
System.out.println("print(long num)");
}
public void print(float num) {
System.out.println("print(float num)");
}
public void print(double num) {
System.out.println("double num");
}
}
上面几个也是合法的重载方法,在调用时,优先会调用形参类型与实参类型完全相同的方法,比如:
OverrideDemo demo=new OverrideDemo();
demo.print(100); // 输出 print(int num)
但是实参的类型与形参不是完全相同,则会调用形参类型是比实参类型大的方法,相当于范围小的数据自动转换为范围大的数据,如果有多个范围大的形参,则从小依次往大寻找匹配的重载方法,比如,此时如果去掉int形参的方法,在会调用的是形参为long的方法,如果也没有long形参的方法,就会调用float形参的方法。
在开发中,不应使用相同的名称来重载不相关的方法。例如,使用名称“add”来命名数值相加和字符串拼接的方法。但这两个操作本质上是不同的。以这种方式应用方法重载违背了其初衷。
8.3 构造方法重载
构造方法重载遵循普通方法重载的语法,确保参数类别不同,比如:
public class Dog {
int age; // 年龄
float weight; // 体重
String breed; // 品种
String color; // 毛色
public Dog() {
this.age = 1;
this.weight = 1.5F;
this.breed = "西伯利亚哈士奇";
this.color = "灰色";
}
public Dog(int age) {
this.age = age;
this.weight = 1.5F;
this.breed = "西伯利亚哈士奇";
this.color = "灰色";
}
public Dog(int age, float weight) {
this.age = age;
this.weight = weight;
this.breed = "西伯利亚哈士奇";
this.color = "灰色";
}
public Dog(int age, float weight, String breed) {
this.age = age;
this.weight = weight;
this.breed = breed;
this.color = "灰色";
}
public Dog(int age, float weight, String breed, String color) {
this.age = age;
this.weight = weight;
this.breed = breed;
this.color = color;
}
}
上面的Dog类声明了5个构造方法,参数从0个到4个,这就是构造方法的重载形式。调用时传入合适的参数能匹配到合适的一个构造方法,除了传入实参为某个属性赋值,其他的属性都给定的默认值。
但是上面的写法看起来很重复,其实我们可以在构造方法中通过this调用其他形式的构造方法,这种情况下,全属性构造方法通常是被其他构造方法所调用。代码如下:
public class Dog {
int age; // 年龄
float weight; // 体重
String breed; // 品种
String color; // 毛色
public Dog() {
this(1, 1.5F, "西伯利亚哈士奇", "灰色");
}
public Dog(int age) {
this(age, 1.5F, "西伯利亚哈士奇", "灰色");
}
public Dog(int age, float weight) {
this(age, weight, "西伯利亚哈士奇", "灰色");
}
public Dog(int age, float weight, String breed) {
this(age, weight, breed, "灰色");
}
public Dog(int age, float weight, String breed, String color) {
this.age = age;
this.weight = weight;
this.breed = breed;
this.color = color;
}
}
这也是this的第二种常见用法,在构造方法中按照方法调用的语法调用其他重载形式的构造方法,代码更加简洁。
8.4 小结
本小节介绍了Java中方法重载的概念、特征和使用方法。方法重载指在同一个类中定义多个同名但参数列表不同的方法,参数差异可体现在数量、类型或顺序上。文章通过示例代码演示了不同类型的方法重载,包括普通方法和构造方法的重载,并指出返回值不同不能作为重载依据。此外,还讨论了自动类型转换对方法调用的影响,以及构造方法中通过this调用其他重载形式的最佳实践。最后强调应避免对不相关功能使用相同方法名进行重载。

被折叠的 条评论
为什么被折叠?



