[Java]オブジェクト向けプログラミング-オーバーロード


かふか


メソッドは変数と同様に、異なる名前を持つ必要があるため、同じクラスに異なる名前を持つ必要があります.ただし、1つのクラスに既に使用する名前と同じメソッドがある場合でも、パラメータの数やタイプが異なる場合は、同じ名前で定義できます.1つのクラスで複数の同名メソッドを定義することを、メソッド過負荷Overloadingまたは過負荷Overloadingと呼ぶ.
overloadingは開発者の立場ではメソッド名のタグを考慮させません.パラメータのタイプ、数に応じて異なる名前を付ける必要がある場合は、明確にしなければならない(方法の意図を破壊しない)方法で開発する必要があります.
int addInt(int a, int b);
int addLong(long a, long b);
少なくとも、このメソッドを作成した開発者と、このメソッドを使用している開発者にとって、オーバーロードは魅力的な機能です.
C言語ベースのAPIを閑話で見ると、オーバーロードできないので上記の例のように書いてあります.見直せば誇張の大切さがわかる

かふかじょうけん


同じ名前のメソッドは、次の条件を満たす場合にのみ存在します.
1.メソッド名は同じである必要があります
2.パラメータの個数または種類が異なること
// 이렇게 반환 타입이 동일하고, 
// 인자(Argument) 개수나 타입이 다르면 오버로딩이 성립해요.
public void add(int a, int b);
public void add(int a, int b, int c);
public void add(long a, long b);
上記の条件が成立しない場合、オーバーロードしようとしても、定義を繰り返すコンパイルエラーが発生します.オーバーロード方法はパラメータでしか区別できないため、戻りタイプはオーバーロードの実施に影響しません.
// 반환 타입이 아니라서 둘을 오버로딩 대상이 아니라고 생각해서
// 컴파일 에러 처리되요!
public int add(int a, int b);
public long add(int a, int b, int c);
細部のためにもう少し条件をつける
[条件1]パラメータ名のみが異なる
public int add(int a, int b);
public int add(int x, int y);
変数名のみ異なるパラメータのタイプと個数が一致するため、重複するコードであるため、コンパイルに対してエラー処理を行う.
[条件2]タイプが異なる
public int add(int a, long b);
public int add(long a, int b);
人の字のタイプが違う場合この場合コンパイルは問題ありませんが、使いにくいです.パラメータを送るときは明確な兄宣言が必要です.あいまいな宣言はファジイコードと呼ばれ、コンパイルエラー処理されます.
add(1, 3L);
add(1L, 3);
// add(1, 3);	// Error! 선언이 모호해요
条件3の戻り値が異なる場合
long add(int a, int b):
int add(int a, int b):
戻りタイプが異なるため、2つはオーバーロードオブジェクトではありません.したがってメソッド名は同じで、コンパイルエラー処理を行ってください.
[条件4]正しい例
int add(int a, int b);
int add(long a, long b);
int add(int[] arr);
戻りタイプとパラメータタイプと数の間に明らかな区別がある場合は、通常オーバーロードされます.

可変パラメータと過負荷


JDK 1.5バージョンからメソッドのパラメータを動的に指定できます.この機能を可変因子varargsと呼ぶ.宣言形式は{타입}... 변수명.この場合、可変パラメータは常にパラメータで最後に宣言する必要があります.コンパイルエラーが発生します.可変因子かどうかを区別できないからです.
// int add(int a);
// int add(int a, int b);
//int add(int a, int c);	// 요것들을...
int add(int... args); 	// 이거 하나로 대체!
// int add();				// 가변인자는 매개변수가 0개인 것도 대체해요
// int add(int... args, var sth); // Error!
可変パラメータは、複数のパラメータを初期化するだけでなく、アレイにも初期化できます.
int add(int[] a);
int add(int... a);
では、二人の違いは何でしょうか.配列がパラメータである場合は、パラメータが不要であっても、パラメータを常に明示的に宣言する必要があります.しかし,先ほど述べたように,変数はパラメータなしでも扱うので不要である.
add(null); add(new int[]{}); 	// 배열 매개변수는 반드시 명시해줘야 해요
add();							// 가변인자 매개변수는 이것도 성립해요!
また、これは私が発見したばかりの事実で、単一の変数と配列変数を混合して使用すると、コンパイルエラーが発生します.
// 컴파일 에러!
// 도중에 배열 -> 단일 변수 안됨 
System.out.println(concatenate(",", new String[] {"1"}, "100"));
// 도중에 단일 변수 -> 배열 안됨
System.out.println(concatenate(",", "100", new String[] {"1"}));
そしてこれもダメ
// 컴파일 에러!
System.out.println(concatenate(",", {"1"}));
最後に、可変パラメータは再帰呼び出しでは使用できません.ある角度から見ると、2つのロード方法がありますが、この2つの方法は区別できないため、コンパイルエラーが発生します.したがって、可変因子の過負荷をできるだけ避ける.
// 컴파일 에러!
public void concatenate(String... args){
	return concatenate(args);
}