过载:当参数是原始参数时会产生歧义,但当它是引用类型时则不会
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)
。 String
比 Object
更具体,因为 String
是 Object
的子 class。
public void f(StringBuffer o)
与此示例无关,因为 StringBuffer
不是 String
的超 class,因此您不能传递 String
到需要 StringBuffer
.
的方法
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)
。 String
比 Object
更具体,因为 String
是 Object
的子 class。
public void f(StringBuffer o)
与此示例无关,因为 StringBuffer
不是 String
的超 class,因此您不能传递 String
到需要 StringBuffer
.