重载和覆盖的区别

初次见到这两个单词并没有什么特别的感觉,但是时间长了,却发现书上一会儿用override,一会儿又用overload,搞得我的迷迷糊。于是就做了个总结,希望能对和我一样对这两个概念模糊不清的网友有一个帮助。
override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int, float), 但是不能为fun(int, int));
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
下面是对override和overload的测试程序,其中注释中的内容都是会产生编译错误的代码,我们将注释去掉,看看在编译时会产生什么效果。

public class OverloadTest {
// 下面几个方法用来验证可以通过定义不同的参数类型和参数的数目进行方法重载。
public void fun(){
System.out.println("method fun in OverloadTest, no parameter");
}

public void fun(float f) {
System.out.println("method fun in OverloadTest, parameter type: float");
}

public void fun(int i){
System.out.println("method fun in OverloadTest, parameter type: int");
}

public void fun(int i1, int i2) {
System.out.println("method fun in OverloadTest, parameter type: int, int");
}

// 下面的两个方法用来验证可以通过定义不同的参数顺序进行方法重载。
// 需要注意:这里的参数肯定不是相同的类型,否则的顺序的先后就毫无意义。
public void fun1(int i, float f) {
System.out.println("method fun1 in OverloadTest, sequence of parameters is: int, float");
}

public void fun1(float f, int i) {
System.out.println("method fun1 in OverloadTest, sequence of parameters is: float, int");
}

// 下面的两个方法用来验证方法抛出的异常对于重载的影响.
// 无论是异常的类型还是异常的个数都不会对重载造成任何的影响。
public void fun2() throws TestException {
System.out.println("fun2 in OverloadTest, exception: TestException");
}

public void fun2(int i) throws TestException, TestException1 {
System.out.println("fun2 in OverloadTest, exception: TestException, TestException1");
}

public void fun2(float f) throws Exception {
System.out.println("fun2 in OverloadTest, exception: Exception");
}

// 不能通过抛出的异常类型来重载fun方法。
//public void fun(int i) throws Exception {
// System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception");
//}

// 不能通过返回值重载fun方法。
//public boolean fun(int i) throws Exception {
// System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception, return: boolean");
// return true;
//}

private void fun3() { }

// 不能通过不同的访问权限进行重载
public void fun3() { }

public static void main(String[] args) {
// 这里只是定义了OverloadTest的实例,所以test不会调用
// OverloadTest1中的方法。
OverloadTest test = new OverloadTest1();
// 这里定义了OverloadTest1的实例,因为OverloadTest1是OverloadTest
// 的子类,所以test1会调用OverloadTest中的方法。
OverloadTest1 test1 = new OverloadTest1();

try {
int i = 1, j = 2, m = 3;

// 这里不会调用OverloadTest1的fun方法
// test.fun(i, m, j);
test1.fun(i, j, m);
test1.fun();
// 这个调用不会执行,因为fun3()在OverloadTest中访问权限是priavte 
//test1.fun3();
test1.fun3(i);
} catch(Exception e) { }
}
}

 

class OverloadTest1 extends OverloadTest{
// 在子类中重载fun
public void fun(int i, int m, int n) {
System.out.println("Overload fun1 in OverloadTest1, parameter type: int, int, int");
}

// 这个不是对父类中方法的重载,只是一个新的方法。
public void fun3(int i) {
System.out.println("fun2 in OverloadTest1");
}
}

// 对override测试的文件:OverrideTest.java
public class OverrideTest {
public void fun() throws TestException {
System.out.println("method fun in OverrideTest");
}

private void fun1() {
System.out.println("method fun1 in OverrideTest");
}

public static void main(String[] args) {
OverrideTest test = new OverrideTest1();
try {
test.fun();
test.fun1();
} catch(Exception e) { }
}
}

