文档章节

java方法重载重写原理学习的简单总结

娑婆丶
 娑婆丶
发布于 02/18 15:30
字数 756
阅读 26
收藏 0

概述

根据查看过的 深入理解JVM 和 郑雨迪的教程,对java中方法重载的原理进行一个大致总结

具体总结

在JAVA中,多态主要体现为方法的重载和重写。

  • 方法重载:同一个类中,方法名相同,参数列表不同(在编译器那层基本不会考虑返回参数)的两个或多个方法就视为这个几个方法是重载的。
  • 方法重写:对应于父类和子类,方法名和方法描述符相同(参数列表和返回类型组成),就会产生重写,即子类的方法会覆盖掉父类的方法(对了,静态方法的话效果也差不多哦😊,父类的静态方法会被子类的静态方法隐藏掉,也和覆盖差不多)
    • 在java中,是不允许两个参数列表相同且方法名相同的方法出现的,即使他们的返回类型不同,这是在编译期就已经会检测的。(之所以强调这个是因为,事实上如果你绕开编译器,你生成了两个方法,方法名相同,方法参数列表相同,但是方法返回不同,你通过字节码去调用,同样是可以做到重载的,因为在字节码的层次对于方法的签名是包含了对返回类型的区分的。。。)

谈到“二重奏”,就必须要谈到他们在JAVA中的实现原理: 静态绑定(也叫静态分派) 和 动态绑定(动态分派).
在JAVA文件编译的时候,编译器就会判断调用的方法的类型,以及这个方法是否可以直接在编译时判定(即判定是具体哪个类的哪个方法),并以此为依据将方法的调用转换为以下几种字节码调用:
* invokestatic 静态方法
* invokespecial 私有实例方法
* invokevitural 非私有实例方法
* invokeinterface 接口方法
* invokedynamic ...

  • 静态绑定
    在实际调用的时候,invokestatic,invokespecial这两个是静态绑定的,即在编译器就确认好了具体调用的是哪个类的哪个方法,不需要去寻找。
  • 动态绑定
    invokevitural,invokeinterface,invokedynamic这些方法调用的字节码指令,在执行时,会主动去查找这个方法到底是属于哪个类,
    比如对于向上转型(父类引用指向子类对象)的那种情况,它就会判断这个对象的真正类型,然后再从真正类型开始去查找方法。

© 著作权归作者所有

娑婆丶
粉丝 3
博文 12
码字总数 6389
作品 0
私信 提问
[短文速读-2] 重载/重写,动/静态分派?

正题 为了避免不必要的浪费时间,文章主要是围绕俩点进行展开: 1、重载为什么根据静态类型,而非动态类型? 2、通过动/静态分派决定调用对应方法的符号引用。 如果对这俩个问题理解的比较深...

MDove
2018/09/10
0
0
04-《深度拆解JVM》之 JVM是如何执行方法调用的?(上)

一、问题引入 前不久在写代码的时候,郑雨迪老师不小心踩到一个可变长参数的坑。它就是由于可变长参数方法的重载造成的。(注:官方文档建议避免重载可变长参数方法,见 [1] 的最后一段。) ...

飞鱼说编程
2018/09/18
22
0
JAVA基础再回首(三十)——JAVA基础再回首完美结束,感概万千!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52724939 JAVA基础再回首(三十)——JAVA基础再回首完美结束,感概万千! 经过了几...

Aduroidpc
2016/10/02
0
0
你不知道的 equals 和 ==

先来看一道 equals和 == 相关的面试题吧。 先告诉你答案是 true,true,false,true。 i1 == i2 和 i1.equals(i2) 这两个都是 true,大多数人应该可以答对。后面的 i3 == i4 和 i3.equals(i4...

Wizey
2018/08/17
0
0
【Java】疯狂Java基础(一)——面向对象的特征:继承、封装和多态

一、前言 小编记得,刚接触计算机相关的课程的时候,接触的是c++,c++的老师一上来就说c++是面向对象的,c语言是面向过程的。面向对象比面向过程厉害,是从面向过程发展过来的的。 当时有一个...

kisscatforever
2018/03/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
4
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
7
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
5
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
6
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部