面试混分巨兽!网络千遍一律标准答案如下:

(1)两者都是面向对象中实现多态的方式,两者与父类方法名都必须相同,两者都允许子类根据自己需要重新实现父类方法。
(2)重写是运行时的多态,重载是编译时的多态。
(3)重写必须保持与父类方法一样的参数列表,一样的返回值。重载是返回值类型不同或者参数列表不同(参数列表的类型,个数等等)。
背题去面试的足够了。下面开始讲重写和重载的原理,会有点苦涩:

我曾经也背书式学习,深受其害,直到后来有空了,带着求知精神深入学习了JVM,才融会贯通很多知识点。

从这个简单的例子可以看出,子类继承了父类的方法,可以重写输出自己定义的‘说话’;也可以修改父类方法void返回值类型为string,重载了say方法。下面看看字节码文件:

编译后发现有三个class字节码文件,一个主类。一个父类一个子类。

我们这里只探究重写和重载,所以直接看子类:

先看重写的方法

再到重载的方法:

发现在这里,它们两个方法的字节码还是大同小异的,就是一个很普通的方法执行,没有特别的标志和符号或者操作指令说明是重写还是重载。真正不同的应该是Main方法,也就是调用的地方。它必须知道调用的哪个具体方法,重载的那个还是重写的那个。

代码:

字节码:

可以看见重写的方法入参类型跟父类的入参类型是一样的,重载的入参类型则是int类型,这里就是根据返回值类型或者入参类型或者参数个数去区分。但是子类两个方法都叫say,却能够准确的找到具体哪个say去调用。这是为什么?继续深一步跟踪:

这里要加一个概念,就是JVM中方法的调用分两种

(1)解析调用:一般就是static静态方法

(2)分派调用:

             ### 动态调用又分:静态分派调用(重载)和动态分派调用(重写)
***静态分派调用***就是重载的方法,它之所以说是静态分派,就是因为它在程序的编译阶段就已经通过参数和方法名或者返回值就能确定调用子类的哪个重载的具体方法,是在编译期确定的,所以叫静态分派。如果有多个都相符合的,比如一个重载方法入参是char ,一个是long,一个是Object.当你传 “a” 的时候,就会准确找到int,当没有入参类型是char的重载方法时,才会迁就一点去找long或者Obeject的(中间会有强转型和如果是对象类型包装类型的装箱)。
比如你玩吃鸡,一开始跳伞你就确定了地图上要捡哪一把枪,目标明确。但是当你想找一把mini狙找不到,那么98K你也将就着先用,因为都是相同类型,就算找到空投里面有AWM,但是你还是用mini顺手,所以你还是将就用着,有最合适的就换。
***动态分派调用***就是重写的方法或者子类调用父类的方法,它在编译期间没办法根据方法名和参数或者返回值确定具体方法,而是在运行时才去主动找要哪个方法。JVM有一个调用过程:

(1)invoke字节码操作指令调用方法时,先去找操作数栈中顶部的栈帧元素指向的对象的类型(方法就是栈里面一个个栈帧),这里可以想象成先从子类找有没有重写这个方法。
(2)假如这个栈帧中是描述符和简单名称都相符合的方法,则进行访问权限的校验,如果校验通过,则直接返回这个方法的直接引用。
(3)如果不存在,则根据继承的父子关系对父类继续进行查找(描述符和简单名称都相符,并且权限允许),如果一个父类不存在,则继续找父类,继续父类的父类。
(4)如果全部父类都没有,返回一个抽象方法未实现异常(AbstractMethodError)。

比如玩吃鸡的时候,你开局跳伞时根本没有想着一定要打什么武器,而是在作战的时候,根据地形和战况再选择武器,攻房用冲锋,近战喷子,远打狙,守桥时用汽油之类。

好了,重写重载就说到这里,如果我有说的不对的地方欢迎提出来,这都是我根据自己的学习理解总结的,欢迎大家讨论,鞠躬!

