Java重载方法的参数互为父子类时处理策略的探究

文章探讨了Java中重载方法在参数为父子类时的调用策略,通过示例展示了Integer到Number再到Object的类型提升,并分析了方法选择的过程。在涉及重写的情况下,即使引用类型为父类,实际调用会根据实际对象类型确定,体现了Java的动态绑定特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文先对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
        它的最终输出实际是
            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值