zoukankan      html  css  js  c++  java
  • 方法的重载与覆盖

    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.不能抛出比父类更宽的异常
    注意:静态方法没有多态,即使在继承时也无法使用子类覆盖之后的方法,只能调用引用类型的方法。
  • 相关阅读:
    不注意的小问题
    Hibernate、Spring和Struts工作原理及使用理由
    正则表达式贪婪与非贪婪模式
    Springmvc构造RESTful详细讲解
    正则表达式贪婪与非贪婪模式1
    BOJ二叉排序树的后序遍历
    qsort()应用大全
    辗转相除法求最大公约数(C语言)
    九度题目1014:排名 (结构体多级排序)
    BOJ第三题:二叉树前序遍历
  • 原文地址:https://www.cnblogs.com/LearnSB/p/11431041.html
Copyright © 2011-2022 走看看