本文先对Java重载方法的参数互为父子类时的处理策略进行了查证,后续对涉及到加入重写后的处理策略进行了进一步的探究。
1.起因
老师提出了这样一个问题:
类A中有两个overload方法:
void B(Object o)
void B(Number n)
客户端程序
new A().B(Integer.valueOf(1))调用的是哪个B方法?还是说这段代码无法通过编译?
2.运行结果及原因
粗略完成后运行结果如上图,调用了参数为Number n的方法。原因其实很简单,Object类是所有类的父类,而Number类又是Byte, Double, Float, Integer, Long, Short等类的父类。在上述程序中,主程序传入的参数为Integer.valueOf(1)的返回值,也就是Integer类型,三者的关系为Object→Number→Integer。A().B(Integer.valueOf(1))在class A中没有找到类型匹配的方法,这时触发了Java自动类型提升机制,对Integer进行向上转型后匹配到了了public void B(Number n) 方法,调用后输出字符串"Num".
我们用String类进行测试,符合预期,如下左图。而如果方法参数中没有String类或它的父类,则会在静态检查阶段提示错误,如下右图。


3.再探究
如果给你如下代码,你认为运行后在控制台的输出结果是什么呢?
有小伙伴答案和我最初一样是下面三句的吗?
Obj from C
Num from C
Str fromA
它的最终输出实际是