越来越困惑得到FileNotFoundException
问题描述:
我有这段代码,只是得到FileNotFoundException
。越来越困惑得到FileNotFoundException
public class Overload {
public void method(Object o) {
System.out.println("Object");
}
public void method(java.io.FileNotFoundException f) {
System.out.println("FileNotFoundException");
}
public void method(java.io.IOException i) {
System.out.println("IOException");
}
public static void main(String args[]) {
Overload test = new Overload();
test.method(null);
}
}
任何想法为什么会发生?
答
由于它访问最具体的方法,在这种情况下是从FileNotFoundException
java.lang.Object -> java.lang.Throwable -> java.lang.Exception -> java.io.IOException -> java.io.FileNotFoundException
method(java.io.FileNotFoundException f)
的传承顺序。
正如你所看到的,IOException
继承自Object
(在某些时刻),这使得它更具体,然后Object
。而FileNotFoundException
更具体,然后IOException
。最后,编译器确定它应该调用FileNotFoundException
作为参数的方法。
如果有两种方法同样具体,那么您的代码不会编译错误,并且存在模糊的方法调用。
答
最特定的方法参数被选择用于重载方法
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5
如果多于一个构件的方法是既方便和适用于一个方法调用,有必要选择一种,以提供描述符用于运行时方法调度。 Java编程语言使用选择最具体方法的规则。
你期望什么? – wero