重载与重写,显而易见,从书面意思也能理解,两者都是针对“方法同名”问题而言。
(一)重载(Overloading)
表现:多个同名函数同时存在,具有不同的参数个数/类型。
目的:让类以统一的方式处理不同类型数据的一种手段。
Overloading是一个类中多态性的一种表现。
了解了这之后,我们自然想到,既然这些重载的方法都同名,那么方法调用时,怎么判断用哪一个呢?
答案就是:参数列表。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 而这就是多态性。
因此就有了方法重载的必要条件:参数列表各异。至于其余的返回值类型,访问修饰符是否相同都无关紧要。
(二)重写(Override)
即覆盖,发生在父类与子类间。
当子类继承父类后,想要在父类中定义的方法的基础上,增加一些自己特有的味道,就可以对此同名方法进行覆盖重写。
那么,为了满足上面这种需求,显然,从逻辑上就需要有下面的这些规则:
- 既为覆盖,方法参数名和参数类型必然一致。(这样,对访问者来说,它们才是“同一方法”,才会被覆盖)
- 父类方法要能够被重写,显然其
① 访问修饰符不能是private(私有化的)
② 不能有final修饰符(最终的,不可变的)- 子类要重写父类的方法,必然要先能访问父类
即子类方法的访问权限(访问修饰符)必需大于或等于父类方法的- 子类方法的返回类型小于或等于父类方法的返回类型
- 子类方法抛出的异常要小于或等于父类方法抛出的异常
最后总结出来的重写原则就是常说的“两同两小一大”
方法名相同,参数列表相同
子类方法返回类型小于等于父类方法返回类型
子类方法抛出异常小于等于父类方法抛出异常
子类方法访问权限大于等于父类方法访问权限
更多关于 —— 访问修饰符,见:http://www.runoob.com/java/java-modifier-types.html#protected-desc