方法重载(overload)与方法重写(override)
一、方法重载:
在同一个类中,允许存在一个及以上的同名方法,只要他们的参数列表不同(参数的个数或者参数的类型不同)即可。注意方法重载与返回值类型、访问权限修饰符、和抛出的异常无关。重载是在本类中,与继承关系无关。
(1)为什么要进行方法重载?
刚刚接触java的同学,可能会对方法重载的用处有点疑惑。方法重载最经典的就是构造器了,我们知道构造器是和类名一致的,但我们要用不同的方式来实例化对象时,单一的构造器已经不能满足我们的要求,所以这时就用到了方法重载,方法重载起源于构造器。
当然除了构造器之外我们也可以在其他方法中用到方法重载,例如一个程序完成两个数相加,如果不用方法重载时,我就需要写n个方法,给n个方法起n个方法名,在调用时我不知道该调用哪一个,然后翻来翻去才找到,这很不利于别人来使用这些方法。原本这些方法完成的功能都是一致的,为了统一管理和调用方便,所以引入方法重载这一概念。
public class Test {
//方法1
public static int add(int a, int b) {
return a + b;
}
//方法2
public static double add(int a, double b) {
return a + b;
}
//方法3
public static double add(double a, int b) {
return a + b;
}
//方法4
public static int add(int a, int b, int c) {
return a + b + c;
}
//方法5
public static int add(int... a) {
int temp = 0;
for(int i = 0; i < a.length; i++) {
temp += a[i];
}
return temp;
}
public static void main(String[] args) {
}
}
如上面的代码,有因为不同数据类型的重载、有参数位置不同的重载、有参数个数不同的重载。由此看来重载还是很强大的。
(2)重载方法的调用
有了方法,我们就要想该怎样使用这些方法,当我们传实参时,编译器会调用哪个方法呢?这其中就有一个匹配度的问题,编译器会自动调用高匹配度的那个方法,例如:当我add(1,1);时会调用方法1,因为他的匹配度为100(安全匹配)。当然编译器找不到那个完全匹配的方法,会调用实参类型能够自动转化成形参类型的那个方法(兼容性匹配)。但这也就引发了问题,当我把方法1去掉,再调用add(1,1);这时会调用哪个方法?答案是编译器会报错。因为方法2与方法3的匹配度是相同的,引起了冲突。
最后方法重载支持可变参数重载,可变参数本身就相当于一个数组,在匹配中他的匹配度是最低的,当其他方法不满足时,才会调用可变参数方法。
二、方法重写:
方法的重写与方法的重载没有一点关系,硬要说有关系,那就是它们很容易被弄混。
class Person{
public void say() {
System.out.println("人说话");
}
}
public class Student extends Person{
@Override
public void say() {
System.out.println("学生说话");
}
}
(1)为什么要进行方法重写:
方法的重写发生在继承关系中,在继承中子类可以继承父类中的除了构造器、静态属性、静态方法、内部类、代码块外的所有东西。方法也不例外,但是如果父类的方法并不能满足我的需求,这时候子类就需要对父类的方法进行改造扩充,这就是方法的重写。
(2)方法重写遵循的规则:(下面的大于和小于是一种描述习惯)
1.重写的方法与被重写的方法的方法签名要一致
2.子类重写方法的访问权限必须大于等于父类方法的访问权限,例如父类方法用public修饰,那么子类方法也必须用public修饰。
3.重写与被重写的方法不能被static与final修饰
4.子类抛出的受检异常不能大于父类的受检异常(注意只针对受检异常,非受检异常没有此限制)
5.子类的方法的返回值类型可以小于等于父类的返回值类型
6.子类不能重写父类的private方法,添加@override注解会报错,因为这个方法是父类私有的子类不能访问,虽然子类继承了这个方法,但是子类只有拥有权没有使用权。如果去掉@override注解就不会再报错,所以说进行方法重写时要记得添加@override注解,让编译器帮助你做检查。
当以个方法被子类重写了,调用这个方法时,调用的时重写后的方法,但如果你就是想调用原来的方法,可以通过super关键字来实现。super关键字是一个标识,代表父类内存空间的标识。super可以用于访问父类中定义的属性,可以用于调用父类中定义的成员方法(例如toString中可以调用父类的toString然后再拼接上子类的特有的东西)、可以在子类中调用父类的构造器(后面详细说明)。
文章中有不对的地方,请批评指正!

