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

同様の質問については、回答を参照してください。

JLS15.12.2を参照してください。

[...]そのようなメソッド宣言が複数存在する場合があります。その場合、最も具体的なものが選択されます。

だからあなたの質問に答えるために。いくつかのオーバーロードされたメソッドが特定のタイプに適用できる場合、最も具体的な、または必要に応じて「アップキャスト」されたメソッドが呼び出されます。


直感的な観点からも、これは理にかなっています。あなたが宣言するとき:

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

あなたは言っている:「私は将軍の扱い方を知っているMyException」。

そして、あなたが宣言しているとき:

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

あなたは次のように言っています:「私はaの特定のケースを処理する方法を知っています。MyUrgentExceptionしたがって、。の一般的なケースも知っていMyExceptionます。

于 2011-07-08T09:32:49.240 に答える