3

下面的代码执行没有任何歧义的编译错误,输出是“ ArithmeticException ”。伙计们可以帮助我知道原因。

class Test {

    public static void main(String[] args) throws UnknownHostException, IOException {
        testMetod(null);
    }

    // Overloaded method of parameter type Object
    private static void testMetod(Object object) {
        System.out.println("Object");
    }

    // Overloaded method of parameter type Exception
    private static void testMetod(Exception e) {
        System.out.println("Exception");
    }

    // Overloaded method of parameter type ArithmeticException
    private static void testMetod(ArithmeticException ae) {
        System.out.println("ArithmeticException");
    } 
}
4

1 回答 1

3

在这种情况下,规则是匹配最具体的方法。因为ArithmeticException extends ExceptionArithmeticException extends Object,所以没有歧义:ArithmeticException比其他任何一个都更具体。

如果你添加这个:

private static void testMetod(String string) {
    System.out.println("String");
}

你会得到一个编译错误,因为两者都不ArithmeticException extends String是,反之亦然:没有一个最具体的参数类。

在这一点上说所有这些都发生在编译时可能很重要。一旦解析了目标方法并编译了代码,对重载方法的调用就像对任何其他方法的调用一样。这与方法覆盖相反。

于 2015-08-05T11:35:55.910 回答