継承ツリー上でのオーバーロード
同じ継承ツリー上であれば、サブクラスはスーパークラスのメソッドをオーバーロードできる。
サブクラスでのオーバーロード
- サブクラスはスーパークラスのメソッドをオーバーロードできる
- 引数の構成を変えることでオーバーロードになる
- 引数の構成が同じなら別の意味になる
- 戻り値型を変えることが出来る
- アクセス修飾子は自由に変えることが出来る
オーバライド
スーパークラスとサブクラスで名前が同じかつ引数構成も全く同じメソッドを作成した場合、それをオーバライド(再定義)と呼ぶ
元のメソッドは内部的に破棄されて使えなくなる。
元のメソッドは内部的に破棄されて使えなくなる。
オーバライドの規則
- 引数の構成が全く同じでなければならない
- 戻り値は同じでなければならない
- アクセス修飾子はよりゆるいレベルにのみ変更できる(厳しいレベルには変更できない)
- 継承したメソッドだけをオーバライドできる
オーバライドの規則
- 引数の構成を変えてはならない
- 戻り値型を変えてはならない
- アクセス修飾子はゆるいレベルにのみ変更できる
- 継承したメソッドだけをオーバライドできる
共変戻り値
オーバライドでは戻り値を変えることは出来ない。ただし、クラス型の参照を返すメソッドだけは、戻り値型をサブクラスに変更できる
変数のクラス型で使えるメンバが決まる
- オブジェクトが何型であっても、どのメンバにアクセス出来るかは変数のクラス型によって決定される
オブジェクトの型で起動するオーバライドメソッドが決まる
- 変数のクラス型とは無関係
- オブジェクトの型を知るにはそれをしるにはそれを作成したnew演算子に注目する
多態性(ポリモーフィズム)
オーバライドはスーパークラスのメソッドを上書きし、そのクラス独自のメソッドに再定義する。その結果、オーバライドメソッドは実行するオブジェクトがスーパークラスのオブジェクトなのか、サブクラスのオブジェクトなのかで違う働きをする。これを多態性という。
同じメソッドでもオブジェクトによって異なる働きをすること
同じメソッドでもオブジェクトによって異なる働きをすること
隠蔽と再利用
サブクラスで同じ名前のフィールドを定義した場合の原則
- 変数のクラス型でアクセスできるフィールドが決まる
- サブクラスではサブクラスのフィールドが優先される
- スーパークラスのフィールドをアクセスするにはsuperキーワードを使う