Java多态重载方法调用时的参数匹配规则问题
Java重载方法匹配逻辑解答
核心规则前置
Java的**方法重载(Overload)**属于静态分派逻辑,要调用哪个签名的方法实现,在编译阶段就已经完全确定,匹配规则仅参考参数的静态声明类型,和运行时的实际对象类型无关。
代码执行流程逐段解析
- 第一步:main方法执行
showText("def")
仅有1个入参的showText只有method-1(形参类型为Object),String是Object的子类,匹配成功,进入method-1,输出1.....。 - 第二步:method-1内部执行
showText(abc, "abc")
这里的abc在method-1中的静态声明类型是Object,即使运行时实际传入的是String实例,编译阶段还是会按Object类型匹配重载方法。当前双参数的showText有两个候选:- method-2:首个形参类型为Object,第二个为String,完全匹配当前入参的静态类型
- method-3:首个形参类型为String,不匹配
abc的静态类型Object,被排除
所以这里匹配method-2,进入后输出2.....。
- 第三步:method-2内部执行
showText(text, item)
这里的text在method-2中的静态声明类型是String,item的静态类型也是String,匹配时双参数候选:- method-2:首个形参Object,需要向上转型,匹配优先级低
- method-3:首个形参String,第二个形参String,完全匹配
所以这里匹配method-3,进入后输出3.....。
最终结论
实测输出1.....2.....3.....完全符合Java重载的静态分派规则,method-1内部调用双参数方法时匹配的是method-2,核心原因就是重载匹配仅看参数的静态声明类型,不看运行时实际类型。
内容的提问来源于stack exchange,提问作者jinmu
相关产品推荐
相关产品推荐

