1、典型回答
方法重载(Method Overloading)和方法重写(Method Overriding)是实现多态性的两种方式
- 方法重载(Method Overloading) :指的是在同一个类中定义多个方法,它们具有相同的名称,但参数却不同(参数个数、参数类型或参数顺序不同)
- 方法重写(Method Overriding):指的是子类中对父类中已有的方法进行重新定义(方法名、参数列表和返回类型都相同)。重写方法的目的是为了改变或增加父类方法的实现
它们的区别主要体现在以下几点:
- 定义位置不同:方法重载发生在同一个类中的多个同名方法之间,而方法重写发生在父类和子类之间
- 参数要求不同:方法重载要求方法的参数列表不同(参数类型、参数个数、参数顺序至少有一个不同),方法重写要求方法的参数列表相同
- 返回值要求不同:方法重载不考虑返回值类型,只要参数列表不同即可。方法重写要求返回值类型相同或是其子类类型
- 业务功能不同:方法重载是为了提供多个相似功能的方法,可以根据参数的不同选择不同的方法进行调用。方法重写是为了子类能够覆盖父类中的方法,实现特定的功能需求。
- 静态绑定与动态绑定:方法重载是静态绑定的,即在编译时就确定了调用的方法;方法重写是动态绑定的,即在运行时根据对象的实际类型选择调用的方法
第5点需要注意一下,方法重载 不是动态绑定的,是静态绑定的,迷惑的话自己再想想
我这里简单再说明一下,可以这样想:
方法重载时,这几个方法本质上已经完全不同了,你用的时候根据参数等的改变没有什么二义性,用的是这个就不存在是另一个的可能性,所以代码在编译时就已经对应好了你要用的方法
方法重写时,用的是父类还是子类的方法是需要根据实际情况改变的,比如向上转型接收参数时,调用同一个方法可能是截然不同的效果。方法本质上并没有区别开来,从方法签名角度它俩也没有区别开来
总的来说,方法重载是在一个类中多个同名方法之间的多态性,而方法重写是在父类和子类之间的多态性。方法重载主要通过参数列表的不同来区分,方法重写则通过相同的方法签名来实现覆盖
方法重载和方法重写的示例代码如下: