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);

    }

}
copy

上面的代码重载了learn方法,测试类main方法中的代码如下:

Student stu = new Student("王云",22,1,4);

stu.learn("刘静涛",21,2,3);

stu.learn("南天华",20,1);

stu.learn("雷静",2);

stu.learn();
copy

  程序运行结果如图6.14所示。

图6.14 重载方法使用

  有些人可能已经注意到了,在一些重载方法的方法体内,调用了其他重载方法。这种情况在类重载方法的使用上非常普遍,有利于代码的重用和维护。