public class TestMain {
public static void methodTest(Exception e) {
System.out.println("Exception method called");
}
public static void methodTest(Object e) {
System.out.println("Object method called");
}
public static void methodTest(NullPointerException e) {
System.out.println("NullPointerException method called");
}
public static void main(String args[]) {
methodTest(null);
}
}
输出:名为
的NullPointerException方法答案 0 :(得分:38)
如果有多个重载方法可能使用给定参数调用(在您的情况下为null
),编译器会选择最具特异性的方法。
请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5
在您的情况下,methodTest(Exception e)
比methodTest(Object e)
更具体,因为Exception是Object的子类。 methodTest(NullPointerException e)
甚至更具体。
如果用另一个Exception子类替换NullPointerException,编译器将选择那个。
另一方面,如果你创建一个像testMethod(IllegalArgumentException e)
这样的附加方法,编译器会抛出一个错误,因为它不知道选择哪一个。
答案 1 :(得分:9)
编译器将尝试匹配最具体的参数,在本例中为NullPointerException
。您可以在Java语言规范的15.12.2.5. Choosing the Most Specific Method
部分中看到更多信息:
如果多个成员方法都可访问且适用于a 方法调用,有必要选择一个提供 运行时方法调度的描述符。 Java编程 language使用选择最具体方法的规则。
非正式的直觉是一种方法更具体 如果可以传递第一个方法处理的任何调用,则为另一个 没有编译时类型错误的另一个。
[...]