Java重载和重写6_深入理解Java中的重写和重载
深入理解Java中的重写和重载
重载(Overloading)和重写(Overriding)是Java中两个比较重要的概念。但是对于新手来说也比较容易混淆。本文通过两个简单的例子说明了他们之间的区别。
定义
重载
简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
重写
重写指的是在Java的子类与父类中有两个名称、参数列表都相同的方法的情况。由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。
重载 VS 重写
关于重载和重写,你应该知道以下几点:
1、重载是一个编译期概念、重写是一个运行期间概念。
2、重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法。
3、重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法
4、因为在编译期已经确定调用哪个方法,所以重载并不是多态。而重写是多态。重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。(注:严格来说,重载是编译时多态,即静态多态。但是,Java中提到的多态,在不特别说明的情况下都指动态多态)
重写的例子
下面是一个重写的例子,看完代码之后不妨猜测一下输出结果:
class Dog{
public void bark(){
System.out.println("woof ");
}
}
class Hound extends Dog{
public void sniff(){
System.out.println("sniff ");
}
public void bark(){
System.out.println("bowl");
}
}
public class OverridingTest{
public static void main(String [] args){
Dog dog = new Hound();
dog.bark();
}
}
输出结果:
bowl
上面的例子中,dog对象被定义为Dog类型。在编译期,编译器会检查Dog类中是否有可访问的bark()方法,只要其中包含bark()方法,那么就可以编译通过。在运行期,Hound对象被new出来,并赋值给dog变量,这时,JVM是明确的知道dog变量指向的其实是Hound对象的引用。所以,当dog调用bark()方法的时候,就会调用Hound类中定义的bark()方法。这就是所谓的动态多态性。
重写的条件
参数列表必须完全与被重写方法的相同;
返回类型必须完全与被重写方法的返回类型相同;
访问级别的限制性一定不能比被重写方法的强;
访问级别的限制性可以比被重写方法的弱;
重写方法一定不能抛出新的检查异常或比被重写的方法声明的检查异常更广泛的检查异常
重写的方法能够抛出更少或更有限的异常(也就是说,被重写的方法声明了异常,但重写的方法可以什么也不声明)
不能重写被标示为final的方法;
如果不能继承一个方法,则不能重写这个方法。
重载的例子
class Dog{
public void bark(){
System.out.println("woof ");
}
//overloading method
public void bark(int num){
for(int i=0; i
System.out.println("woof ");
}
}
上面的代码中,定义了两个bark方法,一个是没有参数的bark方法,另外一个是包含一个int类型参数的bark方法。在编译期,编译期可以根据方法签名(方法名和参数情况)情况确定哪个方法被调用。
重载的条件
被重载的方法必须改变参数列表;
被重载的方法可以改变返回类型;
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异常;
方法能够在同一个类中或者在一个子类中被重载。
Java重载和重写6_深入理解Java中的重写和重载相关推荐
- java是什么软件?如何理解Java?
大家在学习Java的时候,听到大家说Java是什么软件?今天老夫就告诉大家,java它其实不是软件,这里给各位初学者们详细解释一下.接下来详细的介绍下. java是什么软件?如何理解Java? 通俗的 ...
- java提高篇(三)-----理解java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- 夯实Java基础系列23:深入理解Java继承、封装、多态的底层实现原理
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- [转载] 夯实Java基础系列8:深入理解Java内部类及其实现原理
参考链接: Java内部类 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tut ...
- 夯实Java基础系列18:深入理解Java内部类及其实现原理
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- java抽象类的属性_深入理解Java抽象类
基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...
- 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)
深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...
- 无责任书评:每个Java程序员都应该深入理解Java虚拟机!
Java这门语言的发展是很有意思的,它不像Python, Ruby 等完全是开源社区驱动,也不像C#,VB.NET主要由微软操刀.它是一个以Oracle(之前是Sun)为主,各大巨头一起参与,一起制定 ...
- java调用子系统代码_深入理解JAVA虚拟机-Idea远程执行本地Java代码 - Java 技术驿站-Java 技术驿站...
今天在看深入理解JAVA虚拟机的9.3节,作者实现了一个远程执行功能.这个功能可以在远程服务器中临时执行一段程序代码,而去不依赖jdk版本,不改变原有服务端程序的部署,不依赖任何第三方库,不入侵原有的 ...
最新文章
- 20 道 Spring Boot 面试题
- Apache Camel的性能调整思路
- android tee,Android 9.0的新增安全特性与TEE
- 用 cairo 实现跨平台图形
- 通过sudo提权方式控制公司人员权限
- paip.lbmall 安装doc
- 算法:Regular Expression Matching(正则表达式匹配)
- Excel如何批量根据身份证号码查询出地址
- 巴斯勒相机的ip掩码_子网掩码计算器让IP掩码计算不再难!
- 网络营销--网络广告
- hive根据日期算哪一年的第几周(年周)以及算周几星期几
- 高通骁龙600系列处理器
- python lambda菜鸟_Python lambda介绍
- 苹果 macbookpro m2 pro、m2 max、m1 pro和 m1 max区别
- PHPstorm 函数时间注释的修改 正常的PHPstorm里面函数方法的注释是没有动态时间设置的,但是看了PHP file里面有时间日期的注释,而PHP Function Doc Commen
- PE实战教程之扩大节
- 身份认证技术的产业发展
- NC65发布webservice接口开发环境启动服务找不到接口
- PTA---换硬币 (20 分)
- ubuntu18.04添加自定义分辨率
热门文章
- Java学习笔记3——集合框架
- linux下anaconda3安装教程,Ubuntu18.04 安装 Anaconda3的教程详解
- python解压加密zip文件_Python:解压缩前检测一个zip文件否为加密,两种算法。
- python网页爬虫循环获取_Python 爬虫第三篇(循环爬取多个网页)
- 微信小程序php实现登陆的代码,微信小程序实现微信登录
- 用了十年的昵称badboy_怎样用5秒钟看清一对夫妻的真实感情状况?
- python文本风格_以写代学:python 良好的代码风格实例解析
- python 属性描述符_Python属性描述符(二)
- raid卡组不同raid_RAID磁盘阵列是如何运作的?
- html中 一条样式规则,css规则的基本格式是什么?