java的多态——null参数会调用哪个方法?

调用重载的方法时,如果入参是null,java实际会去调用哪个方法呢?

以那篇文章的四个类为例,执行下述代码,会得到什么结果呢?

System.out.println(a1.show(null));
System.out.println(a2.show(null));
System.out.println(b.show(null));
System.out.println(c.show(null));
System.out.println(d.show(null));
直觉上我觉得这压根编译不了。null不是任何类的实例,以它为参数,编译器怎么会知道show(T arg)方法中的T是个什么类?但实际上,这几行代码不仅通过了编译,还整齐划一的输出了五行“A and D”。这是为什么?

bing了一下“重载 null”,找到这篇文章:http://blog.csdn.net/sxzlc/article/details/6124099,其中有这样的说法:

“Java的重载解析过程是以两阶段运行的。第一阶段 选取所有可获得并且可应用的方法或构造器。第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构 造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性[JLS 15.12.2.5]。”

回过头来看咱们的代码。以第五行为例:

System.out.println(d.show(null));
d.show()至少有这样几种多态的方法:

show(D obj)——从A类中继承的

show(A obj)——从B类中继承的。实际B也是从A中继承的,但B重写了这个方法,所以把D的继承层次算到B为止吧。

show(B obj)——从B类中继承的

这就很显然,show(D obj)方法最精确。这就可以解释那五行“A and D”的输出了。

另一个尝试:

public class OverLoadingWithNull {
    private void print(List list) {
        System.out.println(“this is print List method”);
    }
    private void print(Map str) {
        System.out.println(“this is print Map method”);
    }
    static public void main(String[] args) {
        OverLoadingWithNull theTest = new OverLoadingWithNull();
        theTest.print(null);
    }
}

这一次可就不出意外的编译不了了。原因很好理解,List和Map类型的参数之间没有可替换性,所以无法判定二者谁更精确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值