重载和重写的区别
二者在定义方面的区别
关于这个方面,许多博文说我比我详细,我在这里只做一个简述。
方法重载(Overloading):在一个类中,如果两个方法的方法名和相同,参数列表不同,那么这个方法就被定义为方法重载。
因此,只要在同一个类中,两个方法的方法名相同,参数列表不同即可,与其权限修饰符、返回值类型、方法无关。
方法重写/重载(0veriding):子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。
重写规则:
1. 父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。
2. 父类的返回类型必须与被子类重写的方法返回类型相同,否则不能称其为重写而是重载。
3. Java中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限。
4. 子类的权限修饰符一定不能小于父类的权限修饰符。特殊情况:子类不能重写父类中声明为private权限的方法
5. 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。
编译运行时的区别
在这里引用一句关于Bruce Eckel的话:“不要犯傻,如果它不是晚绑定,它就不是多态。”
一、 重载
重载是在编写程序时,允许多个方法同名。编译器根据方法不同的参数列表,对同名的方法做标识,对于编码器而言,他们已经是不同的方法了。他们的地址在编译时期就已经做了绑定,编译器在方法调用之前就已经知道要调用的方法,这个被称为“早绑定”,“静态绑定”。
二、 多态中的重写
与重载相比,多态是直到方法调用的那一刻,编译器才会确定具体要调用那一个方法,这个称为“晚绑定”或者“动态绑定”。
这里也有一个偷懒的方法:在写代码的时候,你能直接用肉眼看到结果的方法,那他就不是多态。