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



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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号"软件求生",获取更多技术干货!

相关推荐
编程修仙5 分钟前
java的单例设计模式
java·单例模式·设计模式
南城花随雪。6 分钟前
Spring框架之模板方法模式 (Template Method Pattern)
java·开发语言·模板方法模式
架构悟道30 分钟前
不当愣头青、聊聊软件架构中的那些惯用的保命手段
java·分布式·架构·设计·高可用·可靠性·容错
蓝田~32 分钟前
Springboot -- 自定义异常,异常处理
java·spring boot·spring
Leslie_Lei35 分钟前
Hutool-Java工具库
java·hutool
斗-匕1 小时前
Spring & Spring Boot 常用注解总结
java·spring boot·spring
夏微凉.1 小时前
【JavaEE进阶】Spring 事务和事务传播机制
java·数据库·sql·mysql·spring·java-ee
吴冰_hogan1 小时前
nacos集群源码解析-cp架构
java·spring boot·spring·架构·服务发现·springcloud
阿七想学习1 小时前
数据结构《链表》
java·开发语言·数据结构·学习·链表
Yaml41 小时前
Java的六大排序
java·算法·排序算法