一、方法重载:

  在同一个类中,允许存在一个及以上的同名方法,只要他们的参数列表不同(参数的个数或者参数的类型不同)即可。注意方法重载与返回值类型、访问权限修饰符、和抛出的异常无关。重载是在本类中,与继承关系无关。

(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)的更多相关文章

  1. 重载(overload),覆盖/重写(override),隐藏(hide)

    写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖/重写(override),隐藏(hide).在早期的C++书籍中,常常把重载(overload)和覆盖(override)搞错 ...

  2. 方法重载overload与方法重写overwrite

    方法重载overload: 在同一个类中,出现相同的方法名,与返回值无关,参数列表不同:1参数的个数不同 2参数类型不同 在调用方法时,java虚拟机会通过参数列表来区分不同同名的方法 方法重写ove ...

  3. 函数重载(overload)和函数重写(override)

    1. 前言: 在C++中有两个非常容易混淆的概念,分别是函数重载(overload)和函数重写(overwirte).虽然只相差一个字,但是它们两者之间的差别还是非常巨大的. 而通过深入了解这两个概念 ...

  4. C# 方法重载 overload、方法重写 override、隐藏 new

    一.重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同.这样才能通过传递不同的参数来决定到底调用哪一个. 值得注意的是,方法重载只有通过参数不同来判断调用哪个方法, ...

  5. c++中的重载(Overload)、覆盖(重写,Override) 、隐藏与using声明

    这些概念有时记住了,但可能没多久就忘了,还是记下来吧.网上找的一篇不错:这里  1 重载与覆盖 成员函数被重载的特征: (1)相同的范围(在同一个类中,不包括继承来的): (2)函数名字相同: (3) ...

  6. Java常见面试题02-方法重写和方法重载的区别?方法重载能改变返回值类型吗?

    方法重写和方法重载的区别?方法重载能改变返回值类型吗?       A:Override方法重写和Overload方法重载的区别? Overload是否可以改变返回值类型?可以 方法重写 •  子类中 ...

  7. java中的重载(overload)和重写(override)区别

    方法重载(overload): 方法重载就是在一个类中可以创建多个方法,它们具有相同的名字,但是具有不同的参数和不同定义,调用方法时通过传递给他们的不同参数个数和参数列表决定具体使用     哪   ...

  8. java 方法重载overload

    一.方法的重载 方法名一样,但参数不一样,这就是重载(overload). 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样.只要这两方面有其中的一方面不一样就可以构成方法 ...

  9. java基础—方法重载(overload)

    一.方法的重载 方法名一样,但参数不一样,这就是重载(overload). 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样.只要这两方面有其中的一方面不一样就可以构成方法 ...

  10. Java 方法重载 (Overload)

    对重载 (Overload) 的认识 为什么要用方法重载: 对于功能类似的方法来说,因为参数列表不一样,如果定义不同名称的方法,太麻烦且难以记忆. 为了解决这个问题,引入方法的重载. 重载的定义: 多 ...

随机推荐

  1. Python之路-numpy模块

    这里是首先需要安装好Anaconda Anaconda的安装参考Python之路-初识python及环境搭建并测试 配置好环境之后开始使用Jupyter Notebook 1.打开cmd,输入 jup ...

  2. 安装运行谷歌开源的TensorFlow Object Detection API视频物体识别系统

    Linux安装 参照官方文档:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/inst ...

  3. Dubbo学习源码总结系列五--集群负载均衡

            Dubbo提供了哪些负载均衡机制?如何实现的?          LoadBalance接口:可以看出,通过SPI机制默认为RandomLoadBalance,生成的适配器类执行sel ...

  4. VirtualBox中安装CentOS 7

    1.如下所示图,点击“新建”,创建一个新的虚拟机 2.类型选择Linux,版本选择Red Hat,下一步 3.分配内存大小,电脑8G内存,所以分给虚拟机2G,选择下一步 4.选择“现在创建虚拟硬盘” ...

  5. C# 获取系统环境数据

    using System; using System.Data; using System.Text.RegularExpressions; using System.Threading; names ...

  6. 三条路线告诉你如何掌握Spring IoC容器的核心原理

    原文链接:https://blog.csdn.net/bntx2jsqfehy7/article/details/78977178

  7. 【leetcode】1031. Maximum Sum of Two Non-Overlapping Subarrays

    题目如下: Given an array A of non-negative integers, return the maximum sum of elements in two non-overl ...

  8. Linux启动redis提示 /var/run/redis_6379.pid exists, process is already running or crashed

    执行启动命令:service redisd start 提示信息:/var/run/redis_6379.pid exists, process is already running or crash ...

  9. [luogu]P1463 [SDOI2005]反素数ant[dfs][数学][数论]

    [luogu]P1463 [SDOI2005]反素数ant ——!x^n+y^n=z^n 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足: ...

  10. HY 的惩罚 (Trie 树,博弈论)

    [问题描述] hy 抄题解又被老师抓住了,现在老师把他叫到了办公室. 老师要 hy 和他玩一个游 戏.如果 hy 输了,老师就要把他开除信息组; 游戏分为 k 轮.在游戏开始之前,老师会将 n 个由英 ...