こんにちは!ISAMU(@burlesca_isa)です!
今回の対象読者は
- オーバーライドについて詳しく学びたい方
- オーバーライドのルールを再確認したい方
オーバライドのルール確認
まず最初にオーバライドのルールを確認しましょう。
- メソッド名、引数リストの数、データ型、順番が全て一致するメソッドをサブクラスで定義すること
- 戻り値・・・スーパークラスで定義したメソッドの返す方と同じかその型のサブクラスであること。
- アクセス修飾子・・・スーパークラスと同じか、公開範囲が広いものであること。
- throws①・・・スーパークラスのメソッドにthrowsが記述されていてもサブクラスではthrowsを記述しなくてもオーバライド可能。
- throws②・・・スーパークラスにRuntimeException以外のException例外クラスが記述されている場合は、
スーパークラスのメソッドのthrowsと同じ例外クラスか、そのサブクラスであること。 - throws③・・・RuntimeExceptionクラスとそのサブクラスは制約なしに記述可能
オーバーライドを禁止する
オーバライドを禁止するにはメソッドにfinal修飾子を付けます。
構文
[アクセス修飾子] final 戻り値の型 メソッド名 (引数リスト){ }
スーパークラスのメソッドを呼び出す
スーパークラスのメソッドを呼び出したい時にはsuperを使用します。
サブクラスでオーバーライドした場合は、
そのメソッドを使用した場合、オーバーライドした子クラスのメソッドが実行されます。
スーパークラスのメソッドを呼び出したい時にsuperを使用します。
ポリモフィズムのオーバーライドメソッドの実行
初心者が忘れやすいのが、
ポリモフィズムでオーバーライドしたメソッドを実行する場合です。
スーパークラスのメソッドをサブクラスでオーバーライドしていれば使用することができます。
図を示します。
Superクラスを継承しているSubクラスがあります。
サブクラスではSuperクラスのmethodAをオーバーライドしています。
Super型の変数にSubクラスインスタンスを代入します。
Super obj = new Sub();
obj.methodA();
SubクラスでオーバーライドしたmethodAが実行されます。
下記のコードを追記してみます。
obj.methodB();
結果はコンパイルエラーになります。
JVMはスーパークラスからmethodBメソッドが存在するかを確認するため、
スーパークラスにメソッドが定義されていない場合はコンパイルエラーになります。
methodBを実行するにはダウンキャストする必要があります。
((Sub)obj).methodB
と記述することで、サブクラスのメソッドを利用することができます。