浅谈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方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ... 
随机推荐
- 分布式链路追踪自从用了SkyWalking,睡得真香!
			本篇文章介绍链路追踪的另外一种解决方案Skywalking,文章目录如下: 什么是Skywalking? 上一篇文章介绍了分布式链路追踪的一种方式:Spring Cloud Sleuth+ZipKin ... 
- CSS基础-7 盒子模型大小
			在盒子模型当中,有些元素是影响盒子大小的. 首先border就会影响盒子的大小. 其次padding也会影响盒子的大小. 例子: .one { width:100px; height:100px; b ... 
- RPC框架下实现文件上传到linux服务器
			一.前端使用element -ui 的upload组件 :data 表示额外传递的参数, :header 表示设置请求头参数,如,token等, action表示后台api接口的地址 二. conto ... 
- [ flask ] flask-restful 实现嵌套的有关系的输出字段
			问题描述: 1. 先说明数据关系:有用户,和菜谱.一个用户可以拥有多个菜谱:一对多的关系 2. resources/users.py 的输出字段: user_fields = { 'id':fiel ... 
- 怎样查看Jenkins的版本
			where to check jenkins version To identify your current version of Jenkins, you can do one of two th ... 
- php反序列化之pop链构造
			本题是某信有一次内部比赛的题目,涉及到pop链的构造问题,所以在这里与大家分享一下 题目 查看源码 逻辑是当参数fn存在且不包含string.zlib.flag这三个字符串时,进行文件包含这里的过滤是 ... 
- Bootstrap实战 - 响应式布局
			一.介绍 响应式布局就是一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本.这个概念是为解决移动互联网浏览而诞生的. 导航栏与轮播在大部分网站的头部占很高的比重,特别是导航栏,扮演着网站地图的 ... 
- 多种语言tcp编程
			再次强调,最好socket编程 c#的tcpclient等封装无法对接android的socket服务器 c#的tcpclient等封装可对接java的socket服务器 python socket服 ... 
- 流言粉碎机:JAVA使用 try catch 会严重影响性能
			目录 一.JVM 异常处理逻辑 二.关于JVM的编译优化 1. 分层编译 2. 即时编译器 1. 解释模式 2. 编译模式 3. 提前编译器:jaotc 三.关于测试的约束 执行用时统计 编译器优化的 ... 
- 不难懂-------git版本回退
			1. git log 定义:该命令显示从最近到最远的提交日志.每一次提交都有对应的 commit id 和 commit message. 如果嫌弃输出的信息杂乱无章,那么加上 --pretty= ... 
