6.5 重载

6.5.1 重载的定义

  在同一个类中,可以有两个或两个以上的方法具有相同的方法名,但它们的参数列表不同。在这种情况下,该方法就被称为重载(overload)。其中参数列表不同包括以下3种情形。

  • 参数的数量不同。

  • 参数的类型不同。

  • 参数的顺序不同。

  必须要注意的是,仅返回值不同的方法不叫重载方法。

  其实重载的方法之间并没有任何关系,只是“碰巧”名称相同罢了,既然方法名称相同,在使用相同的名称调用方法时,编译器怎么确定调用哪个方法呢?就要靠传入参数的不同确定调用哪个方法。返回值是运行时才决定的,而重载方法的调用是编译时就决定的,所以当编译器碰到只有返回值不同的两个方法时,就“糊涂”了,认为它是同一个方法,不知道调用哪个,所以就会报错。

  在之前介绍一个类可以定义多个构造方法的时候,已经对构造方法进行了重载,接下来通过案例学习普通方法的重载。

6.5.2 重载方法的使用

  看下面的代码,其中的重点是普通learn方法的重载。

  1. public class Student
  2. {
  3. private String stuName;
  4. private int stuAge;
  5. private int stuSex;
  6. private int stuGrade;
  7. //构造方法,用户初始化对象的属性
  8. public Student(String name,int age,int sex,int grade){
  9. this.stuName = name;
  10. this.stuAge = age;
  11. this.stuSex = sex;
  12. this.stuGrade = grade;
  13. }
  14. //构造方法,用户初始化对象的属性(不带年级参数,设置年级默认值为4)
  15. public Student(String name,int age,int sex){
  16. this.stuName = name;
  17. this.stuAge = age;
  18. this.stuSex = sex;
  19. this.stuGrade = 4;
  20. }
  21. //构造方法,用户初始化对象的属性
  22. //不带年龄、年级参数,设置年龄默认值为22,年级默认值为4
  23. public Student(String name,int sex){
  24. this.stuName = name;
  25. this.stuAge = 22;
  26. this.stuSex = sex;
  27. this.stuGrade = 4;
  28. }
  29. //无参构造方法
  30. public Student(){
  31. }
  32. //省略了Student类中的其他方法
  33. //传入参数name、age、sex和grade的值,输出结果
  34. public void learn(String name,int age,int sex,int grade)
  35. {
  36. String sexStr = (sex==1)?"男生":"女生";
  37. System.out.println(age + "岁的大学" + grade + "年级" + sexStr + name + "正在认真听课!");
  38. }
  39. //传入参数name、age和sex的值,grade值取4,输出结果
  40. public void learn(String name,int age,int sex)
  41. {
  42. learn(name,age,sex,4);
  43. }
  44. //传入参数name和sex的值,age的值取22,grade值取4,输出结果
  45. public void learn(String name,int sex)
  46. {
  47. learn(name,22,sex,4);
  48. }
  49. //无参的听课方法,使用成员变量的值作为参数
  50. public void learn()
  51. {
  52. learn(this.stuName,this.stuAge,this.stuSex,this.stuGrade);
  53. }
  54. }

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

  1. Student stu = new Student("王云",22,1,4);
  2. stu.learn("刘静涛",21,2,3);
  3. stu.learn("南天华",20,1);
  4. stu.learn("雷静",2);
  5. stu.learn();

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

6.5 重载 - 图1
图6.14 重载方法使用

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