重写和重载傻傻分不清?看完这篇秒懂!



Hello~大家好呀!今天咱们聊一聊Java中一个很重要的基础知识点------重写(Override)和重载(Overload)的区别!这个概念在面试中非常常见,也容易引发一些迷惑。如果有小伙伴对它们的区别还不清楚,这篇文章一定会帮助你在脑海中打下一根"钉子",让你彻底搞懂它们!

目录

  • 什么是方法重载(Overloading)
  • 什么是方法重写(Overriding)
  • 重写和重载的区别总结
  • 重写和重载的常见面试考察点

什么是方法重载(Overloading)

方法重载 指的是在同一个类中 定义多个方法 ,这些方法名称相同 ,但它们的参数列表不同(包括参数的个数或类型不同)。这样在调用时,Java编译器会根据传递的参数来选择对应的方法。

1.1 方法重载的特征

  • 相同的名称:重载的方法名必须相同。
  • 不同的参数列表:重载方法的参数数量或者类型必须不同。
  • 与返回类型无关:重载方法的返回类型可以相同,也可以不同,但仅靠返回类型不同不能实现重载。
  • 编译期决定:重载是在编译期间由编译器决定的,即在代码编译阶段就能知道应该调用哪个方法。

1.2 举个例子

来看看方法重载的一个简单例子吧:

在上面的代码中,我们在OverloadExample类中定义了三个名为add的方法:

  • 第一个方法接受两个整数;
  • 第二个方法接受三个整数;
  • 第三个方法接受两个浮点数。

尽管方法名相同,但因为它们的参数列表不同,所以编译器能够区分它们,并根据传递的参数数量和类型,自动选择适合的方法。

什么是方法重写(Overriding)

方法重写 指的是在子类中重新定义 一个父类 已经存在的方法。这个重定义的方法具有相同的方法名、相同的参数列表相同的返回类型,但实现的逻辑可以不同。方法重写是一种多态的实现方式。

2.1 方法重写的特征

  • 相同的方法名:重写的方法必须和父类的方法名称相同。
  • 相同的参数列表:重写方法的参数列表必须和父类的方法保持一致。
  • 返回类型可以不同:重写方法的返回类型可以是父类返回类型的子类(协变返回类型)。
  • 必须用@Override注解:在方法上使用@Override注解,不是强制要求,但推荐使用,可以避免一些拼写错误。
  • 运行期决定:重写是在程序运行期间才决定调用哪个方法,属于动态绑定(晚绑定)。

2.2 举个例子

接下来我们看一个方法重写的例子:

在上面的代码中,Dog和Cat类都继承了Animal类,并且重写了sound方法。

  • 在Dog类中,我们让sound方法输出"汪汪汪!"。
  • 在Cat类中,我们让sound方法输出"喵喵喵!"。

在这种情况下,如果我们在运行时创建一个Dog对象或者Cat对象,并调用它们的sound方法,就会调用子类的方法,而不是父类的sound方法。

通过这种方式,程序能够根据具体的实例对象在运行时决定调用哪一个方法,这就是多态的体现。

重写与重载的区别总结

重写和重载的常见面试考察点

4.1 为什么方法重载和返回类型无关?

在重载时,Java编译器主要根据方法名称和参数列表来识别方法。返回类型不同不会帮助编译器区分出不同的方法签名,这就是为什么我们不能仅靠返回类型的不同来进行方法重载。

4.2 为什么重写方法要加上@Override注解?

@Override注解不是强制的,但推荐使用。加上@Override注解能帮助我们捕获代码中的拼写错误。比如,假设我们写public void sound()拼写成了public void soud(), 没有@Override,编译器不会提示我们方法没有正确重写。加上@Override注解就能在编译时捕获到错误。

4.3 重载与重写可以实现多态吗?

  • 方法重载 实现的是一种编译时的多态,它更多的是让方法调用变得灵活;
  • 方法重写 则是真正的运行时多态,它允许程序根据对象的实际类型调用对应的具体实现。

4.4 方法重写时,能不能抛出比父类方法更多的异常?

不可以!在重写方法时,子类方法声明的异常必须与父类方法的异常相同或是其子类。这是为了保证在多态使用时的异常一致性。这样父类引用可以安全地调用子类方法而不需要额外的异常处理。

END

重写和重载是Java多态实现的重要部分,通过这些基础知识的理解和掌握,我们可以更加灵活地设计代码,提升代码的可扩展性和可维护性。希望通过今天的讲解,大家能够更深入地理解Java中的重写与重载概念!如果大家有什么不懂的地方,记得随时留言问我哦!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号"软件求生",获取更多技术干货!

相关推荐
ProtonBase几秒前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
乐之者v6 分钟前
leetCode43.字符串相乘
java·数据结构·算法
suweijie7683 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
公贵买其鹿4 小时前
List深拷贝后,数据还是被串改
java
LCG元7 小时前
【面试问题】JIT 是什么?和 JVM 什么关系?
面试·职场和发展
向前看-7 小时前
验证码机制
前端·后端
xlsw_7 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹8 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭8 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫9 小时前
泛型(2)
java