文章合集:gitee.com/mydb/interv…

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

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

1.方法重写

方法重写(Override)是一种语言特性,它是多态的具体表现,它允许子类重新定义父类中已有的方法,且子类中的方法名和参数类型及个数都必须与父类保持一致,这就是方法重写。

1.1 基本用法

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

/*** 父类中有一个 method 方法*/
class Father {public void method(String name) {System.out.println("Father:" + name);}
}
/*** 子类中重写了父类的 method 方法*/
class Son extends Father {@Overridepublic void method(String name) {// 子类中重新定义了打印的行为,不再是 Father:XXX,而是 Son:XXXSystem.out.println("Son:" + name);}
}
复制代码

1.2 使用场景

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

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

通过上述代码我们可以看出,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 种实现,如下图所示:

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

2.3 注意事项

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

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

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

3.方法重写 VS 方法重载

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

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

总结

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

Java中方法重写和方法重载的6个区别?相关推荐

  1. java关于重写正确,在Java中,以下关于方法重载和方法重写描述正确的是( )

    在Java中,以下关于方法重载和方法重写描述正确的是( ) 答:方法重写的返回值类型必须相同或相容.(或是其子类) 对乙酰氨基酚临床用途是抗炎抗风湿作用 答:错 观念艺术是哲学的反思,传统的理论可以对 ...

  2. java 重写方法 访问权限_为何Java中子类重写方法的访问权限不能低于父类中权限(内含里氏替换原则)...

    为何Java中子类重写方法的访问权限不能低于父类中权限 因为 向上转型及Java程序设计维护的原因 例: 假设一个父类A 拥有的方法public void setXXX(){}可以被其他任意对象调用这 ...

  3. java哪些类重写equals方法_Java自定义类中重写equals方法

    equals方法的要求: a.自反性:对于任何非空的x,x.equals(x)都应该返回true b.对称性:对于任何引用x和y,当且仅当x.equals(y)返回true时,y.equals(x)也 ...

  4. Java重载和重写6_深入理解Java中的重写和重载

    深入理解Java中的重写和重载 重载(Overloading)和重写(Overriding)是Java中两个比较重要的概念.但是对于新手来说也比较容易混淆.本文通过两个简单的例子说明了他们之间的区别. ...

  5. java中容易混淆的方法_java中容易混淆的区别

    本文会随时更新一些java中容易混淆的关键字或者知识点,如有偏见之处,望留言! final和static的差别: 1,final的英语意思"最后的",在java中修饰类,方法和变量 ...

  6. java 需要返回类型_在Java中,当一个方法不需要返回数据时返回类型必须是

    [问答题]在滑动轴承中什么是瓦背?其特点有哪些? [多选题]起重机采用变频调速改造后,有哪些效果? [判断题]当热继电器动作不准确时,可用弯折双金属片的方法来调整. [单选题]X62W型万能铣床进给电 ...

  7. java如何重写onestring,44 java toString 方法 重写equals 方法

    package com.wjl.zy131227; /** * 打印对象 * toString 方法 * @author Administrator * */ public class ToStrin ...

  8. Java中Set的contains()方法

    Java中Set的contains()方法 -- hashCode与equals方法的约定及重写原则 最近写项目的时候遇到了这个问题,就是我在一个ArrayList里放了一个很多个vo,每当我要在里面 ...

  9. JAVA中String的split方法

    我的个人网站: http://riun.xyz 以下源码版本:JDK1.8 简介 Java 中 String 的 split 方法可以将字符串根据指定的间隔进行切割,例如字符串 str = " ...

最新文章

  1. 国民技术芯片相关产业研发
  2. CNN网络泛化能力--Why Deep Nets Generalize?
  3. request设置请求头_收藏 Scrapy框架各组件详细设置
  4. 安卓 Handler使用方法
  5. java扑克牌抽牌_[java,2018-06-26] 扑克牌抽牌求和问题
  6. 44 FI配置-财务会计-固定资产-一般评估-指定购置和生产成本值的转移
  7. 非结构化文件转移服务器,非结构化数据存储管理方法,服务器和系统 Unstructured data storage management method, and a system server...
  8. sh文件进行qsub提交任务到远程服务器训练
  9. @ControllerAdvice + @ExceptionHandler 处理 全部Controller层异常
  10. 一个迷茫的 大学生自学Linux的开始
  11. XXL-JOB 针对未授权访问导致远程命令执行漏洞的声明
  12. 推荐系统专利:一种信息推荐方法、系统及存储介质和终端设备
  13. 网页CSS常用中英文字体收集
  14. 有计划,坚决执行——写给大三犹豫的女生
  15. 读取db服务器信息出错,尝试读取foxpro dbf并获取错误:无法初始化链接服务器的OLE DB提供程序“MSDASQL”的数据源对象“(空)”...
  16. CSDN专访左程云,算法之道
  17. android 记录血糖的折线图_画画血糖曲线图,你还可稳血糖!快试试
  18. Django 开发框架学习(一)
  19. 化学计量学(1)—基础理论与数据预处理
  20. Linux制作绿色版nginx

热门文章

  1. 报错信息:RunJar jarFile [mainClass] args...解决方案
  2. echarts图表坐标轴数据标签添加下划线
  3. Windows如何在命令行(cmd/dos)模式下使用指定应用打开某个文件
  4. 如何塑造社群荣誉感与归属感
  5. iPad 10 2022款评测
  6. 财务报表数据处理流程图
  7. 设计人士参加的论坛,自然要有格调的开场形式
  8. Bitmap算法简介
  9. Spark开发学习之使用idea开发Spark应用
  10. 我大中华微软MVP中国区人才库(转)