下面的代码执行时没有任何歧义的编译错误,并且输出为“ 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");
    }
}

最佳答案

在这种情况下,规则是match the most specific method。由于ArithmeticException extends ExceptionArithmeticException extends Object,所以没有歧义:ArithmeticException比其他任何代码都更加具体。

如果您添加此:

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

因为ArithmeticException extends String都不为真,或者相反,您将得到编译错误:没有单个最具体的参数类。

在这一点上可能很重要的一点是,所有这些都是在编译时发生的。解决了目标方法并编译了代码之后,对重载的方法的调用就像对其他任何方法的调用一样。这与方法覆盖形成对比。

10-06 10:51