此代码打印出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);
}
}
答案 0 :(得分:3)
请参阅answer了解similar question。
请参阅JLS 15.12.2:
[...]可能有多个此类方法声明,在这种情况下,选择最具体的声明。
所以回答你的问题。当多个重载方法适用于特定类型时,如果需要,可以使用最具体的方法或“upcast”方法。
从直观的角度来看,这也是有道理的。当你声明:
public void handler(MyException ex) {...}
你说:“我知道如何处理一般MyException
”。
当你宣布:
public void handler(MyUrgentException ex){...}
您说:“我知道如何处理MyUrgentException
的特定情况,因此也是MyException
的一般情况。