class OverrideTest1 extends OverrideTest{
// 以下正常Override
public void fun() throws TestException2 {
System.out.println("fun in OverrideTest1");
}

// 不能Override父类中的方法,因为它定义了不同的异常类型和
// 返回值。
//public int fun() throws TestException1 {
// System.out.println("method fun in Test");
// return 1;
//}

// 不能Override父类中的方法,因为它抛出了比父类中非法范围
// 更大的异常。
//public void fun() throws Exception {
// System.out.println("fun in OverrideTest1");
//}

// 这个方法并没有Override父类中的fun1方法,因为这个方法在
// 父类是private类型,所以这里只是相当于定义了一个新方法。
public void fun1() {
System.out.println("method fun1 in Test");
}
}

class TestException extends Exception{
public TestException(String msg) {
super(msg);
}
}

class TestException1 extends TestException {
public TestException1(String msg) {
super(msg);
}
}

class TestException2 extends TestException {
public TestException2(String msg) {
super(msg);
}
}

 

Edge浏览器IE模式失效?最新142版本隐藏按钮的3种解决方案 本文针对Edge浏览器142版本中IE模式按钮消失的问题,提供了3种实用解决方案,包括注册表修改、手动添加网站到IE模式列表和企业策略部署方案,帮助用户解决兼容性问题,确保老旧系统正常访问。 阅读详情

相关推荐

Android SDK安装教程(超详细),从零基础入门到精通,从这篇开始_android sdk下载安装

Android SDK安装教程(超详细),从零基础入门到精通,从这篇开始_android sdk下载安装

Jinmindong 5014

Java面向对象入门至精通

掌握面向对象的三大特征封装 、 继承 、多态 ;掌握java中的类,变量,方法,构造器,代码块,包,接口,内部类,Lambda表达式,枚举;以及toString()方法、equals方法、hashCode方法、instanceof修饰符等等;课程《Java零基础至高级应用》从基础开始进行系统教学,全套课程精细讲解,高级课程超过其他机构30%的课程量,经过我们全套课程系统学习的同学,可轻松从事Java高级工程师或系统架构师岗位,课程提供全套代码笔记其它相关素材及答疑服务,可谓是低投资高回报!

USB通讯速度翻倍秘诀:手把手教你用WinUsb替代HID协议(附Zadig驱动配置图解)

本文详细介绍了如何通过WinUsb技术替代传统HID协议,实现USB通讯速度的显著提升。从技术对比、实现原理到Zadig驱动配置图解,手把手教你完成免驱高速通讯方案,适用于数据采集、固件升级等场景,实测速度可达HID协议的2倍以上。

weixin_29168675的博客 133

JAVA中的覆盖与重载

         初次见到这两个单词并没有什么特别的感觉,但是时间长了,却发现书上一会儿用override,一会儿又用overload,搞得我的迷迷糊。于是就做了个总结,希望能对和我一样对这两个概念模糊不清的网友有一个帮助。override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声

SmallWhiteDragon's BLOG 1119

基于PaddleX的垃圾分类识别

基于PaddleX的智能垃圾分类识别项目,使用百度开源的PaddlePaddle深度学习框架,结合PaddleX开发套件,实现对垃圾分类的识别检测

Mefishes的博客 8119

IEEE GRSL投稿全流程避坑指南:从Latex模板到校样缴费,新手必看的7个关键节点

本文详细解析了IEEE GRSL投稿全流程中的7个关键节点,从LaTeX模板选择到校样缴费,帮助新手避免常见陷阱。特别针对图像格式转换、审稿意见回复、版权转移等环节提供实用技巧,确保投稿过程高效顺利。

weixin_28720573的博客 570

java中方法的重载和覆盖

java中方法的重载和覆盖 先来了解一下这两个名词的含义。 重载: 在一个类当中才可以重载,方法名相同,参数个数不同或参数个数相同而参数类型不同。 覆盖: 又称重写,在派生类(子类)中重写基类(父类)的方法,名称、参数、类型都必须相同。 java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆...

sunfeiswag的博客 475

