return a + b;
}
}
在上面的示例中,Adder 类有两个方法,第一个 add 方法的参数类型为 int,第二个 add 方法的参数类型为 double。
“二哥,改变参数的数目和类型都可以实现方法重载,为什么改变方法的返回值类型就不可以呢?”三妹很能抓住问题的重点嘛。
“因为仅仅改变返回值类型的话,编译器会懵逼。”我略带调皮的口吻回答她。
编译时报错优于运行时报错,所以当两个方法的名字相同,参数个数和类型也相同的时候,虽然返回值类型不同,但依然会提示方法已经被定义的错误。
02、 可以重载 main 方法吗
答案是肯定的,毕竟 main 方法也是个方法,只不过,Java 虚拟机在运行的时候只会调用带有 String 数组的那个 main 方法。
/**
- @author 微信搜「沉默王二」,回复关键字 PDF
*/
public class OverloadingMain {
public static void main(String[] args) {
System.out.println(“String[] args”);
}
public static void main(String args) {
System.out.println(“String args”);
}
public static void main() {
System.out.println(“无参”);
}
}
程序输出结果如下所示:
String[] args
03、什么隐式类型转换
由于可以通过改变参数类型的方式实现方法重载,那么当传递的参数没有找到匹配的方法时,就会发生隐式的类型转换。
如上图所示,byte 可以向上转换为 short、int、long、float 和 double,short 可以向上转换为 int、long、float 和 double,char 可以向上转换为 int、long、float 和 double,依次类推。
来看示例:
/**
- @author 微信搜「沉默王二」,回复关键字 PDF
*/
public class OverloadingTypePromotion {
void sum(int a, long b) {
System.out.println(a + b);
}
void sum(int a, int b, int c) {
System.out.println(a + b + c);
}
public static void main(String args[]) {
OverloadingTypePromotion obj = new OverloadingTypePromotion();
obj.sum(20, 20);
obj.sum(20, 20, 20);
}
}
执行 obj.sum(20, 20)
的时候,发现没有 sum(int a, int b)
的方法,所以此时第二个 20 向上转型为 long,所以调用的是 sum(int a, long b)
的方法。
再来看一个示例:
/**
- @author 微信搜「沉默王二」,回复关键字 PDF
*/
public class OverloadingTypePromotion1 {
void sum(int a, int b) {
System.out.println(“int”);
}
void sum(long a, long b) {
System.out.println(“long”);
}
public static void main(String args[]) {
OverloadingTypePromotion1 obj = new OverloadingTypePromotion1();
obj.sum(20, 20);
}
}
执行 obj.sum(20, 20)
的时候,发现有 sum(int a, int b)
的方法,所以就不会向上转型为 long,调用 sum(long a, long b)
。
程序输出结果如下所示:
int
继续来看示例:
/**
- @author 微信搜「沉默王二」,回复关键字 PDF
*/
public class OverloadingTypePromotion2 {
void sum(long a, int b) {
System.out.println(“long int”);
}
void sum(int a, long b) {
System.out.println(“int long”);
}
public static void main(String args[]) {
OverloadingTypePromotion2 obj = new OverloadingTypePromotion2();
obj.sum(20, 20);
}
}
当有两个方法 sum(long a, int b)
和 sum(int a, long b)
,参数个数相同,参数类型相同,只不过位置不同的时候,会发生什么呢?
obj.sum(20, 20)
就会不知道该调用哪一个,对吧?