Java-overriding
提供:Dev Guides
Java-オーバーライド
前の章では、スーパークラスとサブクラスについて説明しました。 クラスがそのスーパークラスからメソッドを継承する場合、そのメソッドがfinalとしてマークされていない限り、メソッドをオーバーライドする可能性があります。
オーバーライドの利点は、サブクラスタイプに固有の動作を定義できることです。つまり、サブクラスは要件に基づいて親クラスメソッドを実装できます。
オブジェクト指向の用語では、オーバーライドとは、既存のメソッドの機能をオーバーライドすることを意味します。
例
例を見てみましょう。
これは、次の結果を生成します-
出力
上記の例では、 b はAnimalのタイプですが、Dogクラスのmoveメソッドを実行していることがわかります。 その理由は次のとおりです。コンパイル時に、参照型に対してチェックが行われます。 ただし、ランタイムでは、JVMはオブジェクトタイプを特定し、その特定のオブジェクトに属するメソッドを実行します。
したがって、上記の例では、Animalクラスにはメソッドmoveがあるため、プログラムは適切にコンパイルされます。 次に、実行時に、そのオブジェクトに固有のメソッドを実行します。
次の例を考慮してください-
例
これは、次の結果を生成します-
出力
bの参照型Animalにはbarkという名前のメソッドがないため、このプログラムはコンパイル時エラーをスローします。
メソッドのオーバーライドのルール
- 引数リストは、オーバーライドされたメソッドのリストとまったく同じでなければなりません。
- 戻り値の型は、スーパークラスの元のオーバーライドされたメソッドで宣言された戻り値の型と同じか、サブタイプでなければなりません。
- アクセスレベルは、オーバーライドされたメソッドのアクセスレベルよりも制限することはできません。 たとえば、スーパークラスメソッドがパブリックとして宣言されている場合、サブクラスのオーバーライドメソッドはプライベートまたは保護されません。
- インスタンスメソッドは、サブクラスによって継承される場合にのみオーバーライドできます。
- finalとして宣言されたメソッドはオーバーライドできません。
- staticと宣言されたメソッドはオーバーライドできませんが、再宣言できます。
- メソッドを継承できない場合は、オーバーライドできません。
- インスタンスのスーパークラスと同じパッケージ内のサブクラスは、privateまたはfinalとして宣言されていないスーパークラスメソッドをオーバーライドできます。
- 別のパッケージのサブクラスは、publicまたはprotectedとして宣言された非最終メソッドのみをオーバーライドできます。
- オーバーライドされたメソッドは、オーバーライドされたメソッドが例外をスローするかどうかに関係なく、チェック解除例外をスローできます。 ただし、オーバーライドするメソッドは、オーバーライドされたメソッドによって宣言されたものよりも新しい、または広範なチェック済み例外をスローしないでください。 オーバーライドするメソッドは、オーバーライドするメソッドよりも狭い、または少ない例外をスローできます。
- コンストラクターはオーバーライドできません。
superキーワードの使用
オーバーライドされたメソッドのスーパークラスバージョンを呼び出す場合、 super キーワードが使用されます。
例
これは、次の結果を生成します-