一个方法test重载,
一个是test(String),一个是test(Object),
调用的时候 用test(null)为什么调用的是string的那个方法;另再加一个test(StringBuffer),
这时候调用test(null),为什么又编译错误!对解答者表示感谢!

解决方案 »

  1.   

    兄弟 sjcp题吧 编译器很聪明的,它会找 除了object那个意外的一个,如果有2个,就是二异性 它就会报错了其实就是这样
      

  2.   

    什么叫 “除了object那个意外的一个” 不太懂哦   能介绍清楚点吗 谢谢!
      

  3.   

    编译器很聪明?聪明个头阿,已经都二义性了,只不过打了一个补丁,对Object特殊处理了一下。这应该算java语言不严谨的一个地方。
      

  4.   

    1#解释了
    java中除基本类型外都继承Objecttest(String s)
    另再加一个test(StringBuffer sb)
    在null时同时符合上面二个就报错了
      

  5.   

    那null也符合object  为什么不调用参数为object的那个方法呢?我提了2个问题  麻烦大家分别介绍下   谢谢!
      

  6.   

    String 是继承自Object类的,所以test(null)会调用test(String str)如果有test(Integer id)就会报错了吧,这时编译器不知道调用的是test(String str)还是test(Integer id)就像调用test(StringBuffer sb) 会报错一样。。
    这是我的理解。这个题考的是多态和继承,如有不当,欢迎指正。
      

  7.   

    如果 只有 一个 那个 object参数 肯定会调用 它 但是现在除了 object还有string,它会先调用 string的那个函数,重载就是为了解决 子类的多种多样 编译器会首先 选择 除了 object类 之外 先调用,如果有 stringbuffer ,那么 string和stringbuffer都满足, 编译 器 调用没有办法 去选择调用哪个?所有 报错了。
      

  8.   

    #12的意思是编译器会自动判断非Object方法调用.有2个非OBJECT方法,调用null,则报异常
      

  9.   

    编译器总是根据调用方法时传入的参数类型来决定调用哪一个重载方法,如果参数为null则会首先试图找到Object类层次结构中唯一的类与之匹配,如果没有可以匹配的才会匹配Object类。
    如果有两个以上的重载方法参数可以匹配null,并且参数类型在Object类层次结构中有父子关系或子孙关系,则匹配最底层的子类,如果不是以上关系编译器则会认为是二义性。String和StringBuffer就是兄弟关系,所以有二义性。
      

  10.   

    这里是编译器的优化,如果同时有两个方法入口符合,编译器会尽量找声明子类的那个方法但是如果定义了test(StringBuffer),编译器就不知道应该使用哪个子类才合适了
      

  11.   

    在这个程序中,  test.print(null)中的null即是String又是Object,那么要执行那个函数呢?结果是它执行了 public void print(String some),原因就是准确性原则,String继承自Object.在java看来,在这个例子中说null是String类型的比说null是Object类型的更为准确.String和StringBuffer之间不存在继承关系,因此不能说null属于它们两个中的那个类更准确,于是程序在执行时就会不知道该调用public void print(String some),还是该调用 public void print(StringBuffer some).