问题出现:

  即使对于一个经验丰富的开发人员来说,方法重载和方法覆盖的区别都能让他犹豫一下, 对于新手来说,经常容易弄混淆。

  有没有比较深入浅出的理解方式,能让人过目不忘,用起来还能有条件反射般的速度呢?

其他人是怎么做的:

  写类似比较的博客非常之多,无非也就是分开介绍,然后比较区别。

  好像也有效果,前提是要理解,完了还要不时拿来复习,保持记忆不被遗忘。

可以这样理解:

  override 更准确的翻译应该是推翻,重写。

  overload 更准确的翻译应该是过载。

  如果你不是新手,看到这个解释的时候应该有点茅塞顿开的感觉,

  因为直译之后的意思就是这两个方式的功能概括。

  所以:

  override 个人喜欢叫做方法重写;

  overload 个人喜欢叫做方法过载。

分析:

  为什么叫方法重写:

    1.父类中的方法满足不了需要,子类可以推翻父类中的方法。
    2.同样的方法名称,参数列表,返回类型,抛出的异常(或者是父类抛出的异常的子类),子类重写一个。
    3.所以方法重写要求很严格,除了方法体内部的实现和访问权限,其他的都要和父类中需要被重写的方法保持一致。
    有一点要特别注意,方法重写之后访问权限可以不同:

      可以扩大访问权限,但是不能降低访问权限。

      可以看作是对子类的兼容性和拓展性要求的折衷妥协吧。

    注意:被重写的方法访问权限不能为 private,因为 private 修饰的方法子类没有访问权限,更不要提重写。

  为什么叫方法过载:

    1.过载指的是应对不同的参数列表而产生的方法过载。
    2.所以方法过载要求方法名称必须相同,参数列表必须不同;
    3.访问权限,返回类型,抛出的异常之类的可以相同也可以不同。

      使用方法过载的目的,根据调用时的实参表与形参表,来选择对应的方法体的。

    注意:如果某一方法在父类中是访问权限是 private,那么就不能在子类对其进行重载;
    如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

练习一下:

class A {
protected int method1(int a, int b) { return 0; }
} public class B extends A{
public int method1(int a, int b) { return 0; }
// private int method1(int a, int b) { return 0; }
// private long method1(int a, int b) { return 0; }
public short method1(int a, long b) { return 0; }
private int method1(int a, long b) { return 0; }
} (参考答案预警!你不打算在心里演算一下么?)

参考答案:

class A {
protected int method1(int a, int b) { return 0; }
} public class B extends A{
public int method1(int a, int b) { return 0; } // 正确,重写父类方法,可以扩大访问权限
// private int method1(int a, int b) { return 0; } // 错误,重写父类方法,不能降低了访问权限
// private long method1(int a, int b) { return 0; } // 错误,重写父类方法,不能改变返回值类型
public short method1(int a, long b) { return 0; } // 正确,method1 方法参数过载,可以有不同的访问权限和返回值类型
private int method1(int a, long b) { return 0; }/ /正确,method1 方法参数过载,可以有不同的访问权限和返回值类型
}

小结:

override 方法重写,也叫方法覆盖;
  要求与被重写的方法:
    名称相同,
    参数列表相同,
    返回类型相同,
    抛出的异常相同(或者是父类抛出的异常的子类)。
  被重写的方法访问权限不能为 private

overload 方法过载;
  要求过载的方法:
    方法名称必须相同;
    参数列表必须不同;
    访问权限,返回类型,抛出的异常可以相同也可以不同。

传送门:https://blog.51cto.com/13508140/2339876
本文系笔者原创
转载请注明出处
—————————————

