使用null调用函数时自动向上转换

时间:2011-07-08 09:21:27

标签: java upcasting

此代码打印出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);
  }
}

1 个答案:

答案 0 :(得分:3)

请参阅answer了解similar question

请参阅JLS 15.12.2

  

[...]可能有多个此类方法声明,在这种情况下,选择最具体的声明。

所以回答你的问题。当多个重载方法适用于特定类型时,如果需要,可以使用最具体的方法或“upcast”方法。


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

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

你说:“我知道如何处理一般MyException”。

当你宣布:

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

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