浅谈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方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ...
随机推荐
- vue-router 两个子路由之间相互跳转时出错
patient页面跳转到apply页面后,再点击patient页面后无法跳回 解决方法:使用`${path + path1}` 来自为知笔记(Wiz)
- PyCharm - 关联mysql失败 - Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.
时区错误,MySQL默认的时区是UTC时区,比北京时间晚8个小时. 所以要修改mysql的时长 在mysql的命令模式下,输入: set global time_zone='+8:00'; 再次连接成 ...
- Solon 开发,五、切面与环绕拦截
Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...
- preg_match绕过总结
preg_match绕过总结 什么是preg_match 绕过方法 1.数组绕过 preg_match只能处理字符串,当传入的subject是数组时会返回false 2.PCRE回溯次数限制 PHP利 ...
- 今日学习——蓝桥杯 2019年 C语言 B组
1.手淦(亲身体验,,,没啥大用,最终还是代码) 2.代码(下面是我看其他博主代码答案能看的懂的....具体的可以直接去下面的网址看) https://blog.csdn.net/qq_4452491 ...
- 使用Cesium Stories来可视化时序数据
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium可以用来可视化随时间变化的数据,无论是跨越数百年的地 ...
- Cesium入门4 - 创建Cesium Viewer
Cesium入门4 - 创建Cesium Viewer Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 任何Ce ...
- QT之键盘事件
Widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QKeyEvent> #incl ...
- golang中匿名函数的应用-回调函数-闭包
package main import ( "fmt" "strconv" ) type funcType func(int, int) int // 自定义函 ...
- java-异常-原理异常对象的抛出throw
1 class Demo { 2 public static int method(int[] arr,int index) { 3 4 // System.out.println(arr[index ...