详解Java中方法重写和方法重载的6个区别

 更新时间:2022年01月12日 09:53:16   作者:Java-老兵  
方法重写和方法重载都是面向对象编程中,那么方法重写和方法重载有哪些区别,本文就详细的来介绍一下,感兴趣的可以了解一下

方法重写(Override)和方法重载(Overload)都是面向对象编程中,多态特性的不同体现,但二者本身并无关联,它们的区别犹如马德华之于刘德华的区别,除了名字长得像之外,其他的都不像。 

接下来咱们就来扒一下二者的具体区别。

1.方法重写

方法重写(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
        System.out.println("Son:" + name);
    }
}

1.2 使用场景

方法重写在 Java 中应用的场景有很多,其中比较经典的是 Object 类中的 equals 方法。 Object 是所有类的父类,equals 方法在 Object 类中的实现源码如下: 

image.png

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

image.png

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

1.3 注意事项

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

  • 注意事项 1:子类方法的权限控制符不能变小,也就是如果父类方法的权限控制符是 protected,那么子类的方法权限控制符只能是 protected 或 public;
  • 注意事项 2:子类方法返回的类型只能变小,也就是说如果父类方法返回的是 Number 类型,那么子类方法只能返回 Number 类型或 Number 类的子类 Long 类型,而不能返回 Number 类型的父类类型 Object;
  • 注意事项 3:子类抛出异常的类型只能变小;
  • 注意事项 4:子类方法名必须和父类方法名保持一致;
  • 注意事项 5:子类方法的参数类型和个数必须和父类保持一致。

2.方法重载

方法重载是指在同一个类中,定义了多个同名方法,但同名方法的参数类型或参数个数不同就是方法重载。

2.1 基本使用

以下 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
    }
}

2.2 使用场景

方法重载的经典使用场景是 String 类型的 valueOf 方法,valueOf 方法重载有 9 种实现,如下图所示: 

image.png

 它可以将数组、对象和基础数据类型转换成字符串类型。

2.3 注意事项

方法重载的优先匹配原则有以下 5 个:

  • 第 1 匹配原则:优先匹配相同数据类型,方法重载会优先调用和方法参数类型一模一样的方法,比如只有一个 String 类型的参数调用,会优先匹配只有一个 String 参数类型的重载方法;
  • 第 2 匹配原则:如果是基本数据类型,会自动转换成更大的基本数据类型进行匹配,比如调用的参数是 int 类型,那么会优先调用基本类型 long,而非包装类型 Integer(这点需要特殊注意,容易出错)。
  • 第 3 匹配原则:自动装箱和自动拆箱匹配,参数调用也会进行自动拆箱和自动装箱的方法匹配,比如调用参数传递的是 int 类型,那么它可以匹配到 Integer 类型的重载方法;
  • 第 4 匹配原则:会按照继承路线依次向上匹配父类,如果匹配不到当前类,会尝试匹配它的父类,或者是父类的父类,依次往上匹配;
  • 第 5 匹配原则:可变参数匹配,如果方法是可选参数方法,那么它的调用优先级是最低的,在最后阶段才会匹配可选参数方法。

方法重载会按照以上的 5 个原则依次进行匹配,符合规则的方法会被优先调用。除了以上匹配原则之外,还需要特殊注意一点,不同的返回类型不能作为方法重载的依据,也就是不同的返回值类型不算方法重载

3.方法重写 VS 方法重载

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

区别方法重写方法重载
方法关系描述的是父类和子类的方法关系描述的是同一个类中多个同名方法的方法关系
Override 关键字需要使用 @Override 关键字修饰不需要
参数类型和参数个数不能修改必须修改
返回类型只能变小或相同,不能变大可修改
抛出异常只能变小或删除,不能抛出新的或者更大的异常可修改
权限控制符只能变大,不能变小可修改

总结

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

到此这篇关于详解Java中方法重写和方法重载的6个区别的文章就介绍到这了,更多相关Java 方法重写和方法重载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot和Vue前后端分离项目架构的全过程

    Spring Boot和Vue前后端分离项目架构的全过程

    前后端分离是目前互联网开发中比较广泛使用的开发模式,主要是将前端和后端的项目业务进行分离,下面这篇文章主要给大家介绍了关于Spring Boot和Vue前后端分离项目架构的相关资料,需要的朋友可以参考下
    2022-04-04
  • Springboot使用kafka的两种方式

    Springboot使用kafka的两种方式

    在公司用kafka比较多,今天整理下Springboot使用kafka的两种方式,Kafka作为一个消息发布订阅系统,就包括消息生成者和消息消费者,文中通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • java Unicode和UTF-8之间转换实例

    java Unicode和UTF-8之间转换实例

    这篇文章主要介绍了java Unicode和UTF-8之间转换实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringMVC中参数绑定问题实例详解

    SpringMVC中参数绑定问题实例详解

    springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,下面这篇文章主要给大家介绍了关于SpringMVC中参数绑定问题的相关资料,需要的朋友可以参考下
    2022-04-04
  • spring boot整合hessian的示例

    spring boot整合hessian的示例

    本文通过实例代码给大家介绍了spring boot整合hessian的方法,需要的朋友可以参考下
    2017-07-07
  • 一篇文章带你入门Springboot整合微信登录与微信支付(附源码)

    一篇文章带你入门Springboot整合微信登录与微信支付(附源码)

    微信支付是腾讯公司的支付业务品牌,微信支付商户平台支持线下场所、公众号、小程序、PC网站、APP、企业微信等经营场景快速接入微信支付。这里一篇文章带你入门!
    2021-06-06
  • java控制台实现可视化日历小程序

    java控制台实现可视化日历小程序

    这篇文章主要为大家详细介绍了java控制台实现可视化日历小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • java使用jar包生成二维码的示例代码

    java使用jar包生成二维码的示例代码

    这篇文章主要介绍了java使用jar包生成二维码的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringBoot中配置双数据源的实现示例

    SpringBoot中配置双数据源的实现示例

    在许多应用程序中,可能会遇到需要连接多个数据库的情况,本文主要介绍了SpringBoot中配置双数据源的实现示例,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • java实现消息队列的两种方式(小结)

    java实现消息队列的两种方式(小结)

    本文主要介绍了两种java实现消息队列的方式,利用Spring消息模板发送消息和Apache ActiveMQ官方实例发送消息,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12

最新评论