对于以下程序,为什么调用带有int和String参数的方法而不是long和Object?
想知道编译器为什么选择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);
}
}
个参数。
注意:这是在采访中被问到的。
{{1}}
答案 0 :(得分:4)
对于add(2,3)
方法,您传递的是整数,这就是整数被调用的原因。
对于method(null)
,选择最具体的方法参数。在这种情况下,String
比Object
更具体。因此method(String st);
被调用。
答案 1 :(得分:1)
这个概念称为早期绑定。最具体的方法(基于参数)在编译时被选中。
Object
与java中的任何其他类相比都是最不具体的,因为它是所有类中的超类。
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。
如何选择在规则集中指定,在此处指定
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5
答案 2 :(得分:1)
它很简单,因为Java默认将数字视为int,将字母视为字符串对象,而不是通用对象。
所以当你传递add(2,3)时,它将参数作为普通的int
调用add(long,long)传递参数为; 添加(2.0,4.0) 这样的事情。并且用于调用函数方法(对象)
1.首先将您的字符串类型转换为类型对象 String str; str =(object)“Hello world”;
2.然后传递给方法(str);