方法重载 overload
多个方法功能很相似,但不完全一样,可以考虑使用方法的重载。
同一个类中,方法可以重名,但是签名不可以重复。一个类中如果定义了名字相同,签名不同的方法,就叫方法的重载。
方法签名
方法签名:方法名 + 依次参数类型。
- 注意:
- 返回值不属于方法签名。
- 是依次的参数类型,参数名是没有影响的,只和参数的数据类型有关。比如
buy(String food, double weight)
与buy(String food, double price)
是同一个方法签名。 - 参数类型的排列顺序如果调换了,就不是同一个方法签名,比如
buy(String food, double weight)
与buy(double weight, String food)
是两个不同的方法签名 。
- 方法签名是一个方法在一个类中的唯一标识。
返回值不属于方法签名的原因:
因为调用方法时,只使用到方法名和参数,如果存在两个方法名和参数都类型相同,但返回值类型不同的方法,java就不知道到底是调用哪个方法。因此方法签名并不包括返回值。方法签名是 java 在调用方法时用来识别唯一方法的。
重载的方法可以调用别的重载方法,也可以调用别的不重载的方法。
public double buy(){
return buy(1); // 调用别的重载方法
}
public double buy(int count){
return buy(count,false); // 像这里补充部分缺省的参数值(false),然后调用重载的方法,是重载的重要的使用场景。
}
public double buy(int count, boolean isViIP){
xxx;
}
重载的参数匹配规则
方法调用时,传入的参数实际上并不一定要和方法定义的形参的数据类型严格相同,只需要能实现自动类型转换即可。
// 类中方法
public double buy(double count){
System.out.println("buying "+ count);
}
// 调用
a.buy(3); // int 可以自动转换为 double
重载方法的调用当然也是符合这个逻辑的,但会优先匹配参数类型与方法签名中形参类型一致的方法。
// 类中方法
public double buy(double count){
System.out.println("buying "+ count);
}
public double buy(int count){
System.out.println("buying "+ count + "!");
}
// 调用
a.buy(3); // 优先会调用 buy(int count)
// 假如用 short 调用呢?
short ab = 3;
a.buy(ab); // 优先还是会调用 buy(int count)
即自动类型转换的参数匹配,也会匹配自动类型转换(类型精度上)最近的那个类型。
byte、short、int、long、float、double
当然,是往右的最靠近,而不是往左边靠近。因为自动类型转换本来就只能往更大(/精度更高)的数据类型去自动转换。
并且,实际上虽然 java 支持这种规则,但程序员编写代码时尽量不要让这种情况出现(甚至故意这么做),因为即便 java 自己本身清楚怎么去调用,但程序员可能会被自己搞蒙掉。
带泛型类型参数的方法重载
若方法重载还涉及到形参为泛型的情况,优先级先找确定类型,按确定类型的参数类型匹配规则找,都找不到才会最后去调用形参为泛型的重载方法。
详见:泛型方法的重载问题(待更新)