Integerパラメータ伝達の問題

2527 ワード

今日1つのJavaの知识の点を见ます:JAVAの中で8种类の基本的なタイプの伝达のパラメータを除いて値の伝达で、その他の类のオブジェクトの伝达のパラメータはすべて引用の伝达です.
パラメータとして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