在调用重载方法的时候,要找一个与参数类型最匹配的方法.
在有多个可匹配的参数的情况下,找最具体的方法匹配
而null可以匹配任何类型,而类型String显然要比Object更加具体,所以会匹配String

解决方案 »

  1.   

    什么时候会调用
    public void method(Object o) { 
    System.out.println("Object Version"); 

      

  2.   

    不是string的其他对象,估计就调用public void method(Object o) { 
    System.out.println("Object Version"); 

      

  3.   

    什么最匹配啊?跟Object就不匹配了吗?
      

  4.   

    null可以是任何对象,为什么偏偏匹配String
      

  5.   

    可能事它这里只有一个string,除了object,没办法,跟了它了
      

  6.   

    什么叫“比Object更加具体,”这种解释太烂。
      

  7.   

    public class test1 {        public test1() {
            }
    }
    public class test2 extends test1 {        public test2() {
            }
    }
    public class test {public void method(Object o) {
           System.out.println("Object Version");
    }
    public void method(test1 s) {
           System.out.println("test1 Version");
    }public void method(test2 s) {
           System.out.println("test2 Version");
    }
    /*public void method(String a){
    System.out.println("String version");
    }*/
    public static void main(String args[]) {
    test test = new test();
    test.method(null);
    }
    }
    你们可以试试,这段程序,然后把注释去掉,看看又会怎么样。
      

  8.   

    1、修改了测试程序:
    // test.java
    import java.util.*;public class test { 
    public void method(Object o) { 
    System.out.println("Object Version"); 
    } public void method(String s) { 
    System.out.println("String Version"); 
    } public static void main(String args[]) { 
      test test = new test(); 
      test[] t=new test[1];
      test.method(new Integer(1));   if(t[0]==null){
        System.out.println("Here is null");
        test.method(t[0]);
      }
      test.method(null);
      }   
    } 2、结果如下:
    F:\java>java  test
    Object Version
    Here is null
    Object Version
    String Version
    3、问题确实有些奇怪:
    同样t[0]也是null,输出结果是“Object Version”
      

  9.   

    解释一下为什么说“具体”不好,因为具体相对于抽象,在我的例子中test1是test2的超类但不好说test1是抽象的吧,所以我觉得找“最新”的匹配比较合适,不过我知道其实我们的理解是一样的,呵呵
    楼上这个例子也说明这一点。因为t[0]是test类型的对象在找不到最新的test类型的对象匹配时所以调object 的方法,不信可以试试加个
    public void method(test a)
    {
     System.out.println("test version");
    }
    方法。
      

  10.   

    如果是两个没有父子关系的类又如何解释呢?
    比如一个为String
    另一个为Frame类,又调用哪一个呢?
      

  11.   

    //: testnull.javaclass animal{
      animal(){
       System.out.println("I am an animal");
      }
    }class bull extends animal{
      bull(){
       System.out.println("I am a bull");
      }
    }class fruit {
    fruit(){
    System.out.println("I am a fruit");
    }
    }class apple extends fruit{
      apple(){
       System.out.println("I am a apple");
      }
    }public class testnull{
      /*void Method(animal a){
       System.out.println("animal version");
      }*/
      /*void Method(bull b){
       System.out.println("bull version");
      }*/
      void Method(fruit f){
       System.out.println("fruit version");
      }
      void Method(apple a){
       System.out.println("apple version");
      }
      void Method(Object o){
       System.out.println("Object version");
      }
      /*void Method(String s){
       System.out.println("String version");
      }*/
      public static void main(String[] args){
       testnull t=new testnull();
       //出现编译错误:
       //F:\java>javac testnull.java
        //testnull.java:48: reference to Method is ambiguous, both method Method(bull) in
        //testnull and method Method(java.lang.String) in testnull match
        //    t.Method(null);
        //     ^
        //1 error
        
        //在测试如下几种组合后会出现类似的错误信息:
        //1、注释Mothod(String s)
        //2、注释Mothod(String s)、Method(bull b)
        
        //在测试以下组合后,编译成功,输出结果为“apple version”:
        //1、注释Mothod(String s)、Method(bull b)、Method(animal a)
        
        //猜想:
        //对于输入参数直接为null的情况:
        //1、当所有重载方法的参数类型不都属于一类时,会出现编译错误。
        //   当然Object可以属于任何一个子类,故Object可以属于animal、bull、fruit、apple、String
        //2、当所有重载方法的参数类型都属于一类时,会调用参数是类树中最高级的行为。
        //   如上述的成功组合,输出结果是apple,不是fruit、Objcet
        //3、事实上,这种输入参数直接为null的情况的实际意义不大。
       t.Method(null);
      }
    }
      

  12.   

    //: testnullnew.javaclass animal{
      animal(){
       System.out.println("I am an animal");
      }
    }class bull extends animal{
      bull(){
       System.out.println("I am a bull");
      }
    }class fruit {
    fruit(){
    System.out.println("I am a fruit");
    }
    }class apple extends fruit{
      apple(){
       System.out.println("I am a apple");
      }
    }public class testnullnew{
      void Method(animal a){
       System.out.println("animal version");
      }
      void Method(bull b){
       System.out.println("bull version");
      }
      void Method(fruit f){
       System.out.println("fruit version");
      }
      void Method(apple a){
       System.out.println("apple version");
      }
      void Method(Object o){
       System.out.println("Object version");
      }
      void Method(String s){
       System.out.println("String version");
      }
      public static void main(String[] args){
       testnullnew t=new testnullnew();
              
        //猜想:
        //对于行为参数不直接为null的情况:
        //1、调用那个参数和输入参数最匹配的行为
      
       testnullnew[] tarr=new testnullnew[1];
       t.Method(tarr[0]);//输出Object version
       bull[] barr=new bull[1];
       t.Method(barr[0]);//输出bull version
      }
    }