0

メソッドをオーバーライドする場合、タイプの代わりにオブジェクトがチェックされることを理解しています

class SuperException extends Exception {}
class SubException extends SuperException {}

class AnotherException extends Exception {}
class YetAnotherException extends Exception {}

class A {
  void play() throws SuperException, AnotherException {}
}
class Reduced extends A {
  void play() throws SuperException {} 
}
class Eliminated extends A {
  void play() {} 
}
class Narrower extends A {
  void play() throws SubException {}
}
class TestPolymorphism {
  public static void main(String[] args) {
    A obj = new Eliminated();
    obj.play();                         // Doubt 1
    Eliminated eobj = new Eliminated(); // Doubt 2
  }
}

疑問 1: なぜ play() はクラス A から参照されるのですか?

疑問 2: なぜコンパイル エラーが発生するのか?

4

4 に答える 4

1
  1. obj は A を拡張した Eliminated 型なので、A 型の変数から参照できます。

  2. スローされる例外をキャッチしないため、コンパイル エラーは obj.play() にあります。obj は型 A として宣言されているため、コンパイラは、スローされる可能性のある 2 種類の例外を処理することを期待しています。実際には、これらの例外が決してスローされないことはわかりません。obj を Eliminated として宣言すると、エラーは消えます。

于 2013-03-24T13:51:12.140 に答える
1

疑問 1 への回答: 型 A の参照があるため、コンパイラは型参照のメソッド、つまりクラス A の play() メソッドを参照します。実行時に実際のメソッドに解決されます。つまり、クラスは削除されます。

疑問 2 : Play メソッドはチェック例外をスローするため、呼び出し元のメソッドで処理する必要があります。ここでは例外をスローするAクラスのplay()メソッドが参照されているので、それを処理する必要があります。

于 2013-03-24T13:57:29.617 に答える
1

A はスーパー クラスであるため、任意のレベルのサブ クラス オブジェクトを参照できます。指定した「Eliminated」クラスのメソッドが呼び出されます。

行を public static void main(String[] args) から public static void main(String[] args) に更新すると、SuperException がスローされます。例外は play メソッド自体によってスローされるため、AnotherException によって例外が排除されます。または、コンパイル時にコンパイラによってチェックされる例外がチェックされるため、メインメソッドでキャッチを試行する必要があります。

于 2013-03-24T13:59:04.100 に答える
0

メソッド呼び出しの実行時評価

実行時のメソッド呼び出しには 5 つのステップが必要です。第1に、ターゲット基準が計算され得る。次に、引数式が評価されます。3 番目に、呼び出されるメソッドのアクセシビリティがチェックされます。4 番目に、実行されるメソッドの実際のコードが配置されます。5 番目に、新しいアクティベーション フレームが作成され、必要に応じて同期が実行され、制御がメソッド コードに渡されます。

于 2013-03-24T13:50:35.617 に答える