書き込みとアクセス・レベル、例外宣言

1362 ワード

   1. public class Parent{  
   2.     public void output()throws NullPointerException{  
   3.         System.out.println("parent");  
   4.     }  
   5. }  
   6. public class Child{  
   7.     public void output() throws Exception{  
   8.         System.out.println("child");  
   9.     }  
  10. }  
  11. public class OverrideTest {  
  12.     public static void main(String[] args) {  
  13.         Parent p = new Child();  
  14.         p.output();  
  15.          }  
  16. }  
 
質問:上記のプログラムはコンパイルできますか?できない場合は理由を説明してください.コンパイルに合格すれば、実行は成功しますか?実行に成功できない場合は、理由を説明してください.実行に成功すれば、プログラム実行の結果は何ですか?解答:上記のプログラムはコンパイルできません.解析:これはjavaにおけるメソッド書き換えを考察する要件であり,親が投げ出す異常はNullPointerExceptionであり,子が投げ出す異常はExcetpionであり,メソッド書き換えに反し,子が投げ出す異常範囲は親が投げ出す異常の範囲より大きくならないという原則に反しているため,コンパイルは通過できない.まとめ:javaでのメソッド書き換え(override)に関する要件:1、サブクラスでのメソッドと親クラスでのメソッドは同じ戻りタイプ2、子クラスでのメソッドと親クラスでのメソッドは同じメソッド名3、子クラスでのメソッドと親クラスでのメソッドは同じパラメータリスト4、サブクラス内のメソッドのアクセス・レベルは、親のメソッドのアクセス・レベルを下回ることはできません(例:親メソッドのレベルがprotectedである場合、サブクラスはメソッドを書き換えます.そのレベルはprotectedまたはpublicでなければなりません.親のアクセス・レベルと同じまたはそれ以上でなければコンパイルはできません).5、子クラスのメソッドから放出される異常範囲は、親クラスのメソッドから放出される異常の範囲より大きくすることはできません(子クラスは異常を放出せずにもこの原則を満たすことができます.つまり、親クラスは異常を放出せず、子クラスは異常を放出せず、コンパイルは問題ありません.)