JAVAでコーディングする際に何度も目にするオーバーライド。なんとなく分かってはいるものの自分でうまく説明できないということに気づききちんと調べて書き起こしてみようと思います。
オーバーライド
スーパークラスで定義されたメソッドをサブクラスで再び定義し直すこと
なるほど。。。スーパークラス(クラスを派生させるクラス、親クラス)で定義されたメソッドをサブクラス(派生したクラス、子クラス)で定義し直すことで動作の上書きができる。具体例を下にあげます。
class SuperClass{ public void methodA(int x){ //エラーを検出する処理 } } class SubClass extends SuperClass{ public void methodA(int x){ //エラーを検出する処理 //検出されたエラーを送信する処理 } }
ちなみにオーバーライドが適用されるのは privateアクセスレベル以外のインスタンスメソッドです。クラス間をまたぐ概念なので。
オーバーライドを定義するときには幾つかのルールがあります。
- オーバーライドする側はオーバーライドされる側と戻り型、インスタンスメソッド名、引数型、引数の数が同じでなければなりません。どれか一つでも異なる場合はオーバーライドとは見なされません。
- オーバーライドされる側のインスタンスメソッドに指定されるアクセスレベルより厳しい制限を持つアクセスレベルをオーバーライドする側のインスタンスメソッドに付与することはできません。例えばオーバーライドされる側のインスタンスメソッドにprotectedが指定されている場合、オーバーライドする側のインスタンスメソッドにprivateを指定することはできません。
- オーバーライドされる側のインスタンスメソッドに指定されるthrows節以外の例外をオーバーライドする側のインスタンスメソッドに指定することはできません。但し、オーバーライドされる側に指定された例外をより限定する例外をオーバーライドする側に指定することはできます。
- オーバーライドされる側のインスタンスメソッドにfinal修飾子が付与されている場合、そのインスタンスメソッドをオーバーライドすることはできません。
- オーバーライドされる側のインスタンスメソッドにabstract修飾子が付与されている場合、そのメソッドはサブクラスで必ずオーバーライドしなければなりません。オーバーライドしない場合はそのサブクラス全体がabstractクラスになります。
いくつか知らない決まりごとがありました。理解できた!と思っても調べてみるとまだまだ分からないことばかりで奥が深いというか深みにはまっていくというか・・・