Integerパラメータ伝達の問題
2527 ワード
今日1つのJavaの知识の点を见ます:JAVAの中で8种类の基本的なタイプの伝达のパラメータを除いて値の伝达で、その他の类のオブジェクトの伝达のパラメータはすべて引用の伝达です.
パラメータとしてIntegerを渡すときに引用して渡す.
しかし、テストしてみると、Integerはパラメータとして渡され、戻り値は設定されていないことがわかりました.Inegerの結果は変わらない
テストの結果:5
まず、上記の知識点が正しいかどうかを検証するために、次のコードをテストしました.
結果:
aのアドレス:352359770 iのアドレス:352359770
上記のコードテストにより,Integerパラメータは確かに参照伝達であることが分かった.クエリによって次のことがわかります.
jdk 1.5自動梱包の特性上、実際の状況は実行に等しい i = Integer.valueOf(3);valueOf()メソッドは、入力された数値に基づいて-128-127の間で定数プールからIntegerオブジェクトを取得して返すソースコードを参照します.範囲外でない場合はnew Integer(3)が返されます.
つまりIntegerのアドレスは値の変化によって変化します!
次のテストを行いました.
結果
テストにより、Integerは値を変更するたびにアドレスの変化を繰り返す.
さらに注意しなければならないのは、
Integerソースコードでは、int値はfinal修飾であり、変更できません
まとめ:
(1)Integerパラメータ伝達は参照伝達(またはアドレス伝達と呼ぶ)
(2)Integerがパラメータとしてメソッドに入力され,戻り値が設定されていなければ,Inergerの値は変化しない理由は,Integerが付与するたびに新しいオブジェクトが与えられるため,参照として入力されると,また別の参照に変換されるためである.
参考記事:
https://www.cnblogs.com/zhousysu/p/5483795.html
https://www.cnblogs.com/toSeeMyDream/p/9165846.html
https://blog.csdn.net/u012309392/article/details/83443679
https://blog.csdn.net/weixin_34249678/article/details/85995877
パラメータとしてIntegerを渡すときに引用して渡す.
しかし、テストしてみると、Integerはパラメータとして渡され、戻り値は設定されていないことがわかりました.Inegerの結果は変わらない
public class test{
public void add(Integer i){
i=i+3;
}
@Test
public void test(){
Integer a=5;
add(a);
System.out.println(a);
}
}
テストの結果:5
まず、上記の知識点が正しいかどうかを検証するために、次のコードをテストしました.
public class test{
//System.identityHashCode( )
public void add3(Integer i){
System.out.println("i :"+System.identityHashCode(i));
i=3;
}
@Test
public void test(){
Integer a=5;
System.out.println("a :"+System.identityHashCode(a));
add(a);
System.out.println(a);
}
}
結果:
aのアドレス:352359770 iのアドレス:352359770
上記のコードテストにより,Integerパラメータは確かに参照伝達であることが分かった.クエリによって次のことがわかります.
jdk 1.5自動梱包の特性上、実際の状況は実行に等しい i = Integer.valueOf(3);valueOf()メソッドは、入力された数値に基づいて-128-127の間で定数プールからIntegerオブジェクトを取得して返すソースコードを参照します.範囲外でない場合はnew Integer(3)が返されます.
つまりIntegerのアドレスは値の変化によって変化します!
次のテストを行いました.
public class test{
public void add3(Integer i){
System.out.println("i :"+System.identityHashCode(i));
i=3;
System.out.println("i :"+System.identityHashCode(i));
}
@Test
public void test(){
Integer a=5;
System.out.println("a :"+System.identityHashCode(a));
add3(a);
System.out.println("a :"+System.identityHashCode(a));
a=10;
System.out.println("a :"+System.identityHashCode(a));
System.out.println(a);
}
}
結果
a :352359770
i :352359770
i :243745864
a :352359770
a :699780352
10
テストにより、Integerは値を変更するたびにアドレスの変化を繰り返す.
さらに注意しなければならないのは、
Integerソースコードでは、int値はfinal修飾であり、変更できません
class Integer{
final int value; // , 。
}
まとめ:
(1)Integerパラメータ伝達は参照伝達(またはアドレス伝達と呼ぶ)
(2)Integerがパラメータとしてメソッドに入力され,戻り値が設定されていなければ,Inergerの値は変化しない理由は,Integerが付与するたびに新しいオブジェクトが与えられるため,参照として入力されると,また別の参照に変換されるためである.
参考記事:
https://www.cnblogs.com/zhousysu/p/5483795.html
https://www.cnblogs.com/toSeeMyDream/p/9165846.html
https://blog.csdn.net/u012309392/article/details/83443679
https://blog.csdn.net/weixin_34249678/article/details/85995877