过载:当参数是原始参数时会产生歧义,但当它是引用类型时则不会

OverLoading : Ambigutiy while the parameters are primitive but not while it is Reference type

public class Test {

public static void main(String[] args) throws ClassNotFoundException {


    new Test().f("dfffg");   // it is running perfectly
    new Test().f(1, 1);      // it is giving ambiguity
}

public void f(int a,long b){
    System.out.println("in int and long");
}

public void f(long a,int b){
    System.out.println("in long and int");
}

public void f(String s) {
    System.out.println("in String");

}


public void f(StringBuffer o) {
    System.out.println("in String bufer");

}

public void f(Object o){
    System.out.println("in object");
}
}

当我执行此 new Test().f("dfffg"); 时它是完美的 运行 尽管我们有以 StringBuffer 和 Object 作为参数的重载方法

而f(1,1)给出了歧义,我能理解。

new Test().f("dfffg") 匹配 public void f(String s)public void f(Object o) 的签名。传递对象参数时,会选择具有最具体参数类型的方法:在本例中为 public void f(String s)StringObject 更具体,因为 StringObject 的子 class。

public void f(StringBuffer o) 与此示例无关,因为 StringBuffer 不是 String 的超 class,因此您不能传递 String 到需要 StringBuffer.

的方法