浅谈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方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ...
随机推荐
- Sentry 企业级数据安全解决方案 - Relay 运行模式
内容整理自官方开发文档 Relay 可以在几种主要模式之一下运行,如果您正在配置 Relay server 而不是使用默认设置,那么事先了解这些模式至关重要. 模式存储在配置文件中,该文件包含 rel ...
- css基础-1
css简介 一.CSS 指层叠样式表 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表现分离的问题 外部样式表可以极大提高工作效率 外部 ...
- Selenium_模拟键盘和鼠标操作(9)
模拟键盘键盘和鼠标操作主要使用到selenium的keys包,源码如下 class Keys(object): """ Set of special keys codes ...
- @RestController和@Controller的关系
@RestController注解,相当于@Controller+@ResponseBody两个注解的结合
- Centos安装rrdtool的yum源
由于centos的标准组件中是不带rrdtool的,因此我们需要添加一个dag的yum源,以安装rrdtool. 修改/etc/yum.repos.d/CentOS-Base.repo, #vi /e ...
- Git Book PDF下载
Download Git-Book
- 第10组 Beta冲刺 (2/5)(组长)
1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/14015412.html ·作业博客:https://edu.cnblogs.co ...
- 实验 2 :Mininet 实验 —— 拓扑的命令脚本
实验2: Mininet 实验--拓扑的命令脚本 一.实验目的 掌握 Mininet 的自定义拓扑生成方法:命令行创建.Python 脚本编写 二 .实验任务 通过使用命令行创建.Python 脚本编 ...
- hyperf 如何对AMQP消息进行手动消费?
转发自白狼栈:查看原文 在使用 hyperf 官方自带的 AMQP 队列时你会发现,不需要我们再额外启动进程对消息进行消费.这是因为默认情况下,使用 @Consumer 注解时,hyperf 会为我们 ...
- 金融云原生漫谈(三)|银行云原生基础设施构建:裸金属VS虚拟机
在金融行业数字化转型的驱动下,国有银行.股份制银行和各级商业银行也纷纷步入容器化的进程. 如果以容器云上生产为目标,那么整个容器云平台的设计.建设和优化对于银行来说是一个巨大的挑战.如何更好地利用 ...