第9章 オーバーロードとオーバライド (Java)
クラス間でのオーバーロード(多重定義)
- サブクラスはスーパクラスのメソッドをオーバーロードできる。
- 引数の構成(型、順序、数)を変えなければならない。
- 引数の構成(型、順序、数)が同じなら別の意味(オーバーライド)になる。
クラス内でのオーバーロードでは、引数構成を変えないとコンパイルエラーになるが、クラス間でのオーバーロードではコンパイルにならない。
しか、オーバーライドではなく別の意味(オーバライド)になる。 - 継承したメソッドだけをオーバライドできる(privateメソッドに注意)
オーバーライド(再定義)とは
- スーパークラスとサブクラスで名前が同じでかつ引数構成もまったく同じメソッドを作成することである。
- 二つのメソッドは、区別が付かないが、新しく再定義した方のメソッドが常に有効であるため、スーパークラスから継承した古いメソッドは、内部的に破棄され、存在していても有効ではない。
- 引数の構成を変えてはならない。
- 戻り値型を変えてはならない。
- アクセス修飾子はゆるいレベルのみ変更できる。
- 継承したメソッドだけをオーバーライドできる。(privateメソッドに注意)
共変戻り値
- 参照を返すメソッドをオーバーだ緯度する時、戻り値型をサブクラスの型に変えてよい。
- return this; とするとそのオブジェクト自身の参照を返すことができる。
隠ぺいと再使用
- superキーワードを使って、オーバーライドしたスーパークラスのメソッドを利用できる。
変数の型で使えるメンバが決まる。
- ひとつのオブジェクトをいろいろなクラス型で参照できる。
- オブジェクトのどのメンバにアクセスできるかは変数の型による。
- クーパークラスのフィールドと同名のフィールドを定義できる。
- アクセスできるフィールドは変数の型で決まる。
- サブクラスで同名のフィールドを作成するとサブクラス内ではそれが優先される。
- スーパークラスの同名のフィールドをアクセスするにはsuperキーワードを前につける。
オーバーライドメソッドは、オブジェクトの型に依存する。
- 変数のクラス型は変わってもオブジェクトの型は不変である。
- メソッドがオーバーライドされていれば、起動するメソッドは、オブジェクトの型による。
多態性(ポリモーフィズム)
- オーバライドメソッドの場合、同じ名前のメソッドでも、オブジェクトの型によって違う働きをすることを多態性(ポリモーフィズム)という。
- カプセル化、継承、多態性はオブジェクト指向の3大特徴である。