Javaの伝達値
3755 ワード
この問題にはこれまで誤解があった.本質的な原因は、本を書く人が「伝引用」という概念を使うのが好きで、Java伝値の本質を混同しているからだ.
Javaでのパラメータの伝達は、値伝達のみです.まず,一般変数と参照変数を明らかにしなければならない.
≪一般変数|General Variables|emdw≫:メモリ・ユニットには値自体が格納されます.int値のように、メモリ値は自分の値にすぎません.
参照変数:メモリユニットに格納されているのは、メモリのアドレスです.その概念はポインタと同じである.
Javaが関数を呼び出して値を渡すとき,関数外変数は常に自分の値を関数のパラメータ変数に与える.パラメータ変数と関数外変数はメモリユニットのアドレスが異なり、2つは異なることに注意してください.
関数外変数は関数パラメータに伝達され、関数パラメータの値は変化し、関数外部変数の値に影響しない.
以上のコード出力の結果は次のとおりです.
関数メソッドが関数外部変数の値に影響しないことがわかります.
説明:
1、m 1(String arg)文字列パラメータ伝達の問題に対して、この問題は非常に古典的である.面接によく出ます.
2、m 2()およびm 3()メソッドでは、パラメータは関数内部に新しいメモリアドレス、すなわち関数のパラメータに新しい値を再割り当てする.ただし、外部変数の値は変化しません.
これまで以上の問題を次の例と混同していた.
もちろん出力は次のとおりです.
この例では、パラメータ変数は新しいオブジェクトに再バインドされていません.すなわち、新しい値は取得されていません.元の値が指すメモリ領域でオブジェクトを変更します.
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
この例では、パラメータ変数は新しいオブジェクトに再バインドされていません.すなわち、新しい値は取得されていません.元の値が指すメモリ領域でオブジェクトを変更します.