Java方法重载和重写原理区别解析
作者:Dream0000 发布时间:2022-09-28 14:29:04
java中的方法重载和方法重写有很多区别。 下面给出了方法重载和方法覆盖之间的差异列表:
编号 | 方法重载 | 方法重写 |
---|---|---|
1 | 方法重载用于提高程序的可读性。 | 方法重写用于提供已经由其超类提供的方法的特定实现。 |
2 | 方法重载在类内执行。 | 方法重写发生在具有IS-A(继承)关系的两个类中。 |
3 | 在方法重载的情况下,参数必须不同。 | 在方法重写的情况下,参数必须相同。 |
4 | 方法重载是编译时多态性的例子。 | 方法重写/覆盖是运行时多态性的例子。 |
5 | 在java中,方法重载不能仅通过改变方法的返回类型来执行。方法重载中的返回类型可以相同或不同。 但是必须更改参数类型。 | 在方法重写/覆盖中返回类型必须相同或协变。 |
Java方法重载示例
class OverloadingExample {
static int add(int a, int b) {
return a + b;
}
static int add(int a, int b, int c) {
return a + b + c;
}
}
Java方法覆盖示例
class Animal {
void eat() {
System.out.println("eating...");
}
}
class Dog extends Animal {
void eat() {
System.out.println("eating bread...");
}
}
大家看看上面的代码,带着疑问接着看下面的文章会更有效果
一、方法重写(0verride)
在Java 程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。
子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样一种操作方法称为重写,也可以叫覆写或覆盖。
所以,所谓方法的重写是指子类中的方法和父类中继承的方法有完全相同的返回值类型、方法名、参数个数和参数类型。这样就可以实现对父类方法的覆盖。
如果子类将父类的方法重写了,调用的时候肯定是调用被重写过的子类的方法,但是如果要还要继续调用父类的方法我们该怎么做呢?
此时通过 super 关键字可以实现这个功能。super 关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.(参数列表)” 的形式调用即可。
当然,如果要使用 super 关键字不一定非要在方法重写后使用,也可以明确的表示某个方法是从父类中继承而来的。使用 super 只是更加明确的说,要从父类中查找,就不在子类中查找了。
重写有以下规则
(1).父方方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。
(2).父类返回的类型必须与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。
(3).Java 中规定,被子类重写的方法不能拥有比父类方法更加样额的访问权限。
编写过Java程序的人应该都知道,父类的中方法并不是在任何情况下都可以重写的,当父类中的方法访问权限修饰符为 private时,该方法只能被自己的类访问,不能被外部访问,在子类是不能被重写的。如果定义父类的方法为 public,在子类定义为private 程序运行就会出错。
(4).由于父类的访问权限修饰符限制一定要大于被子类重写的方法的访问权限修饰符,而 private 权限最小,所以如果某一个方法在父类的访问权限是 private 时,那么就不能再子类中对其进行重写。如果重写定义,也只是定义了一个新的方法,不会达到重写的效果。
(5).在继承过程中如果父类当中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常。而且抛出的异常不能多于父类中抛出的异常(可以等于父类中抛出的异常)。换句话说,重写方法一定不能抛出新的检查异常,或者比被重写方法声明更加宽泛的检查异常。
例如:父类的一个方法申明了一个检查异常 IOException ,在重写这个方法时就不能抛出 Exception,只能抛出 IOException的子类异常,可以抛出非检查异常。同样的道理,如果子类创建了一个成员变量,而该变量和父类中一个变量名称相同,称作变量重写或者属性覆盖(这个概念一般很少人研究,意义不大)。
二、方法重载(ordeloading)
概念:所谓的方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。
方法重载是让类以统一的方式处理不同类型数据的一种手段。调用方法时通过传递给它们的不同个数和参数来决定具体使用哪个方法,这就是Java中的多态。
在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法。
我们可以定义一些名称相同的方法,再通过定义不同的参数来区分方法,然后在调用时,Java 虚拟机就会根据不同的参数列表来选择合适的方法执行。也就是说,当一个重载的方法被调用时,Java 用参数类型或者个数来决定世界调用的重载方法。因此,每个重载方法的参数的类型或者个数必须不同。
虽然每个重载的方法可以有不同的返回类型,但返回类型并不足以区分所使用的是哪个方法。
当Java 调用一个重载方法时,参数与调用参数匹配的方法被执行。在使用重载要注意以下几点:
(1).在使用重载时只能通过不同的参数列表,必须具有不同的参数列表
(2).不能通过访问权限、返回类型、抛出的异常进行重载
(3).方法的异常类型和数目不会对重载造成影响。
(4).可以有不同的返回值类型,只要参数列表不同就可以
(5).可以有不同的访问修饰符
(6).可以抛出不同的异常
三、方法重写和重载的区别
来源:https://www.jianshu.com/p/71288d920df4


