public void myMethod(String s) 

System.out.println("My String"); 
} public void myMethod(StringBuffer sb) 

System.out.println("My StringBuffer"); 
}  public static void main(String args[]) 

Test t = new Test(); 
t.myMethod(null); 
}
}
public class Test 
{
public void myMethod(Object o) 

System.out.println("My Object"); 
}
 
public void myMethod(String s) 

System.out.println("My String"); 
}public static void main(String args[]) 

Test t = new Test(); 
t.myMethod(null); 
}}第一段竟然不能通过,而第二段解释如下null is passed as an argument to the method myMethod(String s) will be called. Had myMethod(String s) not present , myMethod(Object o) would be called.搞不懂既然第二段是与string匹配,而第一段为什么不能通过呢?

解决方案 »

  1.   

    第一段不能通过是正常的,如果你站在编译器的角度考虑,根据一个null,你怎么知道该调用哪个函数?
    而第二段根第一段的差异在于有一个函数的参数时object,我们知道,java中所有对象都是object的子类,所以这两个方法的参数之间有继承关系,那么java将会按照子类优先匹配的模式来进行匹配,所以第二段可以过,你可以把代码改称下面这样,也可以过:public class Test 
    {
    public void myMethod(Test o) 

    System.out.println("My test"); 
    }
     
    public void myMethod(Test1 s) 

    System.out.println("My Test1"); 
    }public static void main(String args[]) 

    Test t = new Test(); 
    t.myMethod(null); 
    }}
    class Test1 extends Test{
    }