[英]Method overloading in java regarding arguments with int/long and String/object
对于以下程序,为什么要调用具有int和String参数的方法而不是long和Object?
想知道为什么编译器选择int代替long
参数,而选择String
代替Object
参数。
注意:这是在采访中问到的。
public class MethodOverloadingTest {
public static void add(int n, int m){
System.out.println("Int method");
System.out.println(n+m);
}
public static void add(long n, long m){
System.out.println("Long method");
System.out.println(n+m);
}
public static void method(String st){
System.out.println("from String method");
}
public static void method(Object obj){
System.out.println("from Object method");
}
/**
* @param args
*/
public static void main(String[] args) {
add(2,3);
method(null);
}
}
对于add(2,3)
方法,您要传递整数,这就是为什么要调用整数的原因。 对于method(null)
,选择最具体的方法参数。 在这种情况下, String
比Object
更具体。 因此method(String st);
被叫。
该概念称为“早期绑定”。 最具体的方法(基于参数)是在编译时选择的。
Object
是java中最具体的类,因为它是所有类的超类。
如果多个成员方法既可访问又可应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。 Java编程语言使用选择最具体方法的规则。
选择方式在规则集中给出,此处指定
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5
这很简单,因为Java默认将数字视为int,将字母视为字符串对象,而不是通用对象。
因此,当您传递add(2,3)时,它将参数作为普通int
调用add(long,long)将参数传递为; add(2.0,4.0)像这样。 并用于调用函数method(object)
1.首先对您的字符串进行类型转换以键入对象String str; str =(对象)“ Hello world”;
2.然后传递给方法(str);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.