Javaの伝達値

3755 ワード

この問題にはこれまで誤解があった.本質的な原因は、本を書く人が「伝引用」という概念を使うのが好きで、Java伝値の本質を混同しているからだ.
 
Javaでのパラメータの伝達は、値伝達のみです.まず,一般変数と参照変数を明らかにしなければならない.
 
≪一般変数|General Variables|emdw≫:メモリ・ユニットには値自体が格納されます.int値のように、メモリ値は自分の値にすぎません.
参照変数:メモリユニットに格納されているのは、メモリのアドレスです.その概念はポインタと同じである.
 
Javaが関数を呼び出して値を渡すとき,関数外変数は常に自分の値を関数のパラメータ変数に与える.パラメータ変数と関数外変数はメモリユニットのアドレスが異なり、2つは異なることに注意してください.
 
関数外変数は関数パラメータに伝達され、関数パラメータの値は変化し、関数外部変数の値に影響しない.
public class StringArg {
	//Java         。
	
	public static String cao ="cao!";
	public static MyFinal final1 = new MyFinal();
	public static MyUnFinal final2 = new MyUnFinal();
	public static int int1 = 1;
	
	public static void m1(String arg){
		System.out.println("m1    ,     :"+arg);
		arg = "123";
		System.out.println("m1    ,     :"+arg);
	}
	
	public static void m2(MyFinal arg){
		System.out.println("m2    ,     :"+arg.toString());
		arg = new MyFinal();
		System.out.println("m2    ,     :"+arg.toString());
	}
	
	public static void m3(MyUnFinal arg){
		System.out.println("m3    ,     :"+arg.toString());
		arg = new MyUnFinal();
		System.out.println("m3    ,     :"+arg.toString());
	}
	
	public static void m4(int arg){
		System.out.println("m4    ,     :"+arg);
		arg = 2;
		System.out.println("m4    ,     :"+arg);
	}
	
	public static void main(String[] args) {
		m1(cao);
		System.out.println("main     m1        :"+cao);
		System.out.println();
		
		m2(final1);
		System.out.println("main     m2        :"+final1);
		System.out.println();
		
		m3(final2);
		System.out.println("main     m3        :"+final2);
		System.out.println();
		
		m4(int1);
		System.out.println("main     m4        :"+int1);
		System.out.println();
	}
}


final class MyFinal{}

class MyUnFinal{}

 以上のコード出力の結果は次のとおりです.
m1    ,     :cao!
m1    ,     :123
main     m1        :cao!

m2    ,     :MyFinal@61de33
m2    ,     :MyFinal@14318bb
main     m2        :MyFinal@61de33

m3    ,     :MyUnFinal@ca0b6
m3    ,     :MyUnFinal@10b30a7
main     m3        :MyUnFinal@ca0b6

m4    ,     :1
m4    ,     :2
main     m4        :1

 
関数メソッドが関数外部変数の値に影響しないことがわかります.
説明:
1、m 1(String arg)文字列パラメータ伝達の問題に対して、この問題は非常に古典的である.面接によく出ます.
2、m 2()およびm 3()メソッドでは、パラメータは関数内部に新しいメモリアドレス、すなわち関数のパラメータに新しい値を再割り当てする.ただし、外部変数の値は変化しません.
 
これまで以上の問題を次の例と混同していた.
public class StringArg {
	
	public static MyObject myObject = new MyObject("cao!");
	
	public static void m5(MyObject arg){
		System.out.println("m5    ,     :"+arg.name);
		arg.name = "123";
		System.out.println("m5    ,     :"+arg.name);
	}
	
	
	public static void main(String[] args) {
		m5(myObject);
		System.out.println("main     m5        :"+myObject.name);
		System.out.println();
	}
}


class MyObject{
	public String name = "";
	public MyObject(String name){
		this.name = name;
	}
}

 もちろん出力は次のとおりです.
m5    ,     :cao!
m5    ,     :123
main     m5        :123

 この例では、パラメータ変数は新しいオブジェクトに再バインドされていません.すなわち、新しい値は取得されていません.元の値が指すメモリ領域でオブジェクトを変更します.