こんにちは!ISAMU(@burlesca_isa)です!
今回の対象読者は
- javaのオーバーライドについて知りたい方
この記事を読むと
javaのオーバーライドの書き方や注意点
が分かります。
オーバーライドとは?
スーパークラス(親クラス)のメンバメソッドをサブクラス(子クラス)側で同じ名前のメソッドを再定義することです。
メンバメソッドを上書きするとも捉えることができます。
スーパークラスで定義したメンバメソッドの処理の目的は一緒だけど処理内容を変えたい場合に
オーバーライドを使用します。
例えば、出力の文言を少しだけ変えたい場合などです。
サブクラスがインスタンス化されて、
オーバーライドされたメソッドを呼び出した場合、
サブクラスのオーバーライドされたメソッドが優先的に呼び出されます。
オーバーライドの条件
オーバーライドを行うには条件があります。
- メソッド名、引数リストが同じである
- 戻り値はスーパークラスで定義したメソッドが返す型と同じ
- アクセス修飾子がスーパークラスと同じか広い修飾子を使用する
サンプルプログラム
スーパークラスとサブクラスのメソッドの名前や引数、アクセス修飾子が一緒です。
条件にもある通り、名前や引数が違うとオーバーライドにはなりません。
スーパークラスのメソッドのアクセス修飾子はデフォルト(package private)です。
サブクラスのアクセス修飾子はデフォルトより広い「public、protected」を付けることが可能ですが、
privateにすると範囲が狭くなるのでエラーになります。
オーバーライドの禁止
オーバーライドを禁止するにはfinal修飾子を使用します。
構文
[アクセス修飾子] final 戻り値型 メソッド名(引数リスト){};
サンプルプログラム
12行目でfinalを使用しているので、
サブクラスではfinalがついたメソッドはオーバーライドできません。
そのため、19行目のオーバーライドはエラーになります。
オーバーライドとObjectクラス
独自クラスを定義する際にextendsを使用しない場合、
暗黙的にjava.lang.Objectクラスがスーパークラスとなります。
独自クラスではjava.lang.Objectクラスが継承されるため、
Objectクラスのメソッドが使用できます。
注意したいObjectクラスのメソッド
Objectクラスにはいくつかメソッドがありますが、
注意したいメソッドが存在します。
- toStringメソッド
- equalsメソッド
です。
Objectクラスのequalsメソッド
使用する際に注意したいのが、Stringメソッドのequalsメソッドとは処理が違うことです。
- Objectクラスのequalsメソッドは同じ参照かどうかを比較します。
- Stringクラスのequalsメソッドは同じ値かどうかを比較します。
Stringクラスのequalsは
Stringクラス内でObjectクラスのequalsメソッドをオーバーライドしています。
そのため、独自クラスでequalsを使用した時に、Stringクラスのように値を比較するメソッドであると考えてしまうと、意図した結果を得ることができません。
サンプルプログラム
StringBuilderクラスのequalsはObjectクラスのequalsを呼び出します。
Objectクラスのequalsは参照値の比較です。
そのため、sb1とsb2は格納されている文字列は「test」ですので一致しますが、
参照値が違うためfalseと表示されます。
StringBuilderで値の比較を行うにはString型に変換してからequalsメソッドを呼び出します。
10行目で
sb1.toString().equals();
と記載しています。
これはsb1をtoString()を使用してString型にしています。
String型になったsb1からequalsメソッドを呼び出しています。
ObjectクラスのtoStringメソッド
ObjectクラスのtoStringメソッドは、
「パッケージ名.クラス名@ハッシュコード」が出力されます。
独自クラスを作成した場合、toStringメソッドはオーバーライドされていないため、
使用した場合は、
testproject.ToStr@70dea4e
のように出力されます。
この出力結果は役に立たないため、
toStringメソッドをオーバーライドすることで、意図した出力にすることが可能です。
サンプルプログラム
サンプルプログラムではtoStringメソッドのオーバーライドはコメントアウトしています。
オーバーライドを確かめるにはコメントを外してください。
メンバ変数を出力するようにオーバーライドしています。