产品中心PRDUCTS DISPLAY

联系我们

联系人:张生

咨询热线:400-123-4657

传真:+86-123-4567

手机:13800000000

邮箱:admin@youweb.com

地址:广东省广州市天河区88号

在线咨询

行业资讯

您现在的位置是: 首页 > 新闻动态 > 行业资讯

面试突击:方法重写和方法重载有什么区别?

方法重写(Override)和方法重载(Overload)都是面向对象编程中,多态特性的不同体现,但二者本身并无关联,它们的区别犹如马德华之于刘德华的区别,除了名字长得像之外,其他的都不像。接下来我们将详细比较这两者之间的区别。覆盖方法- 覆盖方法(Override)是一种编程语言的特性,它体现了多态性,允许子类重新定义父类中已存在的方法,且子类中的方法名、参数类型和数量都必须与父类相同,这就是覆盖方法。

1.1 基本用法

方法重写的基本用法如下:

/**  * 父类中有一个 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         \nSystem.out.println("Son:" + name);     } } 

\n1.2 使用场景

\n方法覆盖在 Java 中有着广泛的应用场景,其中一个经典的例子就是 Object 类中的 equals 方法。Object 是所有类的根类,在 Object 类中的实现源码如下所示:

从上述源码可知,Object 类中的 equals 方法是用来比较两个对象的引用地址是否相同的。但对于字符串来说,它是被 final 修饰的,所以每次创建的字符串引用地址都不同,那这时比较引用地址就没意义了,所以 String 类必须重写父类 Object 中的 equals 方法,具体源码如下:

通过上述代码我们可以看出,String 中的 equals 方法,已经不是比较两个字符串的引用地址是否相同了,而是判断两个字符串的值是否相同。

1.3 注意事项

在方法重写时需要注意的事项有以下 5 个:

注意事项 1:子类方法的权限控制符不能变小,也就是如果父类方法的权限控制符是 protected,那么子类的方法权限控制符只能是 protected 或 public; 注意事项 2:子类方法返回的类型只能变小,也就是说如果父类方法返回的是 Number 类型,那么子类方法只能返回 Number 类型或 Number 类的子类 Long 类型,不可向上转型为父类类型Object; 注意事项3:子类抛出异常的类型只能缩小; 注意事项4:子类方法名必须与父类方法名相同; 注意事项5:子类方法的参数类型和数量必须与父类一致。 2. 方法的重载是指在同一个类中定义多个同名方法,这些方法具有不同的参数类型或参数个数。2.1基本用法如下,以下4个方法属于方法重载:公有类OverloadExample {     public static void method() {        // 做些事     }      public static void method(String name) {        // 做些事     }      public static void method(Integer id) {        // 做些事     }      public static void method(Integer{id,字符串名字)   // 进行一些操作

2.2 典型应用场景包括字符串类的 valueOf 方法,此方法有 9 种不同的重载实现,如下图所示:图片该方法可将数组、对象和基础数据类型转换为字符串类型。2.3 方法重载的匹配优先原则包括以下 5 个方面: 第一匹配原则:首要匹配相同数据类型,方法重载会优先调用与方法参数类型完全相同的方法。例如,如果只有一个 String 类型的参数调用,将优先匹配只有一个 String 参数类型的重载方法; 第二匹配原则:若为基本数据类型,则会自动转换为更大的基本数据类型进行匹配。例如,若调用参数是 int 类型,则会优先调用基本类型 long,而非包装类型 Integer(这点需要特别注意,易犯错误)。 第三条匹配原则:进行自动装箱和拆箱匹配时,参数调用也会进行自动拆箱和自动装箱的方法匹配。比如,如果传递的参数是 int 类型,则可以匹配到 Integer 类型的重载方法; 第四条匹配原则:按照继承路线依次向上匹配父类。如果当前类匹配不到,会尝试匹配其父类,直至匹配到父类的父类,依次向上匹配; 第五条匹配原则:对可变参数进行匹配。如果方法是可选参数方法,其调用优先级是最低的,只有在最后阶段才会匹配可选参数方法。 第三条匹配规则:自动装箱和拆箱是匹配的,参数传递也会进行自动拆箱和自动装箱的匹配,例如,如果传递的参数是 int 类型,那么可以匹配到 Integer 类型的重载方法; 第四条匹配规则:会根据继承路径逐级向上匹配父类,如果在当前类中找不到匹配项,将尝试匹配其父类,或者祖先类,依次向上匹配; 第五条匹配规则:可变参数匹配,可选参数方法的调用优先级较低,在最后阶段才会匹配可选参数方法。

方法重载会根据以上 5 条规则依次进行匹配,符合条件的方法将被优先调用。除了以上匹配原则之外,还需要特殊注意一点,不同的返回类型不能作为方法重载的依据,也就是不同的返回值类型不算方法重载,关于这一点的详细介绍可参考:https://mp.weixin.qq.com/s/4pi1OZx8So6GjHD6yxjB3Q

3.方法重写 VS 方法重载

方法重写和方法重载的具体不同,主要体现在以下 6 个方面:

区别 方法重写 方法重载 方法关系 描述的是父类和子类的方法关系 描述的是同一个类中多个同名方法的方法关系 Override 关键字 需要使用 @Override 关键字修饰 不需要 参数类型和参数个数 不能修改 必须修改 返回类型 只能变小或相同, 不可增大 ,可编辑 抛出错误 ,仅能缩小或删除,不可抛出新的或更大的错误 ,可以编辑 权限标记 只可增大,不可减小,可编辑 总结

方法覆写(Override)和方法重载(Overload)是面向对象编程中多态特性的不同体现,方法重写描述的是父类和子类的方法关系,而方法重载描述的是同一个类中多个同名方法的方法关系。除此之外方法重写和方法重载还有:Override 关键字、参数类型和参数个数、返回类型、抛出异常和权限控制符等不同点。除此之外方法重写和方法重载还有:Override 关键字、参数类型和参数个数、返回类型、抛出异常和权限控制符等不同点。

本文转载自微信公众号「Java面试真题解析」,可以通过以下二维码关注。如需转载本文,请与Java面试真题解析公众号联系。xnxnxxnnnpx

在线客服

关注我们 在线咨询 投诉建议 返回顶部