【Java】 オーバーロード・オーバーライドのまとめ

f:id:nowa0402:20210605195923p:plain
こんにちは。のわです。
今回は、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) {
        //内容
    }
    
}


今回は、オーバーロードとオーバーライドについてまとめてみました。
最後まで読んでいただきありがとうございました!