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