什么是方法重载
方法重载其实我们在上一章中 关于构造器 已经用到了,在 People 类中同时使用了无参构造器和有参构造器,由于是都是构造器,所以它们必须有相同的名字,也就是类名。所谓方法重载,就是方法名相同而形式参数不同的多个方法。调用时,会根据不同的参数列表选择不同的方法。以下是重载的构造器和重载的方法:
public class People {
private String name;
//无参构造器
public People() {
}
//有参构造器
public People(String name) {
super();
this.name = name;
}
public void info (){
System.out.println(“the name of the people is : “ + name);
}
//方法重载
public void info (String name){
System.out.println(“the name of the people is : “ + name);
}
}
直接调用 info() 方法会打印默认的 name,如果想自己传入 name 的值,那么可以调用 info(String name) 方法。
重载方法的区分
最简单最靠谱的规则就是每一个重载方法都有不同的参数类型列表。如下:
public void test (String s){
System.out.println(“String: “ + s);
}
public void test (String s, int i){
System.out.println(“String: “ + s + “, i : “ + i);
}
其次,参数顺序的不同也可以区分两个方法,不过,不推荐这种方法,因为这会让代码变得难以维护,容易混淆。
public void test (String s, int i){
System.out.println(“String: “ + s + “, i : “ + i);
}
public void test (int i, String s){
System.out.println(“String: “ + s + “, i : “ + i);
}
以上两个方法声明了相同的参数,但是顺序不同,因此可以区分。但是,不要试图根据返回值来区分重载方法,这是行不通的,大家可以看看下面这两个方法:
public void test(){
}
public int test(){
return 0;
}
原因很简单,以上的两个方法同时出现在一个类中,编译器是会报错的。原因我们可以探讨一下,如果你在调用这个 test() 方法的时候,并不关心它的返回值,如下:
test();
那么编译器该如何区分调用的是哪一个 test() 方法呢,还能怎么办,只能报错了。
涉及基本类型的方法重载
基本类型可以从较小的类型自动提升到一个较大的类型,这种转换叫做扩展转换。重载方法中一旦涉及到这种转换,可能会造成一些混淆。
public static void test(long n) {
System.out.println(“long: “ + n);
}
public static void test(double n) {
System.out.println(“double: “ + n);
}
public static void main(String[] args) {
int n = 5;
test(n);
}
main 方法中传入的 n 是 int 类型的,控制台的运行的结果是:long: 5
所以,如果传入的数据类型(实际参数类型)小于方法中生命的形式参数类型的时候,实际数据类型就会被提升。char 类型略有不同,如果无法找到恰好接受 char 类型参数的方法,那么就会把 char 直接提升至 int 类型。
如果传入的实际参数大于重载方法,又会怎样呢,我们看看下面这段代码:
public static void test(byte n) {
System.out.println(“bype: “ + n);
}
public static void test(short n) {
System.out.println(“short: “ + n);
}
public static void main(String[] args) {
int n = 5;
//窄化转换
test((short)n);
}
一部小心把结果写出来了,不过没办法,看不得编译器报错。所以,如果传入的实际参数大于形式参数类型,那么就必须通过类型转换来执行窄化转换,不这样做的话,编译器会毫不犹豫的报错。