Java 中 override 和 overload 区别
问题出现:
即使对于一个经验丰富的开发人员来说,方法重载和方法覆盖的区别都能让他犹豫一下, 对于新手来说,经常容易弄混淆。
有没有比较深入浅出的理解方式,能让人过目不忘,用起来还能有条件反射般的速度呢?
其他人是怎么做的:
写类似比较的博客非常之多,无非也就是分开介绍,然后比较区别。
好像也有效果,前提是要理解,完了还要不时拿来复习,保持记忆不被遗忘。
可以这样理解:
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 区别的更多相关文章
- Java 中override、overload、overwrite区别,以及与多态的关系【转】
因为早期的翻译导致了override和overwrite的解释及理解混乱,需要重新梳理这几个词及相关内容. 转自:http://blog.csdn.net/lzhang007/article/deta ...
- 测者的测试技术手册:分清Java的Override和Overload
Java的Override和OverloadOverride重写:子类对父类的允许访问的方法实现过程重新编写,但是 不可改变返回值和入参.重弄写的规则: 参数列表必须完全与被重写方法的相同: 返回类型 ...
- java中ArrayList 、LinkList区别
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
- java 中 ==和equals 的区别
Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
- java中a++与++a区别
java中a++与++a区别 a++与++a的区别,如果单独使用没有任何区别,如果在运算中就有区别了,a++是先运算在赋值,而++a是先赋值在运算!! 先看a++的代码哦 class demo1 { ...
- c#与java中byte字节的区别及转换方法
原文:c#与java中byte字节的区别及转换方法 在java中 byte的范围在 [-128,127] 在C#中 byte的范围在 [0,255] 所以 java程序与C#程序 进行数据传输的时 ...
- java中==与equel的区别
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地 ...
随机推荐
- 从零到一手写基于Redis的分布式锁框架
1.分布式锁缘由 学习编程初期,我们做的诸如教务系统.成绩管理系统大多是单机架构,单机架构在处理并发的问题上一般是依赖于JDK内置的并发编程类库,如synchronize关键字.Lock类等.随着业务 ...
- Linux软件安装——软件包
Linux软件安装——软件包 摘要:本文主要学习了Linux下软件安装的相关知识. 软件包 简介 Linux下的软件包众多,且几乎都是经GPL授权.免费开源(无偿公开源代码)的.这意味着如果你具备修改 ...
- ASP.NET Core系列:日志
1. NLog 添加安装包: Install-Package NLog.Web.AspNetCore <?xml version="1.0" encoding="u ...
- jmeter对tomcat性能测试
主要对tomcat的参数做一些记录(jmeter和tomcat在同一个计算机,可能引起测试误差) 我的计算机配置 4核8线程 8G内存 案例一 tomcat JVM 1.8G堆内存,无数据库操 ...
- 解决eclipse打开文件乱码
解决办法 需要设置的几处地方为: Window->Preferences->General ->Content Type->Text->JSP 最下面设置为UTF-8 W ...
- Flutter 安装笔记
一. 安装镜像(有vpn的不用理) 1 打开终端 输入 open ~ ,回车 2 双击 .bash_profile 3 添加以下代码 后保存关闭即可(代码可能会变请直接到https://fl ...
- CTF必备技能丨Linux Pwn入门教程——利用漏洞获取libc
Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...
- maven的配置及基本操作
---恢复内容开始--- 1.官网下载maven 官方网址:http://maven.aparche.org 2.将maven解压到硬盘(最好没有中文路径)下 3.配置maven环境变量 4.配置m ...
- 【Git版本控制】Idea中设置Git忽略对某些文件的版本追踪
在Idea中有些本地文件无需与远程库同步,仅是本地使用.此时就需要将这些文件加入到Git的版本忽略中来. 设置步骤 1.搜索插件 .ignore,并安装 2.增加.gitignore文件 3.配置相应 ...
- css 最后的终章
相对定位:参考点 相对原来的位置 1.如果是一个单独的文档流盒子,及你姐设置了相对定位,和普通盒子一样 2.相对定位后,如果调整位置,会留下坑 作用:微调元素 子绝父相 提升层级 绝对定位 参考点:父 ...