重载与重写的区别

128 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

前言

  • 刚学习Java时大家都被老师灌输了重载的特性。Java三大特性巴拉巴拉。当时还年轻不知道用心思考只知道字面的背诵。

  • 初入职场后被问到重载和重写的区别是什么啊?我当时一脸懵逼啊。

狭路相逢

  • 重载就是具有一样的方法名、但是参数不同。
  • 重写是子类重写父类的方法
  • 前者是已共存方式存在的,而后者是覆盖的方式。两者的生存之道是完全不同的,所以在实际工作中他们的用途也是完全不同的。

恩泽天下

  • 还有一点是重写就是覆盖原来的方法,那么自然方法签名都是完全一样的。子类父类从字面上看就知道是两个不同的类。但是重载确实只能在同一个类中。试想一下如果你在两个世界为了争夺世界第一,你俩完全不会存在冲突。毕竟作用域不同了。

  • 重载对修饰范围没有要求,重写要求重写方法的修饰范围大于被重写方法的修饰范围

隐藏

  • 除此之外就是隐藏了,这个名次相信基本没人听说过吧。

  • 隐藏(重定义):是指派生类的函数屏蔽了与其同名的基类函数,注意只要同名函数并且基类没有virtual修饰,不管参数列表是否相同,基类函数都会被隐藏。

类别作用域函数名参数列表返回值类型是否有virtual修饰
重载同一作用域相同不同无要求无要求
重写(覆盖)不同作用域(父类和子类)相同相同相同(协变除外)父类函数必须有
隐藏(重定义)不同作用域(父类和子类)相同无要求无要求父类函数不能有

总结

  1. 范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。
  2. 参数区别:重写和被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。
  3. virtual区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有。