前言
我们知道面向对象主要是封装、继承和多态,重写和重载都有面向对象的多态性,而一字相同,区别大不同。重写是子类继承父类中方法,属于动态多态性。重载发生在同一个类中方法名相同参数个数或类型不同,且与返回值无关,属于静态多态性。调用被重载过的方法可以大大减少代码的输入量,根据传递不同的参数就可以决定不同的功能或返回值。重写和重载会让我们在实际开发中代码结构更加清晰简洁。
一、特性区别
重载(Overloading)
(1) 重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。
(2) 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法,这是多态性表现形势。
(3) 重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
总结:简单说,就是同样的一个方法能够根据输入数据的不同,做出不同的处理,即方法的重载——有不同的参数列表(静态多态性)。
重写(Overriding)
(1)父类与子类之间的多态性,对父类的函数进行重新定义。若子类并不想原封不动地继承父类的方法,就需要重写,又称方法覆盖。
(2)若子类中存在与父类中的方法具有相同的方法名、返回类型和参数时,方法将覆盖原方法即重写。如果需要父类原方法,可使用super关键字。
(3)子类函数的访问修饰权限不能少或小于父类的权限。
当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法, 即在子类中重写该方法,是一种相同参数,不同实现的特性。(动态多态性)
二、使用规则区别
重载(Overloading)
1、必须具有不同的参数列表;
2、可以有不责骂的返回类型,只要参数列表不同就可以了;
3、可以有不同的访问修饰符;
4、可以抛出不同的异常;
重写(Overriding)
1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:
父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。