一、概念
Java中的重写是指子类重新编写父类中对子类可视的方法逻辑,但是方法的形参和返回类型不变,方法的访问修饰符不能严于父类的,即外壳不变、核心重写。
在一个类中,只要满足方法名相同,参数个数或者类型不同,即为方法重载,它与方法的返回类型和访问修饰符没有关系。
二、条件(规则)
方法重写的规则:
1、方法的名字、参数列表和返回类型一定要和父类一样,不能被修改;
2、方法的访问修饰符不能严于父类的,但可以降低限制(比如父类的方法的访问修饰符是protected,那么子类重写的话访问修饰符只能是protected或者public);
3、子类重写的方法一定不能抛出新的检查异常或者抛出比父类更宽泛的检查异常(只能抛出父类原来的异常或者原来异常的子类异常),但是可以抛出非检查异常;
4、父类中static、final以及private修饰的方法,子类不能重写,因为它们都属于静态绑定的,在编译时虚拟机就已经确定了方法所对应的具体对象,即父类;
5、父类的构造方法子类不能重写;
6、对于父类的包访问权限的方法(default),如果子类和父类在同一个包中,则子类可以重写这些方法,如果二者不在同一个包中,则不能重写。
方法重载的规则:
1、方法名一定要相同,方法的参数个数或者参数类型一定要不同;
2、方法的返回值和访问修饰符可以不同,这并不是判断方法重载的条件;
3、方法的抛出异常可以不同;
4、重载是发生在一个类中的,不同类中不存在方法重载;
5、final修饰的方法可以重载。
三、二者的区别
1、方法重写发生于父类和子类之间,而方法重载发生在一个类中;
2、方法重写要求方法名、参数列表、返回值一定要相同,且不能抛出新的检查异常或者抛出比父类更宽泛的检查异常;而方法重载只要求方法名相同,参数个数或者类型不同,对于其他的并没有要求;
3、子类不能重写父类中final、static、private修饰的方法以及父类的构造方法;而上面所说的所有方法都可以在一个类中被重载;
4、重写是父类与子类之间多态的体现,它属于运行时的多态;而方法重载是让类以统一的方式处理不同类型数据的一种手段,多个同名函数同时存在,具有不同的参数个数/类型,通过传递的参数个数和类
型来决定调用哪一个方法,这就是多态性的一种表现,即编译时的多态;
5、运行时的多态是指在运行的时候,通过判断方法所对应的具体对象\类型,从而调用具体的方法,这就是多态性;而编译时的多态,指的是通过参数的个数或者类型就可以确定调用哪个方法,当然,它只
发生在一个类中,这就是方法重载,它也是多态的体现。
四、总结
方法重载使得Java类中的代码变得更加简洁,相同的方法名通过不同的参数个数或者类型就可以实现不同的效果;而重载则可以让子类根据自己的特殊需求重新编写属于自己的代码,这正是多态性。应用好
重载和重写将能帮助我们设计出更加清晰简洁的Java类以及更加健壮的Java代码。