プライマリ(データ)タイプのリロード

13933 ワード

テスト1:
伝達パラメータはint型の定数である.
public class Test {
	public static void main(String[] args) {
		testConstValue();
	}
	
	public static void testConstValue() {
		print("testing with 5");
		function1(5);
		function2(5);
		function3(5);
		function4(5);
		function5(5);
		function6(5);
		function7(5);
	}
	
	
	//
	public static void print(String s) {
		System.out.println(s);
	}
	
	
	//
	public static void function1(char x) {
		print("function1(char)");
	}
	
	public static void function1(byte x) {
		print("function1(byte)");
	}
	
	public static void function1(short x) {
		print("function1(short)");
	}
	
	public static void function1(int x) {
		print("function1(int)");
	}
	
	public static void function1(long x) {
		print("function1(long)");
	}
	
	public static void function1(float x) {
		print("function1(float)");
	}
	
	public static void function1(double x) {
		print("function1(double)");
	}
	
	
	//	
	public static void function2(byte x) {
		print("function2(byte)");
	}
	
	public static void function2(short x) {
		print("function2(short)");
	}
	
	public static void function2(int x) {
		print("function2(int)");
	}
	
	public static void function2(long x) {
		print("function2(long)");
	}
	
	public static void function2(float x) {
		print("function2(float)");
	}
	
	public static void function2(double x) {
		print("function2(double)");
	}
	
	
	//
	public static void function3(short x) {
		print("function3(short)");
	}
	
	public static void function3(int x) {
		print("function3(int)");
	}
	
	public static void function3(long x) {
		print("function3(long)");
	}
	
	public static void function3(float x) {
		print("function3(float)");
	}
	
	public static void function3(double x) {
		print("function3(double)");
	}
	
	
	//
	public static void function4(int x) {
		print("function4(int)");
	}
	
	public static void function4(long x) {
		print("function4(long)");
	}
	
	public static void function4(float x) {
		print("function4(float)");
	}
	
	public static void function4(double x) {
		print("function4(double)");
	}
	
	
	//
	public static void function5(long x) {
		print("function5(long)");
	}
	
	public static void function5(float x) {
		print("function5(float)");
	}
	
	public static void function5(double x) {
		print("function5(double)");
	}
	
	
	//
	public static void function6(float x) {
		print("function6(float)");
	}
	
	public static void function6(double x) {
		print("function6(double)");
	}
	
	//
	public static void function7(double x) {
		print("function7(double)");
	}
}

印刷結果:
testing with t function 1(int)function 2(int)function 3(int)function 4(int)function 5(long)function 6(float)function 7(double)印刷結果に基づいて分析する:funtion 1()からfunction 4()までint型データを受信できるため、int型データを渡すと対応するパラメータリストがint型の方法が呼び出される. 
function 5()を分析すると、long、float、doubleタイプのデータしか受け入れられない.すなわちfunction 5()メソッドに伝達するデータ型がintの場合、実際には呼び出しを受け入れる方法がない、このときコンパイラはfunction 5()メソッドに伝達するint型データをタイプアップする.果たしてlongに昇格したのか.float? double??結果から分かるように、複数のタイプが昇格可能であれば、最小のタイプに昇格する.したがって、印刷結果はfunction 5(long)、すなわちfunction(long x)という方法が呼び出される.実際にはfunction 6()を解析する方法でも分かるように、function 6()の方法はfloat,doubleタイプのデータを受け入れることができ、floatはdoubleより小さいので、最終的にint型のデータをfloat型に昇格する.function 6(float x)メソッドが呼び出されます..function 7()メソッドはdoubleタイプのデータを受け入れる方法である.だからintタイプのデータは最後にdoubleタイプに昇格しました..個人分析コンパイラの目的は、主(データ)タイプがタイプアップすると、値の大きさが変化しないが、メモリ領域が大きくなるため、スペースを節約し、効率を向上させることである.
 
 
テスト2:
伝達パラメータはcharタイプです.
public class Test {
	public static void main(String[] args) {
		testChar();
	}
	
	public static void testChar() {
		char x = 'X';
		print("testing with char");
		function1(x);
		function2(x);
		function3(x);
		function4(x);
		function5(x);
		function6(x);
		function7(x);
	}
	
	
	//
	public static void print(String s) {
		System.out.println(s);
	}
	
	
	//
	public static void function1(char x) {
		print("function1(char)");
	}
	
	public static void function1(byte x) {
		print("function1(byte)");
	}
	
	public static void function1(short x) {
		print("function1(short)");
	}
	
	public static void function1(int x) {
		print("function1(int)");
	}
	
	public static void function1(long x) {
		print("function1(long)");
	}
	