Java 中 override 和 overload 区别的更多相关文章

  1. Java 中override、overload、overwrite区别,以及与多态的关系【转】

    因为早期的翻译导致了override和overwrite的解释及理解混乱,需要重新梳理这几个词及相关内容. 转自:http://blog.csdn.net/lzhang007/article/deta ...

  2. 测者的测试技术手册:分清Java的Override和Overload

    Java的Override和OverloadOverride重写:子类对父类的允许访问的方法实现过程重新编写,但是 不可改变返回值和入参.重弄写的规则: 参数列表必须完全与被重写方法的相同: 返回类型 ...

  3. java中ArrayList 、LinkList区别

    转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...

  4. java 中 ==和equals 的区别

      Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...

  5. java中equals和==的区别 (转)

    java中equals和==的区别  值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...

  6. 【转】Java中equals和==的区别

    [转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...

  7. java中a++与++a区别

    java中a++与++a区别 a++与++a的区别,如果单独使用没有任何区别,如果在运算中就有区别了,a++是先运算在赋值,而++a是先赋值在运算!! 先看a++的代码哦 class demo1 { ...

  8. c#与java中byte字节的区别及转换方法

    原文:c#与java中byte字节的区别及转换方法 在java中  byte的范围在 [-128,127] 在C#中  byte的范围在 [0,255] 所以 java程序与C#程序 进行数据传输的时 ...

  9. java中==与equel的区别

    值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地 ...

随机推荐

  1. 关于Idea突然无法输入的诡异问题解决

    问题描述 最近加班把自己的装有Debian的笔记本带到公司,使用Idea写代码的时候,突然间无法输入,ctrl与tab还可用,重启Idea能得到一阵的解决 解决参考 如果是Linux平台,请考虑是否是 ...

  2. Binding ,抄自 http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958586.html

    1. 绑定到其它元素 <Grid> <StackPanel > <TextBox x:Name="textBox1" Height="150 ...

  3. FFT之频率与幅值的确定(转)

    FFT之后得到的是什么数 FFT之后得到的那一串复数是波形对应频率下的幅度特征,注意这个是幅度特征不是复制,下面要讲两个问题:1.如何获取频率,2.如何获取幅值 获取频率 FFT变换如何获取频率?傅里 ...

  4. iOS开发之--为UITextField监听数值变化的三种方法

    项目中有个验证码输入直接验证跳转页面,用的RAC来监听textfield的输入值,如下: @weakify(self); [self.codeView.textField.rac_textSignal ...

  5. maven 学习---Maven依赖机制

    在 Maven 依赖机制的帮助下自动下载所有必需的依赖库,并保持版本升级. 案例分析 让我们看一个案例研究,以了解它是如何工作的.假设你想使用 Log4j 作为项目的日志.这里你要做什么? 1.在传统 ...

  6. Microsoft Surface 2019新品发布会汇总

    Microsoft Surface 2019 新品发布会汇总 10月2日晚,微软举行了Microsoft Surface 2019秋季新品发布会,本次发布会涉及如下设备内容等: SurfaceLapt ...

  7. docker研究-5 docker网络介绍

    例子:启动(创建)一个容器,自定义容器名字为my_nginxtest02,镜像为nginx,将宿主机(本机)81端口映射到容器的80端口 [root@localhost ~]# docker run ...

  8. 其他综合-VMware 从模板机快速克隆多台

    VMware 从模板机快速克隆多台 1.实验描述 通过 CentOS 7.6 的模板机快速克隆,为实现搭建其他项目而提供干净的实验平台. [基于此文章的环境]点我快速打开文章 2.实验环境 使用软件的 ...

  9. mysql_innodb存储引擎的优化

    采用innodb作为存储引擎时的优化 innodb_buffer_pool_size 如果用 Innodb,那么这是一个重要变量.相对于 MyISAM 来说,Innodb对于 buffer size ...

  10. kali下ll命令无法使用

    重装了系统之后,使用ll命令竟然发现报错了. bash: ll:未找到命令   果断解决一波: vim ~/.bashrc   将alias ll=’ls -l‘前面的注释符号#删掉 运行   问题完 ...