【はじめてのJava】メソッドのオーバーライド(上書き)【クラスの継承編】
はじめてのJava
このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。
クラスの継承編
クラスの継承編では、Javaを扱う上で重要な「クラスの継承」について扱っていきます。
前回は子クラス独自のフィールドとメソッドを実装しました。
今回は子クラスの「accell()メソッド」を上書き(オーバーライド)について扱います。
目次
継承されたメソッドの上書き
前回、Carクラスを継承したPoliceCarクラスを作成しました。
PoliceCarクラスはCarクラスを基にして作成されているため、accell()の動作はCarクラスと同じです。
では「犯人追跡中の加速を10ではなく20にしたい」場合、どうすればよいでしょうか。
方法1:新しくメソッドを作る
まず思いつく方法としては、新しく犯人追跡用のメソッドを準備してそちらを使う方法が考えられます。
この時の注意点としては「同じ名前のメソッドを2つ作成することができない点」です。
大した問題ではないように思えるかもしれません。しかし、この点は問題になります。
問題点
新しく名前を変えて「犯人追跡用のアクセル」を作った場合は、実際にアクセルを踏むときに「今は平常時だから普通のアクセルを使う」「今は犯人追跡中だから犯人追跡用のアクセルを使う」という使い分けが必要になります。
そのうち、「犯人追跡中に普通のアクセルを使ってしまい逃げられた」となってもおかしくありません。
方法2:メソッドを上書きする
ここはやはり、「アクセルは1つで、犯人追跡中だったら通常時よりも多く加速する」という方が、操作性が良さそうです。
既存のaccell()メソッドを改造できれば、操作性は何ら変わらずに今までと同じ方法でアクセルを使い続けることができます。
しかし、そんなことはできるのでしょうか。
オーバーライド
実は、Javaでは親クラスのメソッドを子クラス内で上書きして利用することができます。
子クラス内で親クラスのメソッドを上書きすることを メソッドのオーバーライド と言います。
この方法を使えばCarクラスとPoliceCarクラスで同じaccell()というメソッド名のまま、動作を変更することが可能です。
コラム:オーバーロードとオーバーライド
以前、よく似た言葉でメソッドのオーバーロードを扱いました。
この2つの言葉はどちらもメソッドに関する言葉ですが、全く異なるものです。
オーバーロード は同一のメソッド名で引数が異なるメソッドを複数定義することです。今回扱う オーバーライド は子クラス内で親クラスで定義されたメソッドを書き換えて利用することです。
ややこしいかもしれませんが、間違えないように注意してください。
オーバーライドの方法
オーバーライドは親クラスとメソッド名、引数のデータ型が一致し、戻り値のデータ型が共変である必要があります。
また、別の記事でも説明しますが、アクセス修飾子についても制限がかかります。
戻り値については「基本データ型であれば親クラスと同じデータ型」である必要があります。
共変については、今はいったん深追いせず「同じデータがなら問題ない」という認識でOKです。
※共変の説明のためにはクラスの継承についてもう少し詳しくなる必要があります。
まとめ
親クラスのメソッドを子クラス内で書き換えて利用することをオーバーライドという
オーバーライドするためには、元のメソッドと「同じメソッド名」「同じ引数のデータ型」「共変な戻り値のデータ型」である必要がある
元のメソッドのアクセス修飾子に応じてオーバーライドする際のアクセス修飾子に制限がかかる
次回
次回はPoliceCarクラスのaccell()メソッドを実際にオーバーライドします。
はじめてのJavaシリーズの目次はこちら
クラスの継承編はこちら