6.5 重载
6.5.1 重载的定义
在同一个类中,可以有两个或两个以上的方法具有相同的方法名,但它们的参数列表不同。在这种情况下,该方法就被称为重载(overload)。其中参数列表不同包括以下3种情形。
参数的数量不同。
参数的类型不同。
参数的顺序不同。
必须要注意的是,仅返回值不同的方法不叫重载方法。
其实重载的方法之间并没有任何关系,只是“碰巧”名称相同罢了,既然方法名称相同,在使用相同的名称调用方法时,编译器怎么确定调用哪个方法呢?就要靠传入参数的不同确定调用哪个方法。返回值是运行时才决定的,而重载方法的调用是编译时就决定的,所以当编译器碰到只有返回值不同的两个方法时,就“糊涂”了,认为它是同一个方法,不知道调用哪个,所以就会报错。
在之前介绍一个类可以定义多个构造方法的时候,已经对构造方法进行了重载,接下来通过案例学习普通方法的重载。
6.5.2 重载方法的使用
看下面的代码,其中的重点是普通learn方法的重载。
public class Student
{
private String stuName;
private int stuAge;
private int stuSex;
private int stuGrade;
//构造方法,用户初始化对象的属性
public Student(String name,int age,int sex,int grade){
this.stuName = name;
this.stuAge = age;
this.stuSex = sex;
this.stuGrade = grade;
}
//构造方法,用户初始化对象的属性(不带年级参数,设置年级默认值为4)
public Student(String name,int age,int sex){
this.stuName = name;
this.stuAge = age;
this.stuSex = sex;
this.stuGrade = 4;
}
//构造方法,用户初始化对象的属性
//不带年龄、年级参数,设置年龄默认值为22,年级默认值为4
public Student(String name,int sex){
this.stuName = name;
this.stuAge = 22;
this.stuSex = sex;
this.stuGrade = 4;
}
//无参构造方法
public Student(){
}
//省略了Student类中的其他方法
//传入参数name、age、sex和grade的值,输出结果
public void learn(String name,int age,int sex,int grade)
{
String sexStr = (sex==1)?"男生":"女生";
System.out.println(age + "岁的大学" + grade + "年级" + sexStr + name + "正在认真听课!");
}
//传入参数name、age和sex的值,grade值取4,输出结果
public void learn(String name,int age,int sex)
{
learn(name,age,sex,4);
}
//传入参数name和sex的值,age的值取22,grade值取4,输出结果
public void learn(String name,int sex)
{
learn(name,22,sex,4);
}
//无参的听课方法,使用成员变量的值作为参数
public void learn()
{
learn(this.stuName,this.stuAge,this.stuSex,this.stuGrade);
}
}
上面的代码重载了learn方法,测试类main方法中的代码如下:
Student stu = new Student("王云",22,1,4);
stu.learn("刘静涛",21,2,3);
stu.learn("南天华",20,1);
stu.learn("雷静",2);
stu.learn();
程序运行结果如图6.14所示。
有些人可能已经注意到了,在一些重载方法的方法体内,调用了其他重载方法。这种情况在类重载方法的使用上非常普遍,有利于代码的重用和维护。