2016-01-06 68 views
3

我有这段代码,只是得到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

回答

5

由于它访问最具体的方法,在这种情况下是从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作为参数的方法。

如果有两种方法同样具体,那么您的代码不会编译错误,并且存在模糊的方法调用。