JAVA中多态的实现机制主要通过overload和override实现。
1)方法的重载:简言之,就是指同一个类有多个同名的方法,这些方法拥有不同的参数(同名不同参)。可以认为是类中方法的多态性,也称为编译时多态。
2)方法的重写(覆盖):子类可覆盖父类的方法,已达到“个性化“的目的。(同名同参同类型)使得JAVA可以在运行时动态绑定(将一个方法的调用与一个方法的主体连接在一起),也称为运行时多态。
两者的区别:
重载(overload):是指在一个类中定义了多个同名不同参的方法。
1)重载是通过参数的不同来区别的,如参数个数、参数的类型、参数的顺序不同。
2)重载不能通过方法的访问权限(public/protected/private)、返回值类型(String/void/int)和抛出的异常来进行重载。
3)对继承来说,如果基类方法的访问权限为private(私有的),那么不能在派生类中对其重载(Ps:即不可以对private 修饰过的方法进行重载)。
若派生类也定义了一个同名的函数,这只是新的方法,不会达到重载的效果。
重写或覆盖(Override):是指派生类覆盖基类函数。
1)派生类中覆盖的方法必须与基类中的方法同名同参。
2)派生类中覆盖的方法的返回值必须与基类中的保持一致。
3)派生类中覆盖的方法所抛出的异常必须与基类保持一致。
4)不可以对基类中private修饰的方法进行覆盖(即使写了也是属于新的子类方法)
5)不可以在派生类出现与基类同名同参不同返回类型的函数,如果有,编译器错误(因为编译器无法区分同名函数是属于派生类还是基类的)。
两者的主要区别:
1)覆盖Override是父子类之间的关系(垂直关系),而重载Overload是自己的内部方法之间的关系(水平关系)。
2)覆盖Override只能由一个方法或只能由一对方法产生关系,而重载Overload是多个方法之间的关系。
3)覆盖Override调用方法体是根据对象的类型来决定,但是重载Overload是根据调用时的实参和形参表来选择方法体的。