方法的重载与覆盖

1.方法的重载(编译时多态)

  在一个类中,我们可以定义一系列方法,这些方法的方法名称相同,参数列表不同,这种语法称之为方法的【重载】。例如我们可以为Student类定义两个study方法;

  Class Student {

    public ststic void study(){

      System.out.println("study()");

    }

    public static void study(int n){

      System.out.println("study(int)");

    }

  }

 

  上面这段代码中,在Student类中定义了两个study方法,一个没有参数,另一个带一个字符串参数。在程序运行期间,根据不同的参数,会调用不同的方法。例如:

  public class TestStudent{

    public static void main(String[] args){

      Student stu = new Student();

      stu.study(); // 调用无参的study方法,打印study()

      stu.study(10);// 调用有参数的study方法,打印study(int)

    }

  }

 

【需要注意的是,当程序被编译时,如果出现方法的重载,Java编译器会根据不同的实参类型,来匹配一个合适的方法调用】

因此,方法的重载又被称为“编译时多态”。

【请记住,这里格外强调“编译时”的概念,因为,哪一个重载的方法会被调用,这个问题在程序的编译时就已经决定了】

 

  我们强调了,方法的重载的关键在于“方法名相同,参数表不同”。那究竟什么样式儿的参数表算是“不同”呢?以下几种情况都可以认为是参数表不同:

  1>参数个数不同,例如:void study()和void study(int a)

  2>参数类型不同,例如:void study(int a)和void study(double d)

  3>参数类型的顺序不同,例如:void study(int a, double d)和void study(double d, int a)

【特别提示:如果两个方法仅仅是形参的名称不同,这不算重载!】即,下面两个方法不能算构成重载:

  void study(int a)和void study(int b)

  此外,方法的重载对方法声明的其他部分没有要求。也就是说,对返回值类型,修饰符,抛出的异常这三个部分,方法重载并不要求它们相同或是不相同。

 

  为什么要设计重载的语法呢?如果一个类中有多个方法,为什么不让这些方法以方法名作为区分呢?

  举例而言,“System.out”是一个对象,在这个对象中,有多个重载的println方法。例如,我们之前写过这样的代码:

  int i = 10;

  System.out.println(i);

  System.out.println("Hello World");

  System.out.println();

  在上面的代码中,我们调用了三次println方法。【注意:这三次调用println方法的时候,都分别传入了不同的参数;第一次参数为Int类型,第二次参数为字符串类型,第三次参数为空】

  现在我们知道,实际上我们调用了三个不同的println方法【重载】。这三个方法都是“System.out”的对象的方法。在这个对象中还有多个重载的println方法。

  这样对于程序员来说,要打印某一个东西,不管是什么类型的参数都可以交给System.out,println方法打印,而不用考虑具体的参数类型。这就像是套用数学公式,只要把数据带入就可以了。程序员只需要记住“System.out.println”能够打印数据就可以。程序员不用担心这里面究竟定义了几个println方法,又该调用哪一个方法。

----------------------------------------------------华丽丽的分割线----------------------------------------------------

2.方法的覆盖(继承时多态)

子类中用一个特殊实现,来替换从父类中继承到的一般实现,这种语法叫做“方法覆盖”。
方法覆盖对方法声明的五个部分都有要求。具体来说,
1. 访问修饰符相同或更宽 2.返回值类型相同 3.方法名相同 4.参数表相同 5.不能抛出比父类更宽的异常
注意:静态方法没有多态,即使在继承时也无法使用子类覆盖之后的方法,只能调用引用类型的方法。
posted @ 2019-08-29 17:34  LearnSB  阅读(387)  评论(0编辑  收藏  举报