	public static void function1(float x) {
		print("function1(float)");
	}
	
	public static void function1(double x) {
		print("function1(double)");
	}
	
	
	//	
	public static void function2(byte x) {
		print("function2(byte)");
	}
	
	public static void function2(short x) {
		print("function2(short)");
	}
	
	public static void function2(int x) {
		print("function2(int)");
	}
	
	public static void function2(long x) {
		print("function2(long)");
	}
	
	public static void function2(float x) {
		print("function2(float)");
	}
	
	public static void function2(double x) {
		print("function2(double)");
	}
	
	
	//
	public static void function3(short x) {
		print("function3(short)");
	}
	
	public static void function3(int x) {
		print("function3(int)");
	}
	
	public static void function3(long x) {
		print("function3(long)");
	}
	
	public static void function3(float x) {
		print("function3(float)");
	}
	
	public static void function3(double x) {
		print("function3(double)");
	}
	
	
	//
	public static void function4(int x) {
		print("function4(int)");
	}
	
	public static void function4(long x) {
		print("function4(long)");
	}
	
	public static void function4(float x) {
		print("function4(float)");
	}
	
	public static void function4(double x) {
		print("function4(double)");
	}
	
	
	//
	public static void function5(long x) {
		print("function5(long)");
	}
	
	public static void function5(float x) {
		print("function5(float)");
	}
	
	public static void function5(double x) {
		print("function5(double)");
	}
	
	
	//
	public static void function6(float x) {
		print("function6(float)");
	}
	
	public static void function6(double x) {
		print("function6(double)");
	}
	
	//
	public static void function7(double x) {
		print("function7(double)");
	}
}
印刷結果:
testing with char function1(char) function2(int) function3(int) function4(int) function5(long) function6(float) function7(double)
印刷結果分析によると、function 1()にはcharタイプを受け入れる方法があるため、function 1(char x)メソッドが呼び出される.
function 2()メソッドはbyte,short,int,long,float,doubleタイプのパラメータを受け入れ,charタイプを受け入れるメソッドはない.このときcharタイプのデータをint型データに変換する.そこで最終的にfunction 2(int x)という方法が呼び出され、印刷結果はfunction 2(int)である.
function 3()は、function 4()もfunction 2()と同様にcharタイプのデータをintタイプに変換する.
function 5()はlong,float,doubleタイプを受け入れる方法があるのでcharタイプは最後にdoubleタイプに変換されます.
function 6()はfloat,doubleタイプを受け入れる方法のみなのでcharタイプは最後にfloatタイプに変換される.
function 7()はdoubleタイプのみなので、最後にcharタイプをdoubleタイプに変換..
以上より、charタイプのパラメータを渡してプライマリ(データ)タイプのリロード方法を呼び出すと、charタイプはint,long,float,doubleに自動的に変換され、どちらに変換するか、優先順位int>long>float>doubleに変換され、charタイプはbyteとshortタイプに変換されないことに注意する.
テスト3:
伝達パラメータはbyteタイプです.
      
public class Test {
	public static void main(String[] args) {
		testByte();
	}
	
	public static void testByte() {
		byte x = 0;
		print("testing with byte");
		function1(x);
		function2(x);
		function3(x);
		function4(x);
		function5(x);
		function6(x);
		function7(x);
	}
	
	
	//
	public static void print(String s) {
		System.out.println(s);
	}
	
	
	//
	public static void function1(char x) {
		print("function1(char)");
	}
	
	public static void function1(byte x) {
		print("function1(byte)");
	}
	
	public static void function1(short x) {
		print("function1(short)");
	}
	
	public static void function1(int x) {
		print("function1(int)");
	}
	
	public static void function1(long x) {
		print("function1(long)");
	}
	
	public static void function1(float x) {
		print("function1(float)");
	}
	
	public static void function1(double x) {
		print("function1(double)");
	}
	
	
	//	
	public static void function2(byte x) {
		print("function2(byte)");
	}
	
	public static void function2(short x) {
		print("function2(short)");
	}
	
	public static void function2(int x) {
		print("function2(int)");
	}
	
	public static void function2(long x) {
		print("function2(long)");
	}
	
	public static void function2(float x) {
		print("function2(float)");
	}
	
	public static void function2(double x) {
		print("function2(double)");
	}
	
	
	//
	public static void function3(short x) {
		print("function3(short)");
	}
	
	public static void function3(int x) {
		print("function3(int)");
	}
	
	public static void function3(long x) {
		print("function3(long)");
	}
	
	public static void function3(float x) {
		print("function3(float)");
	}
	
	public static void function3(double x) {
		print("function3(double)");
	}
	
	
	//
	public static void function4(int x) {
		print("function4(int)");
	}
	
