浅谈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方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ...
随机推荐
- 『德不孤』Pytest框架 — 1、Pytest测试框架介绍
目录 1.什么是单元测试框架 2.单元测试框架主要做什么 3.单元测试框架和自动化测试框架有什么关系 4.Pytest测试框架说明 5.Pytest框架和Unittest框架区别 (1)Unittes ...
- 初识python: os 模块
偷下懒,直接看代码吧: #!/user/bin env python # author:Simple-Sir # time:2019/8/21 16:38 # os 模块 import os # os ...
- 初识python 之 爬虫:爬取某电影网站信息
注:此代码仅用于个人爱好学习使用,不涉及任何商业行为! 话不多说,直接上代码: 1 #!/user/bin env python 2 # author:Simple-Sir 3 # time:201 ...
- java POJO中 Integer 和 int 的不同,用int还是用Integer
https://www.jianshu.com/p/ff535284916f [int和Integer的区别] int是java提供的8种原始类型之一,java为每个原始类型提供了封装类,Intege ...
- java单元测试调用mybatis接口并执行
今天想使用单元测试类,存储一些数据到mysql,可是,一直在报错,org.springframework.beans.factory.NoSuchBeanDefinitionException: No ...
- 带你自定义实现Spring事件驱动模型
Spring 事件驱动模型概念 Spring 事件驱动模型就是观察者模式很经典的一个应用,我们可以通过Spring 事件驱动模型来完成代码的解耦. 三角色 Spring 事件驱动模型或者说观察者模式需 ...
- Java反射详解:入门+使用+原理+应用场景
反射非常强大和有用,现在市面上绝大部分框架(spring.mybatis.rocketmq等等)中都有反射的影子,反射机制在框架设计中占有举足轻重的作用. 所以,在你Java进阶的道路上,你需要掌握好 ...
- T-SQL的游标和fetch
很多时候我们sql操作会得到一个结果集合,当我们需要依次查看集合内的内容时,我们便需要游标特性了. 所以,sql的游标类似c++里容器的迭代器,下面举个例子来辅助理解: DECLARE vend_cu ...
- mac下复制文件路径
快捷键: option+command+C
- ssh 信任关系无密码登陆,清除公钥,批量脚本
实验机器: 主机a:192.168.2.128 主机b:192.168.2.130 实验目标: 手动建立a到b的信任关系,实现在主机a通过 ssh 192.168.2.130不用输入密码远程登陆b主机 ...