相同方法名,参数类型不同,传NULL参数。先调用谁?

 void a(Object o){
...
}
 void a(String s){
...
}
public void main(String args[]){   a(null);}猜猜调用的是哪个方法?好吧,我承认是调用void a(String s)
求大神说明其原因!java 参数 null

解决方案 »

  1.   

    因为类 Object 是类层次结构的根类。每个类都使用 Object 作为父类。当子类方法与父类方法相同时,相当于重写父类中的方法,会覆盖原来父类中的该方法,所以调用的是void a{String s}
      

  2.   

    还真的和继承有关系,子类的优先级更高:
    public class TestOverride {
    static void a(A a) {
    System.out.println("A...");
    }

    static void a(B b) {
    System.out.println("B...");
    }

    public static void main(String[] args) {
    a(null);
    }

    class A{
    }

    class B extends A {
    }
    }首先,输出为:B..
    其次,如果将B类的extends去掉,就会编译不过,错误信息是“a(null)”这种调用会造成混淆。而如果有继承关系,编译就会通过。
      

  3.   

    推荐一篇博客,也许这里有你想要的答案!从一道测试题分析java中的方法重载(overload)
      

  4.   

    如果是编译的时候,显式传递null,也就是a(null);编译不通过,会告诉你有歧义。如果是运行的时候,参数的值为null,那么看这个参数,在编译的时候,声明的类型是什么,比如String foo() {
      return null;
    }
    String x = foo();
    a(x); // 显然调用a(String),同理
    Object y = foo();
    a(y); // 不管foo()实际返回的类型,还是foo的签名,只管y的声明类型,调用a(Object)