0

こんにちは、スタックオーバーフローに関するこの質問を読み、例を実行しようとしました。

私は以下のコードを持っていました:

public static void main(String[] args){
     int i = 5;
     Integer I = new Integer(5);

     increasePrimitive(i);
     increaseObject(I);

     System.out.println(i); //Prints 5 - correct
     System.out.println(I); //Still prints 5
     System.out.println(increaseObject2(I)); //Still prints 5

}

public static void increasePrimitive(int n){
     n++;
}

public static void increaseObject(Integer n){
     n++;
}

public static int increaseObject2(Integer n){
         return n++; 
}

increaseObject参照の値がその関数内で変化しているため、出力は 5 ですか? 私は正しいですか?なぜincreasedObject26ではなく5を印刷するのか混乱しています。

誰でも説明できますか?

4

2 に答える 2

1

increasedObject2()機能的には、

n++を返します。

後置です。したがって、n = 5が返された後、n値が増加します。つまり、n=6です。

于 2012-10-03T03:36:03.120 に答える
1

問題はreturn n++;、nが返され、その後増分されるだけであるということです。return ++n;またはに変更すると期待どおりに動作しますreturn n+1;

Integerただし、テストしようとしているものは不変であるため、機能しません。あなたは次のようなもので試してみるべきです-

class MyInteger {
     public int value; //this is just for testing, usually it should be private

     public MyInteger(int value) {
         this.value = value;
     }
}

これは変更可能です。

次に、そのクラスのインスタンスへの参照を渡しvalue、呼び出されたメソッドからそれを変更(そのインスタンスの値を変更)することができます。

メソッドを変更します-

public static void increaseObject(MyInteger n){
     n.value++;
}

そしてそれを呼ぶ-

MyInteger i = new MyInteger(5);    
increaseObject(i);
于 2012-10-03T03:36:04.440 に答える