≪Java≫ オーバーロードとオーバーライドの違い
■ オーバーロード(多重定義)
・引数の型・並び順・数が違う
・戻り値型を変えることが可能
・アクセス修飾子は自由に変更可
・引数構成を変えて、メソッド(機能)を追加する。
【継承した場合】
・アクセスできる(オブジェクト内の)メンバは、変数のクラス型で決まる。
⇒ クラスが継承で親から A → B → C とあった場合、
オブジェクトを作成する時の変数の型がCであれば、オブジェクト内の全てのメンバが使えるが、
オブジェクトを作成する時の変数の方がAであれば、オブジェクト内の A のメンバしか使えない。
(例)
Aclass a = new Cclass();
↑ 変数の方が A なので、B・C のメンバは使用できない。
■ オーバーライド(再定義)
・引数の型・並び順・数が完全に同じ
・戻り値が同じ
(ただし、参照を返す場合のみ、Java1.5以降は戻り値型を本来のクラスのサブクラスに変更が可能)
※(引数の型・並び順・数が完全に同じで、戻り値が違うと、オーバーロードにもならず、コンパイルエラーになる)
・アクセス修飾子は制限のゆるいレベルにのみ変更可
・継承したメソッドのみオーバーライドできる
( 注意: public や protected 指定のないメソッドは継承されていないので、オーバーライドできない。(オーバーライドしたつもりが、新規メソッド扱いとなる))
・引数構成を変えず、メソッド(機能)を変更する。
【継承した場合】
・アクセスできる(オブジェクト内の)メンバは、変数のクラス型とは無関係。(new演算子のオブジェクトの型で決まる)
⇒ クラスが継承で親から A → B → C とあった場合、
サブクラスである C でメソッドをオーバーライドしていれば、
オブジェクトを作成する時の変数の型が A であろうが C であろうが、new演算子で C のオブジェクトを作成していれば、オーバーライドした C のメソッドが起動する。
(例)
Aclass a = new Cclass();
↑ 変数の方が A だが、new演算子で C のオブジェクトを作成しているので、C のメソッドが起動する。