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