在Java和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
Java语言中引入重写机制,为的就是让我们在编码的时不必受限于父类。子类可以继承父类的方法以减少编码量,但是如果认为父类的某个方法不适合自身,或者这个方法效率不高,子类完全可以重新编写一个更加适合自身或效率更高的同名方法去代替它。
虽然我们已经理解了什么是方法的重写,但很多小伙伴还是不清楚在什么情况下要重写父类的方法,在此我们总结出需要进行方法重写的3种常见情况:
这种情况其实就是指父类无法定义出某个方法的实现过程,于是只能把这个方法定义成抽象方法,从而强制子类去重写这个抽象方法。这个过程虽然被称为“实现”,但它实际上就是对某个方法的重写。因为从本质上来讲,这个过程就是把父类的一个没有实现过程的空方法(即抽象方法)重新编写为一个有具体实现过程的方法。
子类如果继承了父类的某个方法,但发现这个方法并不适合自己,就需要重写这个方法。最典型的例子就是表示字符串的String类继承了Object类的equals()方法。但Object类中的equals()方法是用来比较两个对象是否为同一个对象,String类则希望自己的equals()方法能够比较两个字符串的“内容”是否相同,于是在String类当中就重写了equals()方法。有兴趣的小伙伴可以自己去查看一下这两个类当中的equals()方法源码。
第三种情况就是:由于各种历史问题的原因,导致原先父类中定义的方法存在效率偏低或算法陈旧,以及线程不安全等情况,并且我们还不能修改父类方法的源代码。在这种情况下,子类就可以用更先进的实现过程来重写父类中的方法。刚才我们看到的Father类和Child类的例子就属于这种情况。
另外,我们还必须要强调一个动力节点在线视频课程中提到的原则,那就是:子类在重写父类方法的时候,不能更改父类方法的原宗旨。比如说:父类Father中的sum()方法是用来求累加之和的,子类Child在重写父类的sum()方法的时候,就不能把sum()方法改成求阶乘的运算。这个原则适用于所有情况的方法重写,请务必牢记。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54