越来越困惑得到FileNotFoundException

越来越困惑得到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); 
    } 
} 

任何想法为什么会发生?

+3

你期望什么? – wero

由于它访问最具体的方法,在这种情况下是从FileNotFoundException

java.lang.Object -> java.lang.Throwable -> java.lang.Exception -> java.io.IOException -> java.io.FileNotFoundExceptionmethod(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编程语言使用选择最具体方法的规则。