面试合集:https://gitee.com/mydb/interview
方法重写(Override)和方法重载(Overload)都是面向对象编程中,多态特性的不同体现,但二者本身并无关联,它们的区别犹如马德华之于刘德华的区别,除了名字长得像之外,其他的都不像。
接下来咱们就来扒一下二者的具体区别。
方法重写(Override)是一种语言特性,它是多态的具体表现,它允许子类重新定义父类中已有的方法,且子类中的方法名和参数类型及个数都必须与父类保持一致,这就是方法重写。
方法重写的基本用法如下:
/** * 父类中有一个 method 方法 */ class Father { public void method(String name) { System.out.println("Father:" + name); } } /** * 子类中重写了父类的 method 方法 */ class Son extends Father { @Override public void method(String name) { // 子类中重新定义了打印的行为,不再是 Father:XXX,而是 Son:XXX System.out.println("Son:" + name); } }
方法重写在 Java 中应用的场景有很多,其中比较经典的是 Object 类中的 equals 方法。
Object 是所有类的父类,equals 方法在 Object 类中的实现源码如下:
从上述源码可以看出,Object 类中的 equals 是用来比较两个对象的引用地址是否相同的。
但对于字符串来说,它是被 final 修饰的,所以每次创建的字符串引用地址都不同,那这时比较引用地址就没意义了,所以 String 类必须重写父类 Object 中的 equals 方法,具体源码如下:
通过上述代码我们可以看出,String 中的 equals 方法,已经不是比较两个字符串的引用地址是否相同了,而是判断两个字符串的值是否相同。
在方法重写时需要注意的事项有以下 5 个:
方法重载是指在同一个类中,定义了多个同名方法,但同名方法的参数类型或参数个数不同就是方法重载。
以下 4 个 method 方法就是方法重载:
public class OverloadExample { public static void method() { // doSomething } public static void method(String name) { // doSomething } public static void method(Integer id) { // doSomething } public static void method(Integer id, String name) { // doSomething } }
方法重载的经典使用场景是 String 类型的 valueOf 方法,valueOf 方法重载有 9 种实现,如下图所示:
它可以将数组、对象和基础数据类型转换成字符串类型。
方法重载的优先匹配原则有以下 5 个:
方法重载会按照以上的 5 个原则依次进行匹配,符合规则的方法会被优先调用。除了以上匹配原则之外,还需要特殊注意一点,不同的返回类型不能作为方法重载的依据,也就是不同的返回值类型不算方法重载,关于这一点的详细介绍可参考:https://mp.weixin.qq.com/s/4pi1OZx8So6GjHD6yxjB3Q
方法重写和方法重载的具体不同,主要体现在以下 6 个方面:
区别 | 方法重写 | 方法重载 |
---|---|---|
方法关系 | 描述的是父类和子类的方法关系 | 描述的是同一个类中多个同名方法的方法关系 |
Override 关键字 | 需要使用 @Override 关键字修饰 | 不需要 |
参数类型和参数个数 | 不能修改 | 必须修改 |
返回类型 | 只能变小或相同,不能变大 | 可修改 |
抛出异常 | 只能变小或删除,不能抛出新的或者更大的异常 | 可修改 |
权限控制符 | 只能变大,不能变小 | 可修改 |
方法重写(Override)和方法重载(Overload)都是面向对象编程中,多态特性的不同体现,方法重写描述的是父类和子类的方法关系,而方法重载描述的是同一个类中多个同名方法的方法关系。除此之外方法重写和方法重载还有:Override 关键字、参数类型和参数个数、返回类型、抛出异常和权限控制符等不同点。
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java面试真题解析