浅谈Java中重写与重载的区别
重载和重写是Java中两个截然不同的概念。但是却因为名字相近导致很多人经常混淆。
下面用例子展示出他们之间的区别。
在Java中,重载(overloading) 发生在本类。方法名相同,参数列表不同,与返回值无关,只和方法名、参数列表、参数的类型有关。
重写(overriding) 发生在父类子类之间,一般都是表示子类和父类之间的关系,其主要的特征是:方法名相同,参数相同,但是具体的实现不同。
重载(overloading)
package day_11_26;
/**
* @author soberw
*/
public class Overloading {
/**
* 以下方法构成重载
*/
//初始方法
public void sum() {
}
//构成重载,因为参数列表不同
public void sum(int i) {
}
//报错,因为参数列表相同
// public void sum(int a){
//
// }
//构成重载,因为参数类型不同
public void sum(String i) {
}
//报错 重载跟方法有无返回值无关系
// public int sum(int i){
//
// }
//构成重载 ,因为参数列表和长度都不同
public void sum(int i,int j){
}
//报错 重载与修饰符无关
protected void sum(int i){
}
}
调用的时候,程序会根据你传入参数的类型来判断执行哪个函数,测试如下
package day_11_30;
/**
* @author soberw
*/
public class OverloadingTest {
public static void main(String[] args) {
Overloading ol = new Overloading();
ol.sum();
ol.sum(1);
ol.sum("str");
ol.sum(1,3);
}
}
运行结果:

注意事项:
1):方法名必须相同
2):方法的参数列表一定不一样
3):访问修饰符和返回值类型可以相同也可以不同。
重写(overriding)
首先,重写必须发生在子类和父类之间。最常见的例子,比如所有类都是继承Object类的,Object类中本身就有equals,hashcode,toString方法等.在任意子类中定义了同名同参的方法就构成方法重写。
比如我定义了三个类:
Person类
package day_11_30;
/**
* @author soberw
*/
public class Person {
public String name = "人类";
public Person(){
}
public void show() {
System.out.println("我是一个人");
}
//重载
public void show(String name) {
this.name = name;
System.out.println("我是一个人,我的名字叫做" + name);
}
private void p1(int i){
}
public final void p2(){
}
}
Man类,继承Person:
package day_11_30;
/**
* @author soberw
*/
public class Man extends Person{
String name = "张三";
//报错,构造方法不能被重写
// public Person(){
//
// }
//重写
@Override
public void show() {
System.out.println("我是男人");
}
@Override
public void show(String name) {
this.name = name;
System.out.println("我是一个男人,我的名字叫做" + name);
}
//重写权限不能小于父类
// protected void show(String name) {
// this.name = name;
// System.out.println("我是一个男人,我的名字叫做" + name);
// }
//此处不算构成重写,只算定义了同名同参的方法,此方法与父类的无关系
private void p1(int i){
}
//报错 最终的(final)不能被重写
// public final void p2(){
//
// }
}
Woman类,继承Person:
package day_11_30;
/**
* @author soberw
*/
public class Woman extends Person{
String name = "李红";
//重写
@Override
public void show() {
System.out.println("我是女人");
}
}
测试:
package day_11_30;
/**
* @author soberw
*/
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.show(p.name);
p.show();
Man m = new Man();
m.show();
m.show(m.name);
Woman w = new Woman();
w.show();
w.show(w.name);
}
}
运行结果:

我们发现,如果子类中重写了父类中的方法,那么子类调用的时候是调用重写后的(如Man类),如果子类中没有重写父类中的方法,那么子类调用的时候还是调用父类中的方法(如Woman类)。
注意事项:
1):方法名、返回值类型和参数列表必须相同。
2):访问权限不能比父类中被重写的方法低。
4):子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
5):父类的构造方法不能被子类重写。
浅谈Java中重写与重载的区别的更多相关文章
- 浅谈Java中set.map.List的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 浅谈java中replace()和replaceAll()的区别
replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharS ...
- Java中重写与重载的区别
方法重载:关键字overload,方法名和方法的返回类型都相同,方法参数个数和类型不一样方法重写:也叫方法覆盖,关键字override,相对于类继承而言,重写的方法名,返回类型,参数个数,参数类型都要 ...
- 浅谈Java中的final关键字
浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 【转】浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...
- 浅谈Java中的hashcode方法(转)
原文链接:http://www.cnblogs.com/dolphin0520/p/3681042.html 浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ...
随机推荐
- ANT 通配符使用说明
通配符说明 通配符 说明 ? 匹配任意一个字符 * 匹配零个.一个.多个字符 ** 匹配零个.一个.多个目录 使用示例 URL路径 说明 /app/p?ttern 匹配 /app/pattern 和 ...
- 初识python: os 模块
偷下懒,直接看代码吧: #!/user/bin env python # author:Simple-Sir # time:2019/8/21 16:38 # os 模块 import os # os ...
- Java的jar包构建成docker镜像并运行
结构如下 把jar和Dockerfile放到一个文件,不在一个文件下会报错文件找不到 创建一个构建文件 buildimage.sh vi /home/hanby/buildimage.sh echo ...
- [ flask-migrate ] 记自己犯的一次低级错误
问题描述 从github上pull了别人的项目学习,项目用flask-migrate来迁移数据库.查看了一下,作者把数据库文件 app.db 删除了,不过migrations文件夹留着的,因此我只需要 ...
- Echart可视化学习集合
一.基本介绍:ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.ECharts最初由百度团队开源,并于2018年初捐赠给Apache ...
- HDU 2018 母牛的故事 (递归入门)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2018 思路分析: 问题分析:这道题的递推关系非常类似斐波那契数列,由题意不难得到以下函数递推式: 对于 ...
- day7 对字母数字的编排
1.函数fun()的功能:在s数组内寻找并且统计t数组在s数组中出现的次数 输入字符串:函数scanf()函数不好用,会出现很多bug,因此不使用scanf() 效果理想: 2.函数fun()功能:将 ...
- .NET Core 自定义中间件 Middleware
引言 很多看了上一章的朋友私信博主,问如何自定义,自己的中间件(Middleware),毕竟在实际的项目中,大家会有很多需求要用到中间件,比如防盗链.缓存.日志等等功能,于是博主这边就简单讲解一下框架 ...
- 使用Flightradar24's CesiumJS App追踪世界商用航线
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 每天,超过10万架商业航班在世界各地运送乘客.在任何特定时刻,您 ...
- Golang 通过创建临时结构体实现 struct 内 interface struct 的 json 反序列化
原文链接 背景 type AData struct { A string `json:"a"` } type BData struct { B string `json:" ...