なぜ私のJavaメソッドが渡された変数を変更できないのですか? [複製
-
28-09-2019 - |
質問
この質問にはすでに答えがあります:
次のコードが期待どおりに機能しないのを見たとき、私はちょっと困惑していました。
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に割り当てています。
所属していません StackOverflow