Overload(重载)和Override(重写)是Java多态性的不同表现。其中重载是在一个类中的一种表现,是在一个类中定义了多个同名的方法,他们或者有不同的参数类型或者不同的参数个数。使用重载注意下面几点:
- 重载是通过不同的方法参数来区分的,例如不同的参数个数,不同的参数类型,不同的参数顺序
- 不能通过方法的访问权限,方法的返回类型,抛出的异常类型来进行重载
- 对于参数顺序,如果是int m(int x,int y)和int m(int y,int x)不叫重载,如果参数类型不同叫重载,如int m(int x,string y)和int m(string y,int x)
Override(重写)是子类覆盖父类一个方法并对其进行重写,以达到不同作用,使用Override要注意下面几点:
- 覆盖方法和被覆盖方法必须有相同的函数名字和参数
- 覆盖方法和被覆盖方法返回值相同
- 覆盖方法和被覆盖方法抛出的异常一致或者是被覆盖方法异常的子类
- 被覆盖方法访问权限不能是private,否则,子类只是定义了一个新的方法,不是覆盖
总结区别:
- Override是子类和父类之间的关系,是垂直关系,OverLoad是一个类中方法的不同关系,是水平关系
- Override是一个或者一对方法产生关系,OverLoad是多个方法之间的联系
- Override要求参数一致,OverLoad要求参数不同
- Override调用方法体是根据对象的类型来决定的,OverLoad调用方法体是根据实参和形参来选择方法体的
如果一个类中定义了多个同名的方法,他们或者有不同的参数个数或者不同的参数类型,则称为方法的重载,OverLoad可以改变返回值的类型,但是Override不可以。
为什么不能通过返回值类型来重载?
如果返回值不同,其他都相同,那么就会产生二义性,调用者无法确定调用哪个方法
子类中调用父类的方法?
super.可调用的方法名