2
class smth{
    public static void main(String[] args){
        private Integer x = new Integer(17);
        inc(x);
        System.out.print("x="+x);
    }
    public static void inc(Integer x){
        x++;
        System.out.println("n="+x);
    }
}

出力: n=18; x=17;

整数はオブジェクトであり、この場合 x の値が変化しなかった理由がわかりません。

4

7 に答える 7

3

原因Integerは不変オブジェクトです。メソッドに送信すると、それへの新しい参照が作成されます。インクリメントを行うと、メソッド内の参照はIntegervalue で new に再割り当てされます18が、内部の参照mainはまだIntegervalue で old を参照しています17

于 2012-11-30T21:15:44.133 に答える
2

これは、Java がオブジェクトを参照ではなく値でメソッドに渡すためです。メソッドの呼び出しが完了すると、呼び出し元のメソッドのオブジェクト値は、渡す前と同じになります。呼び出されたメソッド内で値を変更できますが、変更の範囲は渡されたメソッドです。

于 2012-11-30T21:14:59.637 に答える
1

これはInteger、プリミティブのラッパーであるint不変であり、Java がオブジェクト参照を値で渡したためです。メソッド内のオブジェクト参照に加えられた変更は、渡されたオブジェクトには影響しません。参照は新しいオブジェクトへの参照に置き換えられますが、元のオブジェクトは不変であるためそのまま残ります。

この問題に対処するには、別のレベルの間接化が必要です。配列、Apache commons の変更可能な int を使用するか、適切に設計された独自のクラスをロールすることができます。

public static void main(String argv[])
    MutableInt x = new MutableInt (17);
    inc(x);
    System.out.print("x="+x.intValue());  
}
public static void inc(MutableInt x){
    x.add(1);
    System.out.println("n="+x.intValue());
}
于 2012-11-30T21:15:14.100 に答える
1

すべてのラッパー クラスは不変クラスです。

于 2012-11-30T21:16:15.563 に答える
1

これは、メソッド内で変更するオブジェクトが、incこのメソッドの外側で出力されるオブジェクトと同じではないためです。

メソッド内にinc xは、オブジェクトを指す参照があります。x ++ を実行すると、別の値を持つ新しい Integer オブジェクトを参照するように X が再割り当てされます。したがって、メインで宣言された元の「x」変数を変更していません。

「ポインター」を新しい整数オブジェクトに返す必要があります。

public static int inc(Integer x){
          x++;
          System.out.println("n="+x);
          return x;
      }

  public static void main(String argv[])

              Integer x = new Integer(17);
              x = inc(x);
              System.out.print("x="+x);  
  }

Integerは、単一のint フィールドを含むオブジェクトです。Integer は int よりもはるかにかさばります。int を含む Fedex ボックスのようなものです。整数は不変です ( source )

于 2012-11-30T21:16:16.537 に答える
1

Integer不変です。はx++新しいオブジェクトを作成し、再バインドxしてそれを参照します。xオリジナルへの参照は値によって渡されたため、変更は呼び出し元に反映されません。

于 2012-11-30T21:14:59.513 に答える
1

x++は、整数オブジェクトでは、実際には次のことを意味するためです。

int temp = x.intValue();
temp++;
x = Integer.valueOf(temp);

x 変数に新しい Integer インスタンスが割り当てられています。また、パラメーターは値で渡されるため、元の参照は変更されません。

于 2012-11-30T21:19:08.017 に答える