0

この問題に遭遇したため、Java でオブジェクトがどのように機能するかについてかなり混乱しています。

checkDateValue という関数があるとしましょう (コードは次のようになります)

private boolean checkDateValue(Date d1, String msg) {
    if (d1 == null) {
        msg = "d1 is null!";
        return false;
    }
    return true;
}

この関数を呼び出す場所は次のとおりです。

String msg = null;
Date d1 = null;
if (!checkDateValue(d1, msg)) {
    system.println(msg); //msg is still null..... 
                         //what I need is the message generated in the function
}

私の知る限り、カスタマイズされたオブジェクトを配置した場合(例

myObj { private String msg;} 

) を関数に変換し、関数内で msg の値を変更します。関数から出ると、msg の変更が保持されます。ただし、Javaでは文字列もオブジェクトと見なされると思います。変更が保持されないのはなぜですか?

4

6 に答える 6

2

"out"Java には関数の引数がありません。それらは参照のコピーです。関数を変更msgしても、呼び出し元の変数には影響しません。

于 2013-04-30T18:49:51.357 に答える
1

文字列は特別で、不変であり、通常のオブジェクトとは異なります。Java のStringは、プリミティブとクラスの間にあるように設計されています。

文字列は値で渡されますが、残念ながら文字列を変更するたびに新しい値が作成されるため、古い参照には古い値があります。

これは良い説明だと思います:https://stackoverflow.com/a/1270782/516167

于 2013-04-30T18:49:14.713 に答える
0

msg = "d1 is null!";msg=nullは、2 つの異なる String オブジェクトです。Stringは Java では不変です。参照は値によって渡されます。つまり、参照のコピーが渡されます。aStringは immutable object であるため、メソッド内の割り当てStringにより、参照のコピーが指す新しいオブジェクトが作成されます。元の参照はまだ null を指していますString。メソッド呼び出しは次と同じです:

Object obj = null; // obj points to nowhere
foo(obj); // passed the reference values to method argument
void foo(Object o)
{
   o = new Object( );  // o points to new Object, but obj still points to nowhere
}
于 2013-04-30T18:46:41.433 に答える
0

Java では、メソッド パラメーターに割り当てて、呼び出し元のコードに値を返すことはできません。任意のパラメーターの内部構造を変更でき、その変更が呼び出し元のコードに表示されることは正しいです。ただし、パラメーターへの割り当ては、内部構造の変更と同じではありません。また、aString不変です。一度作成されると、その内部構造は変更できません。

配列引数を使用することを行うための一般的なトリック:

private boolean checkDateValue(Date d1, String[] msg) {
    if (d1 == null) {
        msg[0] = "d1 is null!";
        return false;
    }
    return true;
}

次に、次のように呼び出します。

String[] msg = new String[1];
Date d1 = null;
if (!checkDateValue(d1, msg)) {
    system.println(msg[0]);
}
于 2013-04-30T18:49:17.373 に答える
0

これは、

Java は、オブジェクトを値渡しの参照として渡します。

参照引数を変更して、別のものを指すことはできません。オブジェクトの状態を変更できます。

詳細はこちら

于 2013-04-30T18:51:05.737 に答える