[转帖] java的多态——null参数会调用哪个方法?_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3375 | 回复: 0   主题: [转帖] java的多态——null参数会调用哪个方法?        下一篇 
Leon
注册用户
等级:少校
经验:1436
发帖:116
精华:7
注册:2013-1-4
状态:离线
发送短消息息给Leon 加好友    发送短消息息给Leon 发消息
发表于: IP:您无权察看 2013-1-9 10:47:44 | [全部帖] [楼主帖] 楼主

读了http://developer.51cto.com/art/200906/130414.htm这篇《深入理解Java多态性》,对多态有多了一点了解。然后突然想到一个问题:调用重载的方法时,如果入参是null,java实际会去调用哪个方法呢?

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

  1. System.out.println(a1.show(null)); 
  2. System.out.println(a2.show(null)); 
  3. System.out.println(b.show(null)); 
  4. System.out.println(c.show(null)); 
  5. 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”的输出了。

然后又看到这篇文章:http://blog.csdn.net/edhroyal/article/details/6094941,好奇的做了另一个尝试:

  1. public class OverLoadingWithNull { 
  2.  
  3.  private void print(List list) { 
  4.  System.out.println("this is print List method"); 
  5.  } 
  6.  
  7.  private void print(Map str) { 
  8.  System.out.println("this is print Map method"); 
  9.  } 
  10.  
  11.  static public void main(String[] args) { 
  12.  OverLoadingWithNull theTest = new OverLoadingWithNull(); 
  13.  
  14.  theTest.print(null); 
  15.  } 
  16.  

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




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论