Java 中的 override 和 overload,看这一篇就够

问题出现:

即使对于一个经验丰富的开发人员来说,方法重载和方法覆盖的区别都能让他犹豫一下,
对于新手来说,经常容易弄混淆。
有没有比较深入浅出的理解方式,能让人过目不忘,用起来还能有条件反射般的速度呢?

其他人是怎么做的:

写类似比较的博客非常之多,无非也就是分开介绍,然后比较区别。
好像也有效果,前提是要理解,完了还要不时拿来复习,保持记忆不被遗忘。

可以这样理解:

override 最准确的翻译应该是推翻,重写。
overload 最准确的翻译应该是过载。
如果你不是新手,看到这个解释的时候应该有点茅塞顿开的感觉,因为直译之后的意思就是这两个方式的功能概括。
所以:
override 个人喜欢叫做方法重写;
overload 个人喜欢叫做方法过载。

分析:

为什么叫方法重写:
    父类中的方法满足不了需要,子类可以推翻父类中的方法。
    同样的方法名称,参数列表,返回类型,抛出的异常(或者是父类抛出的异常的子类),子类重写一个。
    所以方法重写要求很严格,除了方法体内部的实现和访问权限,其他的都要和父类中需要被重写的方法保持一致。
    有一点要特别注意,方法重写之后访问权限可以不同:
        可以扩大访问权限,但是不能降低访问权限。
        可以看作是对子类的兼容性和拓展性要求的折衷妥协吧。
    注意:被重写的方法访问权限不能为 private,因为 private 修饰的方法子类没有访问权限,更不要提重写。

为什么叫方法过载:
    过载指的是应对不同的参数列表而产生的方法过载。
    所以方法过载要求方法名称必须相同,参数列表必须不同;
    访问权限,返回类型,抛出的异常之类的可以相同也可以不同。
        使用方法过载的目的,根据调用时的实参表与形参表,来选择对应的方法体的。
    注意:如果某一方法在父类中是访问权限是 private,那么就不能在子类对其进行重载;
    如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

练习一下:

class A {
 protected int method1(int a, int b) { return 0; }
}

public class B extends A{
 public int method1(int a, int b) { return 0; }
 // private int method1(int a, int b) { return 0; }
 // private long method1(int a, int b) { return 0; }
 public short method1(int a, long b) { return 0; }
 private int method1(int a, long b) { return 0; }
}

(参考答案预警!你不打算在心里演算一下么?)

参考答案:

class A {
 protected int method1(int a, int b) { return 0; }
}

public class B extends A{
 public int method1(int a, int b) { return 0; } // 正确,重写父类方法,可以扩大访问权限
 // private int method1(int a, int b) { return 0; } // 错误,重写父类方法,不能降低了访问权限
 // private long method1(int a, int b) { return 0; } // 错误,重写父类方法,不能改变返回值类型
 public short method1(int a, long b) { return 0; } // 正确,method1 方法参数过载,可以有不同的访问权限和返回值类型
 private int method1(int a, long b) { return 0; }/ /正确,method1 方法参数过载,可以有不同的访问权限和返回值类型
}

小结:

override 方法重写,也叫方法覆盖;
    要求被重写的方法:
        名称相同,
        参数列表相同,
        返回类型相同,
        抛出的异常相同(或者是父类抛出的异常的子类)。
        被重写的方法访问权限不能为 private。

overload 方法过载;
    要求:
        方法名称必须相同;
        参数列表必须不同;
        访问权限,返回类型,抛出的异常可以相同也可以不同。

传送门:http://blog.51cto.com/13508140/2339876
本文系笔者原创
转载请注明出处
—————————————

原文地址:http://blog.51cto.com/13508140/2339876

时间: 2024-08-02 03:40:50

Java 中的 override 和 overload,看这一篇就够的相关文章

Java中的多线程你只要看这一篇就够了

Java中的多线程你只要看这一篇就够了 引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应"多角色"的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的"生产者,消费者模型". 很多人都对其中的一些概念不够明确,如同步.并发等等,让我

Java中的多线程=你只要看这一篇就够了

如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”. 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数据字典,以免产生误会. 多线程:指的是这个程序(一个进程)运

[转]Java中的多线程你只要看这一篇就够了

如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”. 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数据字典,以免产生误会. 多线程:指的是这个程序(一个进程)运

Java 中的多线程你只要看这一篇就够了

引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应"多角色"的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的"生产者,消费者模型". 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数据字典,以免产生误会. 多

【转】Java中的多线程你只要看这一篇就够了

转自:https://www.cnblogs.com/wxd0108/p/5479442.html 引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应"多角色"的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的"生产者,消费者模型"

中后台产品的表格设计,看这一篇就够了(原型规范下载)

中后台产品的表格设计,看这一篇就够了(原型规范下载) 2018年4月16日luodonggan 中后台产品的表格设计,看这一篇就够了(原型规范下载) 经过了将近一年的后台产品经历,踩了很多坑,试了很多错,也学习到了很多东西,目前也形成了自己的一套规范.本文将其中的部分收获汇总成文,希望能够对大家有所帮助. 后台产品有一个很重要.常见的元素,就是表格.表格承担着详情入口.数据展示的功能,看似简单,其实里面的细节特别多.在以效率为最重要的需求的后台产品中,如何设计一个能够高效率地进行查看和编辑的表格

关于 Docker 镜像的操作,看完这篇就够啦 !(下)

原文:关于 Docker 镜像的操作,看完这篇就够啦 !(下) 紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的.本文将带您一步一步,图文并重,上手操作来学习它. 目录: 一.Docker 删除镜像 1.1 通过标签删除镜像 1.2 通过 ID 删除镜像 1.3 删除镜像的限制 1.4 清理镜像 二.Docker 创建镜像 2.1 基于已有的镜像创建

用markdown写博客,看这一篇就够了,附markdown文件分享

0. 前言 为什么用markdown写博客? 在写博客的过程中,最大的"痛点"在于写作中总是被"格式"之类的困扰,无法专注于内容写作: 在线写博客,会被网络或者编辑器本身所拖累: 本文介绍的markdown写作,可以使你专注于博客内容本身,写好即成稿: 更重要的是,博客内容及相关素材保存在本地,可以几乎不用修改就可以发布在不同的平台,类似java程序的"一次编写,到处运行". 记得上次用markdown写博客,尽管我有markdown使用经验,但

iOS动画详解(学习动画看这一篇就够了)

iOS动画详解(学习动画看这一篇就够了) 一.基础知识 CAAnimation.png 二.CABasicAnimation 1. 动画的属性和解释 2.属性值的解释 repeatCount : 如果在swift中需要一直不断重复:Float.infinity,OC:HUGE_VALF timingFunction: timingFunction.png kCAMediaTimingFunctionLinear--在整个动画时间内动画都是以一个相同的速度来改变.也就是匀速运动.一个线性的计时函数