方法重载(overload)与方法重写(override)的更多相关文章
- 重载(overload),覆盖/重写(override),隐藏(hide)
写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖/重写(override),隐藏(hide).在早期的C++书籍中,常常把重载(overload)和覆盖(override)搞错 ...
- 方法重载overload与方法重写overwrite
方法重载overload: 在同一个类中,出现相同的方法名,与返回值无关,参数列表不同:1参数的个数不同 2参数类型不同 在调用方法时,java虚拟机会通过参数列表来区分不同同名的方法 方法重写ove ...
- 函数重载(overload)和函数重写(override)
1. 前言: 在C++中有两个非常容易混淆的概念,分别是函数重载(overload)和函数重写(overwirte).虽然只相差一个字,但是它们两者之间的差别还是非常巨大的. 而通过深入了解这两个概念 ...
- C# 方法重载 overload、方法重写 override、隐藏 new
一.重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同.这样才能通过传递不同的参数来决定到底调用哪一个. 值得注意的是,方法重载只有通过参数不同来判断调用哪个方法, ...
- c++中的重载(Overload)、覆盖(重写,Override) 、隐藏与using声明
这些概念有时记住了,但可能没多久就忘了,还是记下来吧.网上找的一篇不错:这里 1 重载与覆盖 成员函数被重载的特征: (1)相同的范围(在同一个类中,不包括继承来的): (2)函数名字相同: (3) ...
- Java常见面试题02-方法重写和方法重载的区别?方法重载能改变返回值类型吗?
方法重写和方法重载的区别?方法重载能改变返回值类型吗? A:Override方法重写和Overload方法重载的区别? Overload是否可以改变返回值类型?可以 方法重写 • 子类中 ...
- java中的重载(overload)和重写(override)区别
方法重载(overload): 方法重载就是在一个类中可以创建多个方法,它们具有相同的名字,但是具有不同的参数和不同定义,调用方法时通过传递给他们的不同参数个数和参数列表决定具体使用 哪 ...
- java 方法重载overload
一.方法的重载 方法名一样,但参数不一样,这就是重载(overload). 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样.只要这两方面有其中的一方面不一样就可以构成方法 ...
- java基础—方法重载(overload)
一.方法的重载 方法名一样,但参数不一样,这就是重载(overload). 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样.只要这两方面有其中的一方面不一样就可以构成方法 ...
- Java 方法重载 (Overload)
对重载 (Overload) 的认识 为什么要用方法重载: 对于功能类似的方法来说,因为参数列表不一样,如果定义不同名称的方法,太麻烦且难以记忆. 为了解决这个问题,引入方法的重载. 重载的定义: 多 ...
随机推荐
- Python之路-变量和基本数据类型详解(变量、数据类型、)
一.注释 注释的作用: 增加程序的可读性 作为调试用 提高团队的合作效率 注释的分类 1.单行注释 以井号(#)开头,右边的所有内容当做说明 2.多行注释 以三对单引号(’’’注释内容’’’)将注释包 ...
- Intellij IDEA 插件开发秘籍
来这里找志同道合的小伙伴! 这里总结一下 Intellij IDEA 插件开发的知识,供大家参考,本篇文章包含以下内容: 开发环境搭建 Component 介绍 Extension Point And ...
- HTML5 Canvas(实战:绘制饼图2 Tooltip)
继上一篇HTML5 Canvas(实战:绘制饼图)之后,笔者研究了一下如何给饼图加鼠标停留时显示的提示框. Plot对象 在开始Coding之前,笔者能够想到的最easy的方式,就是给饼图的每一个区域 ...
- 测试tensorflowgpu版本是否可用
输入一下代码即可 import tensorflow as tf print(tf.test.is_gpu_available())
- 如何在mac上使用iMessage发送信息
在Mac上你也可以像iPhone上一样使用iMessage 来发送iMessage 与 普通的短信息. 并且你需要在iPhone上设置中的信息的信息转发中激活对电脑的支持.此时, 你的电脑也可以向你的 ...
- vue项目中数学公式的展示
在这里有个mathjax的插件,可以将dom中的数学公式展示. 第一步安装mathjax npm install mathjax 安装完之后,你会在index.html中发现,已经引用了js文件,并且 ...
- Python实例教程
转自:http://codingdict.com/article/9026 Python 100例-01 题目: 输有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数? Python 1 ...
- 选项卡jq
1.无定时器 $(function(){$('.banner-point li').on('click',function(){$(this).addClass('active').siblings( ...
- locate 定位配置文件
[root@VM_58_118_centos syhuo.net]# locate redis.conf /etc/redis.conf /etc/redis.conf_bak_20191008 /u ...
- C# WinForm 中Label自动换行 解决方法
在TableLayoutPannel中放着一些Label如果把Label的AutoSize属性设成True的话,文字超过label长度时就会自动增加,直到后面的字出窗体以外设置成False时,一旦到达 ...