博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM之执行重载方法(静态分派)
阅读量:3750 次
发布时间:2019-05-22

本文共 1588 字,大约阅读时间需要 5 分钟。

深入理解 JVM 一书中的内容

例如,一个类中有诸多的重载方法,那么参数char arg = 'a';在调用下面的方法时,会发生什么呢?

public static void sayHello(Object arg) { System.out.println("Object"); }public static void sayHello(int arg) { System.out.println("int"); }public static void sayHello(long arg) { System.out.println("long"); }public static void sayHello(Character arg) { System.out.println("Character"); }public static void sayHello(char arg) { System.out.println("char"); }public static void sayHello(char... arg) { System.out.println("char..."); }public static void sayHello(Serializable arg) { System.out.println("Serializable"); }
执行第 n 次数 JVM 执行方法的输出结果 方法执行后的操作
1 char 注释参数为 char 的方法
2 int 注释参数为 int 的方法
3 long 注释参数为 long 的方法
4 Character 注释参数为 Character 的方法
5 Serializable 注释参数为 Serializable 的方法
6 Object 注释参数为 Object 的方法
7 char… 注释参数为 char… 的方法

为什么?

我们都知道向上转型,例如:class Man extends Human,此时声明Human man = new Man();,等号左边的Human称为变量man静态类型,等号右边的Man称为变量man实际类型。举这个例子是为了明确这两个名词,然后再来解释方法重载时,JVM如何确定调用哪个方法。
方法重载时依赖静态类型来定位方法执行版本的分派,即静态分派。静态分派发生在编译阶段,因此确定静态分派的动作实际上不是由虚拟机来执行的。另外,编译器虽然能确定方法的重载版本,但在很多情况下这个重载版本并不是“唯一的”,往往只能确定一个“更加合适的”版本。

  1. 首先'a'是一个char类型的数据,那么参数为char的方法是最适合的
  2. 其次char自动转型为int、long、float、double类型的数据(charbyteshort会损失精度),精度由小到大优先匹配,基本数据类型优先考虑。
  3. 然后参数char进行一次自动装箱,被封装为包装类型Character
  4. char装箱后转型为父类,因为Character实现SerializableComparable接口,因此可以匹配参数为这两个接口的方法,但如果同时出现两个参数分别为SerializableComparable的重载方法,那么编译器会拒绝编译
  5. char的顶级父类是Object。如果有多个父类,那么将在继承关系中从下往上开始搜索,越往上优先级越低。即使传入的参数值为null时,这个规则仍然使用。这里要特别注意null,详情请看
  6. 最后变长参数的重载优先级是最低的

注意:char[] 是数组类型,因此不能匹配char arg = 'a';参数。

结论:优先匹配顺序:类型匹配>基本数据类型>包装类型>父类(不包含Object,且同时存在多个父类匹配时,JVM首先不会答应)>Object>变长

转载地址:http://cvcsn.baihongyu.com/

你可能感兴趣的文章
日志库EasyLogging++学习系列(6)—— 日志记录器
查看>>
日志库EasyLogging++学习系列(7)—— 记录方式详解
查看>>
日志库EasyLogging++学习系列(8)—— Verbose日志详解
查看>>
日志库EasyLogging++学习系列(9)—— 性能跟踪功能
查看>>
日志库EasyLogging++学习系列(10)—— 日志文件滚动
查看>>
日志库EasyLogging++学习系列(11)—— 共享日志库
查看>>
MFC隐藏和显示一个控件的方法
查看>>
在MFC中使用Static text控件显示消息
查看>>
mfc 怎样动态设置static text 的可见属性
查看>>
VC++ 获取系统时间的方法汇总
查看>>
sqlite3 表里插入系统时间(时间戳)
查看>>
SQLite 3 一些基本的使用
查看>>
vc 中对对话框的几种操作
查看>>
读写配置文件(.ini)
查看>>
利用GetPrivateProfileString读取配置文件(.ini)
查看>>
另一种判断文件存在的方法--_access和_waccess
查看>>
Sleep函数
查看>>
C++标准转换运算符reinterpret_cast
查看>>
static_cast、dynamic_cast、const_cast和reinterpret_cast总结
查看>>
Dynamic/Static/Reinterpret/Const and Volatile Cast (English)
查看>>