Java中方法重写和方法重载的6个区别?
文章合集: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个区别?相关推荐
- java关于重写正确,在Java中,以下关于方法重载和方法重写描述正确的是( )
在Java中,以下关于方法重载和方法重写描述正确的是( ) 答:方法重写的返回值类型必须相同或相容.(或是其子类) 对乙酰氨基酚临床用途是抗炎抗风湿作用 答:错 观念艺术是哲学的反思,传统的理论可以对 ...
- java 重写方法 访问权限_为何Java中子类重写方法的访问权限不能低于父类中权限(内含里氏替换原则)...
为何Java中子类重写方法的访问权限不能低于父类中权限 因为 向上转型及Java程序设计维护的原因 例: 假设一个父类A 拥有的方法public void setXXX(){}可以被其他任意对象调用这 ...
- java哪些类重写equals方法_Java自定义类中重写equals方法
equals方法的要求: a.自反性:对于任何非空的x,x.equals(x)都应该返回true b.对称性:对于任何引用x和y,当且仅当x.equals(y)返回true时,y.equals(x)也 ...
- Java重载和重写6_深入理解Java中的重写和重载
深入理解Java中的重写和重载 重载(Overloading)和重写(Overriding)是Java中两个比较重要的概念.但是对于新手来说也比较容易混淆.本文通过两个简单的例子说明了他们之间的区别. ...
- java中容易混淆的方法_java中容易混淆的区别
本文会随时更新一些java中容易混淆的关键字或者知识点,如有偏见之处,望留言! final和static的差别: 1,final的英语意思"最后的",在java中修饰类,方法和变量 ...
- java 需要返回类型_在Java中,当一个方法不需要返回数据时返回类型必须是
[问答题]在滑动轴承中什么是瓦背?其特点有哪些? [多选题]起重机采用变频调速改造后,有哪些效果? [判断题]当热继电器动作不准确时,可用弯折双金属片的方法来调整. [单选题]X62W型万能铣床进给电 ...
- java如何重写onestring,44 java toString 方法 重写equals 方法
package com.wjl.zy131227; /** * 打印对象 * toString 方法 * @author Administrator * */ public class ToStrin ...
- Java中Set的contains()方法
Java中Set的contains()方法 -- hashCode与equals方法的约定及重写原则 最近写项目的时候遇到了这个问题,就是我在一个ArrayList里放了一个很多个vo,每当我要在里面 ...
- JAVA中String的split方法
我的个人网站: http://riun.xyz 以下源码版本:JDK1.8 简介 Java 中 String 的 split 方法可以将字符串根据指定的间隔进行切割,例如字符串 str = " ...
最新文章
- 国民技术芯片相关产业研发
- CNN网络泛化能力--Why Deep Nets Generalize?
- request设置请求头_收藏 Scrapy框架各组件详细设置
- 安卓 Handler使用方法
- java扑克牌抽牌_[java,2018-06-26] 扑克牌抽牌求和问题
- 44 FI配置-财务会计-固定资产-一般评估-指定购置和生产成本值的转移
- 非结构化文件转移服务器,非结构化数据存储管理方法,服务器和系统 Unstructured data storage management method, and a system server...
- sh文件进行qsub提交任务到远程服务器训练
- @ControllerAdvice + @ExceptionHandler 处理 全部Controller层异常
- 一个迷茫的 大学生自学Linux的开始
- XXL-JOB 针对未授权访问导致远程命令执行漏洞的声明
- 推荐系统专利:一种信息推荐方法、系统及存储介质和终端设备
- 网页CSS常用中英文字体收集
- 有计划,坚决执行——写给大三犹豫的女生
- 读取db服务器信息出错,尝试读取foxpro dbf并获取错误:无法初始化链接服务器的OLE DB提供程序“MSDASQL”的数据源对象“(空)”...
- CSDN专访左程云,算法之道
- android 记录血糖的折线图_画画血糖曲线图,你还可稳血糖!快试试
- Django 开发框架学习(一)
- 化学计量学(1)—基础理论与数据预处理
- Linux制作绿色版nginx