猜你喜欢
- 好程序员Java教程分享MyBatis Plus介绍:1.MyBatis Plus 介绍MyBatis Plus 是国内人员开发的 MyBa
- MyBatis 别名typeAliases的设置第一种:通过在配置文件中typeAlias节点设置type的方式<?xml versi
- 步骤,如图所示:1.添加异步任务业务类package top.ytheng.demo.task;import java.util.concu
- 前言:项目开发中日志是不可缺少的一部分,通过日志能够定位和分析事故原因。目前流行日志框架包含了log4j、log4j2、logback等,另
- 一、Code First 代码优先DbContext可以用于数据库优先,代码优先和模型优先的开发。DbContext主要包含一组非常易于使用
- 对于随机数,大家都知道,计算机不 可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果
- 前言工作中你可能会遇到很多这样的场景,一个接口,要从其他几个service调用查询方法,分别获取到需要的值之后再封装数据返回。还可能在微服务
- 泛型中 T 类型变量 和 ? 通配符 区别定义不同 :T 是类型变量,? 是通配符使用范围不同:? 通配符用作 参数类型、字段类型、局部变量
- 定义装饰者模式:在不改变原有对象的基础之上,动态的将功能附加到对象上,提供了继承更有弹性的替代方案,也体现了开闭原则案例需求一个人去咖啡店点
- 在文件夹中,我们经常有类似s_1.txt、s_2.txt、s_10.txt、s_11.txt这样的命名方式,我们期望的排序方式是s_1.tx
- xml中: <ImageView &nb
- 时间轴主要使用Recyclerview来实现。开发语言使用Kotlin,代码相对java少了许多也简洁许多源代码下载地址效果图:MainAc
- 先看代码public class MaxHuiWen {public static void main(String[] args) { &
- 通过ExifInterface可以将拍照时的一些属性信息写入图片文件里,其中包括经纬度信息。本文介绍一种将经纬度坐标写入JPEG图片文件的方
- java接口返回参数按照请求参数进行排序在项目实际开发中可能遇到过这种问题,接口请求参数顺序是[a,b,c],结果返回的数据是[bObjec
- 最近项目需要通过经纬度查询 具体的地址和区域名称,通过查询网络资源,发现提供的大多是得到具体的地址而对区域或城市名称的获取就不是很好把握;在
- 1. Vscode安装Visual studio code是微软发布的一个运行于 Mac OS X、Windows和 Linux 之上的,针
- 元注解是负责对其它注解进行说明的注解,自定义注解时可以使用元注解。Java 5 定义了 4 个注解,分别是 @Documented、@Tar
- 一、判断语句最常用的顺序结构只能顺序执行,并不能进行判断和选择。于是便有了下面两种分支结构if语句switch语句1. if语句一个if语句
- 下面我通过代码为大家分享下C#模拟鼠标,具体内容如下:想必有很多人在项目开发中可能遇见需要做模拟鼠标点击的小功能,很多人会在百度过后采用mo