	public static void function4(long x) {
		print("function4(long)");
	}
	
	public static void function4(float x) {
		print("function4(float)");
	}
	
	public static void function4(double x) {
		print("function4(double)");
	}
	
	
	//
	public static void function5(long x) {
		print("function5(long)");
	}
	
	public static void function5(float x) {
		print("function5(float)");
	}
	
	public static void function5(double x) {
		print("function5(double)");
	}
	
	
	//
	public static void function6(float x) {
		print("function6(float)");
	}
	
	public static void function6(double x) {
		print("function6(double)");
	}
	
	//
	public static void function7(double x) {
		print("function7(double)");
	}
}
印刷結果:
testing with byte function1(byte) function2(byte) function3(short) function4(int) function5(long) function6(float) function7(double)
結果分析:byteタイプのデータを受け入れる方法がある場合、その方法が呼び出される.なければbyteタイプをshort,int,long,float,double,優先順位short>int>long>float>doubleに変換します.
テスト4:
パラメータはshortタイプです.
public class Test {
	public static void main(String[] args) {
		testShort();
	}
	
	public static void testShort() {
		short x = 0;
		print("testing with byte");
		function1(x);
		function2(x);
		function3(x);
		function4(x);
		function5(x);
		function6(x);
		function7(x);
	}
	
	
	//
	public static void print(String s) {
		System.out.println(s);
	}
	
	
	//
	public static void function1(char x) {
		print("function1(char)");
	}
	
	public static void function1(byte x) {
		print("function1(byte)");
	}
	
	public static void function1(short x) {
		print("function1(short)");
	}
	
	public static void function1(int x) {
		print("function1(int)");
	}
	
	public static void function1(long x) {
		print("function1(long)");
	}
	
	public static void function1(float x) {
		print("function1(float)");
	}
	
	public static void function1(double x) {
		print("function1(double)");
	}
	
	
	//	
	public static void function2(byte x) {
		print("function2(byte)");
	}
	
	public static void function2(short x) {
		print("function2(short)");
	}
	
	public static void function2(int x) {
		print("function2(int)");
	}
	
	public static void function2(long x) {
		print("function2(long)");
	}
	
	public static void function2(float x) {
		print("function2(float)");
	}
	
	public static void function2(double x) {
		print("function2(double)");
	}
	
	
	//
	public static void function3(short x) {
		print("function3(short)");
	}
	
	public static void function3(int x) {
		print("function3(int)");
	}
	
	public static void function3(long x) {
		print("function3(long)");
	}
	
	public static void function3(float x) {
		print("function3(float)");
	}
	
	public static void function3(double x) {
		print("function3(double)");
	}
	
	
	//
	public static void function4(int x) {
		print("function4(int)");
	}
	
	public static void function4(long x) {
		print("function4(long)");
	}
	
	public static void function4(float x) {
		print("function4(float)");
	}
	
	public static void function4(double x) {
		print("function4(double)");
	}
	
	
	//
	public static void function5(long x) {
		print("function5(long)");
	}
	
	public static void function5(float x) {
		print("function5(float)");
	}
	
	public static void function5(double x) {
		print("function5(double)");
	}
	
	
	//
	public static void function6(float x) {
		print("function6(float)");
	}
	
	public static void function6(double x) {
		print("function6(double)");
	}
	
	//
	public static void function7(double x) {
		print("function7(double)");
	}
}
印刷結果:
testing with short
function1(short)
function2(short) function3(short) function4(int) function5(long) function6(float) function7(double)
結果分析:伝達パラメータがshortである場合、shortがある場合、shortパラメータタイプを受け入れる方法を調整し、なければshortはint,long,float,doubleタイプに変換する.優先度はint>long>float>double
int,long,float,doubleタイプのデータの後続伝達は、同じ原理です.
int型データを渡し、int型データを受け入れる方法があれば、この方法を優先的に呼び出し、なければintをlong,float,doubleに変換し、優先度はlong>float>doubleである.  
long型データを渡し、呼び出されたメソッドの優先度long>float>double;
floatタイプのデータを渡し、float>double;
doubleタイプのデータを渡すには、doubleタイプのデータを受け入れる方法のみが呼び出される.
呼び出しメソッドが受け入れるパラメータよりも伝達されるパラメータのタイプが大きい場合、コンパイラはエラーを報告します.例えばdoubleタイプのパラメータを渡すfunc 1(int x)というメソッドを呼び出すと、このときintタイプのデータがdoubleタイプのデータを受け入れられないと、必ずエラーが報告される.エラーを報告しないためにはdoubleタイプのパラメータをintタイプに強く変換したり、intタイプより範囲の小さいデータに変換したりすることができますが、精度が失われる可能性があります.