IDEA 导入 jbolt项目(实验室非公开项目)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录准备一、准备数据库二、IDEA导入jbolt项目 准备 在实验室群文件中下载jbolt.zip和mysql.sql两个文件 将其解压到自己的目录下 一、准备数据库 打开Navicat新建一个jbolt数据库(字符集为utf8) 导入mysql.sql文件 数据库导入完毕 二、IDEA导入jbolt项目 点击打开一个项目 选择jbolt文件夹 以Maven形式打开 打开pom.xml 在里面添加jetty-server依赖

weixin_44094842的博客 973

Java基础之方法的重载和覆盖

Java基础之方法的重载和覆盖

Junefire的博客 577

Ceres&OpenCV 单目相机标定(论文复现)

Ceres&OpenCV 单目相机标定(论文复现)

dayuhaitang1的博客 370

【入门AUTOSAR网络管理测试】CANoe测试T_WakeUp时间

随着智能电动汽车行业的快速发展,目前AUTOSAR网络管理也得到了广泛应用,AUTOSAR网络管理测试也是汽车网络测试中非常重要的环节,NM问题导致的汽车ECU不能唤醒、电瓶亏电等问题,对于新入门AUTOSAR网络管理测试的同学不清楚如何开展测试,那么本章节就主要给大家介绍网络管理中T_WakeUp时间如何测试。【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读。

测试领域技术分享 2135

Java中方法的重载和覆盖

方法的重载的规则: 方法名称必须相同。 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。 方法的返回类型可以相同也可以不相同,返回类型不同不足以成为方法的重载。 仅仅参数变量名称不同是不可以的。 跟成员方法一样,构造方法也可以重载。 声明为final的方法不能被重载。 声明为static的方法不能被重载,但是能够被再次声明 方法覆盖的原则: 覆盖方法的返回类型、方法名称、参数...

ToBeMaybe_的博客 447

实战复盘:纷玩岛(Livelab)候补订单微信支付协议的逆向与复现

通过本次对纷玩岛候补支付接口的分析,我们实现了一个脱离 App UI 的轻量级支付发起器。这不仅验证了其API的设计逻辑(Standby -> PrePayInfo 分层设计),也为后续的自动化监控或辅助抢票工具提供了支付环节的技术验证。技术本无罪,关键在于如何使用。理解这些底层协议,有助于我们写出更健壮的代码,也能在遇到线上支付问题时快速定位是业务层(API)问题还是通道层(微信)问题。

猫敷雪 801

重载和覆盖有什么区别?

重载和覆盖有什么区别? 重载和覆盖都是java多态性的不同表现。其中重载是一个类中多态的一种表现,指的是一个类中定义了多个同名的方法,他们要么参数类型不一样,要么参数的各数不一样,或者不同的参数顺序,从而实现重载。 重载注意事项 重载是通过不同的方法参数来区分的。 不能方法的访问权限、返回值类型和抛出的异常类型来重载。 对于继承,如果父类的方法是私有的,就不能再子类中实现重载,如果子类也定义一个...

weixin_44292923的博客 7572

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

重载、覆盖、隐藏的区别

重载 重载是指同名函数具有不同的参数表。 在同一访问区域内声明的几个具有不同参数列表(参数的类型、个数、顺序不同)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数。 对于重载函数的调用,编译期间确定,是静态的,它们的地址在编译期间就绑定了。 重载不关心函数的返回值类型。 函数重载的特征 相同的范围(同一个类中) 函数名字相同 参数不同 virtual关键字可有可无。 实例 c...

傻月菇凉的博客 5792

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

详解Java中重载和覆盖的区别

重载(overload)和覆盖(overide)是 Java 多态性的不同表现方式。 重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型。 在使用重载时,需要注意以下几点: 1)重载是通过不同的方法参数来区分的,例如不同的参数个数、不同的参数类型或不同的参数顺序。 2)不能通过方法的访问权限、返回值类型和抛出的异常类型来进行重载。 3)对于继承来说,如果基类方法的访问权限为 privae,那么就不能在派生类对其重载;如果派生类也定义了一个同名的函数

