因获取 FileNotFoundException 而感到困惑
Getting confused by getting 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);
}
}
知道为什么会这样吗?
因为它确实访问了最具体的方法,在本例中是 method(java.io.FileNotFoundException f)
的继承顺序
java.lang.Object -> java.lang.Throwable -> java.lang.Exception -> java.io.IOException -> java.io.FileNotFoundException
.
如您所见,IOException
继承自 Object
(在某些时候),这使得它比 Object
更具体。 FileNotFoundException
比 IOException
更具体。最后,编译器决定它应该使用 FileNotFoundException
作为参数调用该方法。
如果有两个同样具体的方法,您的代码将无法编译,并出现错误,即方法调用不明确。
为重载方法选择了最具体的方法参数
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5
如果有多个成员方法既可访问又适用于一个方法调用,则需要选择一个为run-time方法调度提供描述符。 Java 编程语言使用选择最具体方法的规则。
我已经得到那段代码,并且正在获取 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);
}
}
知道为什么会这样吗?
因为它确实访问了最具体的方法,在本例中是 method(java.io.FileNotFoundException f)
java.lang.Object -> java.lang.Throwable -> java.lang.Exception -> java.io.IOException -> java.io.FileNotFoundException
.
如您所见,IOException
继承自 Object
(在某些时候),这使得它比 Object
更具体。 FileNotFoundException
比 IOException
更具体。最后,编译器决定它应该使用 FileNotFoundException
作为参数调用该方法。
如果有两个同样具体的方法,您的代码将无法编译,并出现错误,即方法调用不明确。
为重载方法选择了最具体的方法参数
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5
如果有多个成员方法既可访问又适用于一个方法调用,则需要选择一个为run-time方法调度提供描述符。 Java 编程语言使用选择最具体方法的规则。