深さ解析Java可変パラメータタイプと配列との違い

3822 ワード

この文章は主にJavaの方法の可変パラメータのタイプを紹介して、実例を通じてJavaの中の可変パラメータのタイプに対して比較的に深い分析を行って、必要な友达は参考にすることができます.
Javaメソッドにおける可変パラメータタイプは非常に重要な概念であり,非常に広範な応用がある.本稿では,これを実例形式で解析する.具体的には以下の通りです.
一般的に、多くのJava初心者は次のコードを見たとき、dealArrayメソッドの3つの小さな点は何ですか?
public class TestVarArgus {

	public static void dealArray(int... intArray) {

	}

	public static void main(String args[]) {

	}
}

これが本明細書で論じる問題である:可変パラメータタイプ、不定パラメータタイプとも呼ばれる.英語の略称はvarargusで、元に戻すとvariable argument typeです.その名前から直接分かるように,この方法はパラメータを受信する際に個数が不定である.では、まずこの方法を呼び出します.コードと出力を参照してください.
public class TestVarArgus {
	public static void dealArray(int... intArray) {
		for (int i : intArray)
			System.out.print(i + " ");

		System.out.println();
	}

	public static void main(String args[]) {
		dealArray();
		dealArray(1);
		dealArray(1, 2, 3);
	}
}

?
出力:
1    1 2 3  
mainメソッドの呼び出しにより,この可変パラメータはパラメータ(空のパラメータ)がなくてもよいし,不定長であってもよいことがわかる.ここを見ても分かるように、この不定長のパラメータは実は配列パラメータに似ています.実は、確かにそうです.コンパイラは、この最後のパラメータをこっそり配列パラメータに変換し、コンパイルされたclassファイルに記号を付けて、実パラメータの個数が可変な方法であることを示します.コードを参照:
dealArray();//dealArray(int[] intArray{}); 
dealArray(1);//dealArray(int[] intArray{1}); 
dealArray(1,2,3);//dealArray(int[] intArray{1, 2, 3}); 

?
ここまで言うと、この可変パラメータが配列クラスパラメータであるかどうかを検証してみましょう.コードを見てください:
public class TestVarArgus {
	public static void dealArray(int... intArray) {
		for (int i : intArray)
			System.out.print(i + " ");

		System.out.println();
	}

	public static void dealArray(int[] intArray) {
		//   Duplicate method dealArray(int[]) in type TestVarArgus   
		for (int i : intArray)
			System.out.print(i + " ");

		System.out.println();
	}

	public static void main(String args[]) {
		dealArray();
		dealArray(1);
		dealArray(1, 2, 3);
	}
}

?
上のコードから分かるように、この2つの方法は衝突しており、再ロードできません.ここで興味深い実験をしてみましょう
コード1:
public class TestVarArgus {
	public static void dealArray(int... intArray) {
		for (int i : intArray)
			System.out.print(i + " ");

		System.out.println();
	}

	public static void main(String args[]) {
		int[] intArray = { 1, 2, 3 };

		dealArray(intArray);//     ,    
	}
}

?
コード2:
public class TestVarArgus {
	public static void dealArray(int[] intArray) {
		for (int i : intArray)
			System.out.print(i + " ");

		System.out.println();
	}

	public static void main(String args[]) {
		dealArray(1, 2, 3);//     
	}
}

?
上記の2つのコードから,可変パラメータは配列クラスパラメータに互換性があるが,配列クラスパラメータは可変パラメータに互換性がないことがわかる.実際には、2番目のセグメントコードでは、コンパイラは可変を知らないので、dealArray(int,int,int)クラスを定義する方法が必要です.したがって,配列クラスパラメータのdealArrayメソッドをマッチングすることは自然に不可能である.
Javaメソッドが可変パラメータを受信する以上、次のコードを見てみましょう.
public class TestVarArgus {
	public static void dealArray(int count, int... intArray) {

	}

	public static void dealArray(int... intArray, int count) {
		//     ,                   

	}

	public static void main(String args[]) {

	}
}

?
このコードは、可変パラメータタイプがパラメータリストの最後の項目として使用され、定長パラメータの前に置くことができないことを示しています.「優先順位」という言葉が思い浮かぶと思います.正確な説明はありませんが、このような規定だけなので、ここでは「優先度」という言葉を借りて理解することができます.次のコードを見てください.
public class TestVarArgus {
	public static void dealArray(int... intArray) {
		System.out.println("1");
	}

	public static void dealArray(int count, int count2) {
		System.out.println("2");
	}

	public static void main(String args[]) {
		dealArray(1, 2);
	}
}

?
コードが貼られていると、1ではなく2が出力されていることがわかります.ここでは、一定の長さのメソッドをマッチングできる場合は、このメソッドを優先的にマッチングすることを覚えておく必要があります.不定パラメータを含むそのリロード方法は最後に選択された.
最後にmainメソッドのパラメータが配列タイプであることはよく知られていますが、不定パラメータタイプに変更することもできます.コンパイルエラーがあるかどうか試してみましょう.
本文で述べたJavaプログラム設計の学習には一定の参考価値があると信じています.
原文住所:http://www.jb51.net/article/55397.htm