qq_43547155的博客 7256

函数重载与函数覆盖的区别

函数重载与函数覆盖的区别? (1)函数重载。 函数重载发生在同一个类的内部。这组函数具有相同的函数名,但是参数列表不相同,在函数调用过程中根据传入的实参类型,匹配最佳的函数并调用。 (2)函数覆盖发生在子类与父类之间。父类中定义了一个虚函数,在子类中重新实现了这个函数,并且函数在子类和父类中具有相同的函数原型(函数名、参数列表),在调用函数过程中,根据对象的类型,调用相应类中的虚函数。...

lyl194458的博客 5008

重载与覆盖的区别

最近一直在刷面试题,遇到“重载与覆盖的区别”,于是记录一波。 1 重载与覆盖的区别 方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。 覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。 覆盖要求参数列表相同;重载要求参数列表不同。 覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,...

a1920135141的博客 784

方法的覆盖和重载有什么区别

重载与覆盖的区别 1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系 2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系 3、覆盖要求参数列表相同;重载要求参数列表不同 4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的 override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对

森屿旅人996的博客 7052

重载和覆盖有什么区别

重载和覆盖有什么区别

m0_65562481的博客 4258

java中覆盖和重载的区别

  1. 首先搞明白覆盖是什么?   ·        举个栗子 public class Main { public static void main(String[] args) { new Father().print(); new Son().print(); } } class Father{ public void print(){ System.ou...

zhen921的博客 2万+

继承、重载和覆盖的区别

主要介绍了继承、重载和覆盖的区别

Wpan的博客 7326

覆盖和重载的区别

“覆盖”指的是重新定义基类的方法,使得该方法在派生类中有着不同的含义。“重载”指的是赋予方法名两个定义,解析出来有不同的参数列表。重载可以存在于任何类中, 不管定义类时是否明确指定了基类。下面解释如何区分他们:“覆盖”方法定义时,派生类中给出的新方法定义拥有完全一样的参数数目及类型;另一方面,如果派生类的方法拥有不同的参数数目,或者如果某个参数类型不同于基类中的地,则派生类会拥有这两人方法。这

不笑比笑好看 1876

java覆盖和重载的区别_深入理解java中的重载和覆盖

说到java中的重载和覆盖呢,大家都很熟悉了吧,但是呢我今天就要写这个。本文主题:一.什么是重载二.什么是覆盖三.两者之间的区别重载(overload):在一个类中,如果出现了两个或者两个以上的同名函数,只要它们的参数的个数,或者参数的类型不同,即可称之为该函数重载了。即当函数同名时,只看参数列表。和返回值类型没关系。重载使用的时候需要注意:1、在使用重载时只能通过不同的参数样式。例如,不同的参数...

weixin_35524152的博客 2024

C++覆盖和重载的区别

1、覆盖 覆盖也称为重写(override)。 覆盖是存在类中,子类重写从基类继承过来的函数,函数名、返回值、参数列表都必须和基类相同。 当子类的对象调用成员函数的时候,如果成员函数有被覆盖则调用子类中覆盖的版本,否则调用从基类继承过来的函数。 如果子类覆盖的是基类的虚函数,则可以用来实现多态。当子类重新定义基类的虚函数之后,基类指针可以根据赋给它不同子类指针动态的调用子类中的虚函数,做到动态绑定,这就是多态。 2、重载 重载指允许在相同作用域中存在多个同名的函数,这些函数的参数表不同,编译器根

skydust1979的博客 1380

java覆盖和重载_Java中覆盖和重载的区别

展开全部Java中覆盖和重载的区别如下:override 可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法32313133353236313431303231363533e58685e5aeb931333339666639并且对其重写,以求达到不同的作用。最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,在继承...

weixin_30832021的博客 522
上一篇: Java动态绑定的细节
下一篇: ant 中 Property设置属性的7种方法
topinking
博客等级 码龄20年 15粉丝 242原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值