【Java】 オーバーロード・オーバーライドのまとめ
こんにちは。のわです。
今回は、Javaのオーバーライド・オーバーロードについてまとめます。
◇オーバーロード
まずは、オーバーロードからです。
オーバーロードは『類似する複数のメソッドを定義』することです。
オーバーロードの条件は以下になりす。
・シグニチャが異なる
・メソッド名が同じ
※シグニチャとは
・メソッド名
・引数の型
・引数の順番
・引数の数
を組み合わせたものです。
つまり『メソッド名が同じで、引数が異なればオーバーロード』です。
下記の様なコードは適切なオーバーロードになります。
//基準となるコード public void test() { //処理 } //パターン① 引数が異なる public void test(int i, String s) { //処理 } //パターン② ①と引数の順番が異なる public void test(String s, int i) { // 処理 }
パターン①とパターン②は、一見同じようにみえます。
このパターンは、シグニチャが異なる定義の一つである
・引数の順番が違う
に該当します。
そのため、コンパイルエラーになることなく、オーバーロードが可能です。
逆にいうなら、シグニチャ以外の要素はオーバーロードに関係ないことになります。
具体的には
・アクセス修飾子
・戻り値
・static要素
・引数名
これらはオーバーロードには関係ありません。
//基準となるコード public void test(int i, String s) { //処理 } //NGパターン① アクセス修飾子を変更 private void test(int i, String s) { //処理 } //NGパターン② 戻り値を変更 public String test(int i, String s) { // 処理 } //NGパターン③ 引数名を変更 public String test(int i1, String s1) { // 処理 }
上記コードは基準となるコードと同一メソッドと捉えられます。
そのため、コンパイルエラーとなります。
◇オーバーライド
次に、オーバーライドについてです。
オーバーライドは『サブクラスがスーパークラスのメンバを上書き』することです。
オーバーライドの条件は以下になります。
・シグニチャが同じ
・戻り値型が同じ、もしくはサブクラス型
・アクセス修飾子が同じ、もしくはゆるい
・throws宣言は同じ、もしくはサブクラス型
具体例をもとに説明します。
//スーパー(親)クラス public class Sample { protected void test(String str) { //処理 } } //サブ(子)クラス public class SubSample extends Sample{ //パターン① 条件を変更せずオーバーライド protected void test(String str) { //内容 } //パターン② アクセス修飾子をゆるくする public void test(String str) { //内容 } }
パターン②ではアクセス修飾子をゆるくしています。
この変更であればオーバーライドとみなされます。
//スーパー(親)クラス public class Sample { protected void test(String str) { //処理 } } //サブ(子)クラス public class SubSample extends Sample{ //NGパターン① 戻り値を変更 protected String test(String str) { //内容 } //NGパターン② アクセス修飾子が厳しくなる void test(String str) { //内容 } }
NGパターンです。
上記のように条件から外れてしまうとコンパイルエラーとなります。
なお、引数を変えるとオーバーライドではなくなります。
そのとき、オーバーロードの条件を満たしていれば
オーバーロードとして記述することができます。
//スーパー(親)クラス public class Sample { protected void test() { //処理 } } //サブ(子)クラス public class SubSample extends Sample{ //サブクラスでオーバーロード protected void test(String str) { //内容 } }
今回は、オーバーロードとオーバーライドについてまとめてみました。
最後まで読んでいただきありがとうございました!