在Java程序中,如果同一个类(或者父类子类之间)中如果有两个相同的方法(方法名相同、返回值相同、参数列表相同)是不行的,因为这样编译器无法将方法调用和特定的方法联系起来。但是,在一个类中,如果有多个方法具有相同的名称,而有不同的参数,这种情况是允许的,我们就称这种行为为方法的重载(overload)。
我们经常使用println来向控制台输出各种类型的数据,这些println方法就是实现了方法的重载。
在进行方法的重载时,方法的参数列表必须不同(参数个数或者参数数据类型,或者两者皆不同)。而方法的返回值可以相同,也可以不同。
我们来看一个例子。还是以上面的“Person”类,我们需要取得“Person”对象的“name(姓名)”属性,可能会有两种情况:一种是直接得到对象的“name”属性,还有一种情况是在获取的对象属性“name”的方法上输入一个参数,将这个参数当作头衔和“name”结合起来,比如:输入的头衔是“先生”,则通过方法返回的是:“XXX先生”。
我们可以为这两个需求定义两个方法,但是,为了显示这两个方法的相似点,我们更倾向于使用方法重载来完成:
public class Person{
… …
public String getName() {
return name;
}
public String getName(String title) {
return name+title;
}
… …
}
这样,如果只需要得到“Person”对象的“name”属性,调用不带参数的getName()方法就可以了;如果需要得到“Person”对象的“name”属性并且需要指明它的头衔,则可以调用带一个参数的getName()方法。
在进行方法的重载时,有四条基本原则需要遵守:
方法名相同;
参数列表必须不同;
返回值可以不同;
可以相互调用。
注意:方法的返回值不是方法的签名(signature)的一部分,所以,进行方法的重载的时候,不能将返回值类型的不同当成两个方法的区别。也就是说,在同一个类中,不能有这样的两个方法,它们的方法名相同、参数相同,只是方法的返回值类型不同。
构造器重载
在前面我们说过,构造器在某种程度上可以看成是一个特殊的方法:它没有返回值,它的方法名称必需和类的名称一致。因此,构造器也常常被称为“构造方法”。
作为Java类的组成成分之一,构造器也可以进行重载,下例中的类Person就定义了4个重载的构造器以满足不同的需要。
public class Person {
private String name;
private int age;
private String sex;
public Person() {
System.out.println("构造器Person()被调用");
name = "";
}
public Person(String theName) {
System.out.println("构造器Person(String theName)被调用");
name = theName;
}
public Person(String theName, int theAge) {
System.out.println("构造器Person(String theName,int theAge)被调用");
name = theName;
age = theAge;
}
public Person(String theName, int theAge, String theSex) {
System.out.println("构造器Person(String theName,"
+ "int theAge,String theSex)被调用");
name = theName;
age = theAge;
sex = theSex;
}
// 其他代码
// …. …
}
在这个类中,定义了四个构造器,这四个构造器中,各自的参数个数都不一样。在创建对象的时候,编译器会根据参数类型和参数个数来确定到底调用哪一个构造器。
我们来看下面这个创建“Person”对象的例子:
public class NewPerson {
public static void main(String[] args) {
Person person = new Person("Tom", 18, "male");
}
}
编译并运行上面这个程序,它将会向控制台打印出如下信息:
构造器Person(String theName,int theAge,String theSex)被调用
这说明,它的带三个参数的构造器被调用来创建Person对象了。