3

此代码打印出来MyUrgentException。有人可以解释为什么吗?

class MyException extends Exception{
}

class MyCriticalException extends MyException{
}

class MyUrgentException extends MyCriticalException{
}

public class Test{
  public void handler(MyException ex){
    System.out.println("MyException");
  }

  public void handler(MyCriticalException ex){
    System.out.println("MyCriticalException");
  }

  public void handler(MyUrgentException ex){
    System.out.println("MyUrgentException");
  }

  public static void main(String [] args){
    new Test().handler(null);
  }
}
4

1 回答 1

3

请参阅类似问题的答案

JLS 15.12.2

[...] 可能有不止一个这样的方法声明,在这种情况下选择最具体的一个。

所以回答你的问题。当多个重载方法适用于特定类型时,将调用最具体的或“向上转换”的方法(如果需要)。


从直观的角度来看,这也是有道理的。当您声明:

public void handler(MyException ex) {...}

你在说:“我知道如何处理将军MyException”。

当您声明时:

public void handler(MyUrgentException ex){...}

您是在说:“我知道如何处理 a 的特定情况MyUrgentException”,因此也知道如何处理 a 的一般情况MyException

于 2011-07-08T09:32:49.240 回答