1

私は1つの些細なことと混同しています-メソッドにパラメーターを渡し、それらの値を変更する...私はあなたにいくつかのコードを与える方が良いでしょう:

public class Test {
  public static void main(String[] args) {
    Integer val = new Integer(41);
    upd(val);
    System.out.println(val);

    Man man = new Man();
    updMan(man);
    System.out.println(man.name);
  }

  static void upd(Integer val) {
    val = new Integer(42);
  }

  static void updMan(Man man) {
    man.name = "Name";
  }

  static class Man {
    String name;
  }
}

渡したIntegerオブジェクトがManオブジェクトの更新中に更新されない理由を説明してください。IntegerオブジェクトとManオブジェクトは(非プリミティブな性質のために)参照によって渡されませんか?

4

4 に答える 4

1

あなたのためにInteger新しいオブジェクトを作成しているからです。そのMan値の1つを変更するだけで、オブジェクトmanは同じままになります。

次のことを考慮してください。

static void updMan(Man man) {
  man = new Man();
  man.name = "Another Man";
}

これはあなたのイニシャルも変更しませんman

- 編集

Integerこれにより、の可変性を「シミュレート」できます。

static void upd(Integer val) {
    try {
        Field declaredField = val.getClass().getDeclaredField("value");
        declaredField.setAccessible(true);
        declaredField.set(val, 42);
    } catch (Exception e) {
    }
}
于 2012-06-08T09:49:43.613 に答える
1

これは、Passbyvalueと呼ばれます。オブジェクトをdomeメソッドに渡すと、Javaはそのオブジェクトへの参照のコピーを作成します。メソッドの本体に入った直後にオブジェクトのハッシュコードをチェックすると、渡されたオブジェクトのハッシュコードと同じになります。ただし、メソッド内で変更すると、オブジェクトが変更され、参照が同じオブジェクトを指すことはなくなります。

編集:コードサンプル

public class TestPass {

    public static void main(String[] args) {
        String ss= "sample";
        System.out.println("Outside method: "+ss.hashCode());
        method(ss);

    }

    static void method(String s){
        System.out.println("Inside method: "+s.hashCode());
        s+='!';
        System.out.println("Inside method after object change: "+s.hashCode());
    }

}

出力:

Outside method: -909675094
Inside method: -909675094
Inside method after change: 1864843191
于 2012-06-08T09:57:00.027 に答える
1

Javaのパラメータとしてのオブジェクトは、参照のコピーによってパラメータとして転送されます。したがって、参照コピーを介してオブジェクトを変更すると、オブジェクトが更新されます。

upd(Integer val)メソッドの場合は、新しいIntegerオブジェクトを作成して、参照コピーが古いオブジェクトではなく新しいオブジェクトを指すようにします。したがって、そのオブジェクトを変更しても、元のオブジェクトには影響しません。

于 2012-06-08T10:03:13.233 に答える
0
man.name = "Name"; 

ここでは実際に同じオブジェクト内の何かを変更しており、整数の場合のように新しいオブジェクトを作成していません。

于 2012-06-08T09:51:33.050 に答える