重写与重载 / 动静态分派调用(JVM字节码底层逐步解析,吃鸡例子简单易懂)相关推荐

  1. 【JVM · 字节码】指令集 解析说明

    1. 概述 Java字节码指令对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令. Java虚拟机的指令由 一个字节长度 的.代表着某种特定操作含义的数字(称为 操作码/Opcode)以及跟随其后 ...

  2. Java指令全集_Java的JVM字节码指令集详解

    本文详细介绍了如何使用javap查看java方法中的字节码.以及各种字节码的含义,并且配以完善的案例,一步步,从头到尾带领大家翻译javap的输出.在文末还附有JVM字节码指令集表. 本文不适合没有J ...

  3. JVM字节码指令集大全及其介绍

    Java是怎么跨平台的 我们上计算机课的时候老师讲过:"计算机只能识别0和1,所以我们写的程序要经过编译器翻译成0和1组成的二进制格式计算机才能执行".我们编译后产生的.class ...

  4. 深入理解JVM字节码(一)

    目录 深入剖析Class文件结构 一.初探class文件 二.class文件结构剖析 (一) 魔数 (二) 版本号 (三) 常量池 1. CONSTANT_Integer_info和CONSTANT_ ...

  5. 深入理解JVM字节码(二)

    目录 字节码基础 一.字节码概述 二.Java虚拟机栈和栈帧 栈帧 1. 局部变量表 2. 操作数栈 三.字节码指令 1. 加载和存储指令 2. 操作数栈指令 3. 对象相关的字节码指令 1. ``方 ...

  6. java开发C语言编译器:把C实现的快速排序算法编译成jvm字节码

    有了前面一系列的铺垫和准备后,我们终于能走到至关重要的一刻.在本节,我们将用C语言开发快速排序算法,然后利用我们的编译器把它编译成java字节码,让C语言编写的快速排序算法能在java虚拟机上顺利执行 ...

  7. 2个字节能存多少个16进制_初探JVM字节码 - 疾风老头

    作者: LemonNan 原文地址: 代码地址: 字节码 概述 本篇要介绍的是能 "一次编译,到处运行的 JVM 字节码" 为什么能到处运行? 是因为在 任意平台下所编译出来的 c ...

  8. Java生产环境下性能监控与调优详解 第8章 JVM字节码与Java代码层调优

    第8章 JVM字节码与Java代码层调优 8-1 jvm字节码指令-1 8-2 jvm字节码指令-2 8-3 i++与++i 8-4 字符串+拼接 8-5 Try-Finally字节码 8-6 Str ...

  9. Android自动化埋点(一) - JVM字节码

    JVM字节码 开头 这一系列文章,主要是讲自动化埋点又叫无痕埋点,或者字节码插桩技术,写这个系列文章的目的是 偶然间发现,网上关于这方面的博客很少,所以我根据自己的一些实战经验,整理了这个系列的文章. ...

最新文章

  1. LeCun之后Jeff Dean离奇躺枪,哥大黑人女博士:你们得引用我!
  2. ETL工具调度之中美PK
  3. java list移除所有元素,从List中移除指定 List 中包含的其所有元素(可选操作)。...
  4. 我的世界1.7.10java下载安装_我的世界1.7.10正式版
  5. Python3.6学习笔记(二)
  6. 倍福(Beckhoff)嵌入式控制器PLC
  7. 一个深入学习Linux/C/C++的原创技术号
  8. hdu 1811Rank of Tetris (并查集 + 拓扑排序)
  9. 凭运气接来的项目,怎样凭本事搞砸?
  10. 又是别人家的公司!华为人才房价格曝光:1万/㎡ 带装修
  11. is-is中通告默认路由
  12. 网线的分类,以及作用
  13. 新颖的自我介绍_新颖的自我介绍6篇
  14. Java-JPEG图片生成器
  15. 【工具分享】如何识别手机里偷数据的那些软件(适用于安卓平台)
  16. (四十二)模态框的使用
  17. 精心整理了30个Python数据分析项目,拿走就用!
  18. 两少年玩防狼喷雾剂 致广州地铁发生踩踏
  19. 汉英谚语与中西方文化(转贴)
  20. 简单的叙述一下发票系统的流程

热门文章

  1. 饥荒mod制作学习(1)
  2. 神庙逃亡java_神庙逃亡2(Temple
  3. w10系统无法访问xp计算机名,解决winxp系统无法访问win10系统共享资源的方法
  4. 站在摩登天空下 :)
  5. 华为OD机试 - 英文输入法(Java JS Python)
  6. 照相机(下)数码相机
  7. ARM经典300问(来源: ChinaUnix博客)
  8. 苹果最新的Apple Watch已推出,苹果手表系列6详情介绍
  9. MySQL数据库的多种连接方式
  10. app android 遥控,第十二章 遥控机器人 《App Inventor--创建自己的安卓应用》