我们在调用一个虚方法的时候,jvm会在适当的时候帮我们选择合适的方法版本,有的时候在编译期、有时是在运行时,这个方法版本的选择过程我们可以称之为【方法分派】

举例:

public class Human {
}public class Man extends Human{
}public class Woman extends Human{
}
public class Party {public void play(Human human){System.out.println("人类的狂欢!");}public void play(Man man){System.out.println("男人的狂欢!");}public void play(Woman woman){System.out.println("女人的狂欢!");}public static void main(String[] args) {Party party = new Party();Human human = new Human();party.play(human);Human man = new Man();party.play(man);Human woman = new Woman();party.play(woman);}
}

结果:

人类的狂欢!
人类的狂欢!
人类的狂欢!

我们赫然发现最后的结果是三个人类的狂欢,这个结果可能让一些工作两三年的程序员大跌眼镜。

虚拟机在选择重载方式时,是通过【静态类型】决定的而不是动态类型。由于静态类型编译时就可知,事实上虚拟在编译期就已经知道选择哪一个重载方法,并且把这个方法的符号引用写在了invokevirtual的指令中。

所有依赖【静态类型】决定方法执行版本的的分派动作称之为静态分派,有些博客也会说这个过程是解析而不是分派,JVM帮助我们选择一个合适的方法的时候,也是尽最大努力,选择它认为最合适的版本。


因为确实存在诸如自动拆装箱,对象转型等问题,大家可以看一个变态的重载题目:

public class Overload {public void sayHello(Object arg){System.out.println("hello object");}public void sayHello(int arg){System.out.println("hello int");}public void sayHello(long arg){System.out.println("hello long");}public void sayHello(Character arg){System.out.println("hello Character");}public void sayHello(char arg){System.out.println("hello char");}public void sayHello(char... arg){System.out.println("hello char...");}public static void main(String[] args) {new Overload().sayHello('a');}}

结果:

hello char

删除掉  sayHello(char arg)  方法,结果为:

hello int

删除掉  sayHello(in arg)  方法,结果为:

hello long

删除掉  sayHello(long arg)  方法,结果为:

hello Character

删除掉  sayHello(Character arg)  方法,结果为:

hello object

删除掉  sayHello(object arg)  方法,结果为:

hello char...

让程序员大跌眼镜的 重载方法的调用相关推荐

  1. 程序员保护眼睛的方法

    程序员保护眼睛的方法 将编程工具的主题改成黑色 将编程工具的字号调大 将电脑的主题调成黑色 使用大屏显示器 每工作20分钟远望20秒,每工作1小时离开座位(上厕所.接水) 1. 将编程工具的主题改成黑 ...

  2. 成为优秀程序员的8种方法

    成为优秀程序员的8种方法 是时候认真对待如何提高你的编程技能了.让我们开始吧! "成为一个牛逼的程序员"是一个看似很容易实现的职业生涯改进目标,但其实这并非是一个简单的目标.一方面 ...

  3. 软考程序员Java答题速成_软考程序员考试试题解答方法与技巧

    如果说程序员考试解上午题无技巧可言的话,那么解下午题就是70%的实力加30%的方法与技巧,若运用到极致的话,会是"四两拨千斤".下面就来看一下程序员下午题解题步骤和解题技巧,以供考 ...

  4. 黑马程序员 oc对象的方法成员变量

    -----------黑马程序员 IOS培训.Android培训.Java培训.期待与您交流---------------- #import <Foundation/Foundation.h&g ...

  5. 程序员学好英语的方法(转)

    英语对每个人来说都很重要,对于程序员来说尤其的重要,因为一些框架都是外国大佬写的,我们要时时的阅读 API,而这些 API 大多数都是英文了,所以我们程序员对英语的要求还是蛮高的.下面我整理的一些学习 ...

  6. 程序员上班打酱油的方法

    最近似乎装b指南比较火,我也随便写一个,开心就好. 一.准备工作 "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查 ...

  7. 程序员财富自由的方法

    https://mp.weixin.qq.com/s/7ova51wcWfVK9MhKW-S0Rw 个人赚取收入的本质是:出售时间.从这个角度出发,下面的公式可以描述个人收入: 个人收入 = 每天可售 ...

  8. 成为更好程序员的7个方法

    程序员总是有很多的决定,不是吗?如果你的新年待办事项还是空白的话,那么可以考虑使用下面这些程序员的想法.即使是最聪明的人,也还有成长空间.以下内容摘录自 Kevlin Henney 的<程序员应 ...

  9. 2014,成为更好程序员的7个方法

    本文由 伯乐在线 - haofly 翻译.未经许可,禁止转载! 英文出处:Amy Jollymore.欢迎加入翻译小组. 程序员总是有很多的决定,不是吗?如果你的新年待办事项还是空白的话,那么可以考虑 ...

最新文章

  1. 那些方式可以合并php数组,合并数组(PHP)
  2. 谷歌ALBERT模型V2+中文版来了:之前刷新NLP各大基准,现在GitHub热榜第二
  3. HTML做frame跳转设置响应头,X-Frame-Options header响应头如何配置
  4. 如何处理xml文件!看看这里
  5. 详解js中typeof、instanceof与constructor
  6. 一起学nRF51xx 5 -  ppi
  7. 鸟哥的Linux私房菜(服务器)- 簡易 Cluster 架設
  8. 艰难的这年,程序员的未来在哪里?
  9. 解决h5py\_init_.py:26:FutureWarning: Conversion of the second argument of issubdtype from `float`^……
  10. python面对对象编程------3:写集合类的三种方法
  11. 树莓派也跑Docker和.NET Core
  12. node 安装_VUE项目迁移之node.js的安装
  13. 《游戏编程模式》总结
  14. Tomcat报错 严重: A child container failed during start
  15. 字节跳动又启动期权回购了,这次价格142美元,较上一轮回购价涨8%
  16. Gogs 查看 git 代码地址
  17. MVC三层架构详细图
  18. 数据包络分析法(DEA)_1
  19. “海天”们推新、“饭爷”们加速;调味料升级战谁能突围?
  20. Movist Pro for Mac 2.2.16 — 播放器

热门文章

  1. 商品信息页面放大镜功能
  2. inside Android完整版,inside
  3. 志宇-nexus学习
  4. Spring Boot 排除自动配置
  5. SIM8100、SIM8800CE、SIM8800E 车规级模组 特性
  6. cuckoo沙箱的搭建
  7. 使用IEEE的LaTex模板进行论文格式修改初体验
  8. mysql连接字符串db2_ADO.NET入门教程(三) 连接字符串,你小觑了吗?
  9. 我的个人网站不让接入微信登录,于是我做了这个
  10. 机器人公敌过获奖没有_机器人很快将不依赖人类自主学习 “机器公敌”的世界离我们还有多远?...