携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
前言
-
刚学习Java时大家都被老师灌输了重载的特性。Java三大特性巴拉巴拉。当时还年轻不知道用心思考只知道字面的背诵。
-
初入职场后被问到重载和重写的区别是什么啊?我当时一脸懵逼啊。
狭路相逢
- 重载就是具有一样的方法名、但是参数不同。
- 重写是子类重写父类的方法
- 前者是已共存方式存在的,而后者是覆盖的方式。两者的生存之道是完全不同的,所以在实际工作中他们的用途也是完全不同的。
恩泽天下
-
还有一点是重写就是覆盖原来的方法,那么自然方法签名都是完全一样的。子类父类从字面上看就知道是两个不同的类。但是重载确实只能在同一个类中。试想一下如果你在两个世界为了争夺世界第一,你俩完全不会存在冲突。毕竟作用域不同了。
-
重载对修饰范围没有要求,重写要求重写方法的修饰范围大于被重写方法的修饰范围
隐藏
-
除此之外就是隐藏了,这个名次相信基本没人听说过吧。
-
隐藏(重定义):是指派生类的函数屏蔽了与其同名的基类函数,注意只要同名函数并且基类没有virtual修饰,不管参数列表是否相同,基类函数都会被隐藏。
| 类别 | 作用域 | 函数名 | 参数列表 | 返回值类型 | 是否有virtual修饰 |
|---|---|---|---|---|---|
| 重载 | 同一作用域 | 相同 | 不同 | 无要求 | 无要求 |
| 重写(覆盖) | 不同作用域(父类和子类) | 相同 | 相同 | 相同(协变除外) | 父类函数必须有 |
| 隐藏(重定义) | 不同作用域(父类和子类) | 相同 | 无要求 | 无要求 | 父类函数不能有 |
总结
- 范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。
- 参数区别:重写和被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。
- virtual区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有。