質問

この質問にはすでに答えがあります:

次のコードが期待どおりに機能しないのを見たとき、私はちょっと困惑していました。

Javaは、関数への参照によって常に変数を渡すと思いました。したがって、なぜ関数が変数を再割り当てできないのですか?

public static void main(String[] args) {

  String nullTest = null;

  setNotNull(nullTest);

  System.out.println(nullTest);
}

private static void setNotNull(String s) {
  s = "not null!";
}

このプログラムは出力されます null.

役に立ちましたか?

解決

オブジェクトへの参照は渡されます 価値 Javaでは、メソッド内でローカル変数に割り当てることは、元の変数を変更しません。ローカル変数のみ s 新しい文字列を指します。少しASCIIアートで理解する方が簡単かもしれません。

最初はこれを持っています:

------------
| nullTest |
------------
     |
    null

最初にメソッドを入力すると、setnotnullが取得されます 値のコピー nulltestの s. 。この場合、ヌルテストの値はヌルの参照です。

------------    ------------
| nullTest |    |    s     |
------------    ------------
     |               |
    null            null

その後、sを再割り当てします:

------------    ------------
| nullTest |    |    s     |
------------    ------------
     |               |
    null         "not null!"

そして、メソッドを残します:

------------
| nullTest |
------------
     |
    null

他のヒント

Javaは参照を通過しません。参照の値を渡します。割り当てているとき s="not null", 、あなたはその価値を再割り当てしています。

o = setnotnull(o)を使用せずにsetnotnull(myobject o)のようなことをしたいと思っていました

簡単には、できません。あなたが得る最も近いのはこのようなものです:

public class MyRef<T> {
    private T obj;

    public T get() {
        return obj;
    }

    public void set(T obj) {
        this.obj = obj;
    }

    public void setNotNull(T obj) {
        if (this.obj == null) {
            this.obj = obj;
        }
    }
}

MyRef<MyObj> ref = new MyRef<MyObj>();
ref.setNotNull(xyz);
System.err.println(ref.get());

それはすべてかなり不格好で、おそらく努力する価値がないでしょう。

s =

これが理由です。 Sが指し示すオブジェクトを変更するのではなく、Sに割り当てています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top