5
class prog {

      static String display(String s)
      {
         s = "this is a test";
         return s;
      }

   public static void main(String...args) {

     prog p = new prog();
     String s1 = "another";
     System.out.println(display(s1)); //Line 1
     System.out.println(s1);
   }
}

初心者の質問です。

s1が「これはテストです」に更新されない理由を誰かが説明できますか?.

s1Java では、オブジェクトの引数は参照として渡され、その場合は Stringオブジェクトを 1 行目の参照として渡していると思いました。

そして、メソッドs1を介して「これはテストです」に設定する必要がありましたdisplay()..そうですか?

4

5 に答える 5

19

Java は常に値渡しです。参照型の場合、参照の値のコピーを渡します。

あなたの

static String display(String s)
{
    s = "this is a test";
    return s;    
}

参照が再割り当てされ、そのString s値が変更されます。値がコピーであるため、呼び出されたコードはこの変更を認識しません。

sではString、不変であるため動作を示すのは困難ですが、たとえば

public class Foo {
    int foo;
}

public static void main(String[] args) {
    Foo f = new Foo();
    f.foo = 3;
    doFoo(f);
    System.out.println(f.foo); // prints 19
}

public static void doFoo(Foo some) {
    some.foo = 19;
}

しかし、あなたが持っていた場合

public static void doFoo(Foo some) {
    some = new Foo();
    some.foo = 19;
}

3渡した参照を介してオブジェクトにアクセスしているのではなく、参照を介してオブジェクトにアクセスしているため、元はまだ表示されnewます。


もちろん、いつでも新しい参照を返し、それを何らかの変数に割り当てることができます。おそらく、メソッドに渡したものと同じものであってもかまいません。

于 2013-09-06T16:21:08.160 に答える
3

String値渡しされる参照です。参照ポイントは変更できますが、発信者のコピーは変更できません。オブジェクトが変更可能な場合、その内容を変更できます。

要するに、Java は常に VALUE で渡され、それ以外のことは何もしませんでした。

于 2013-09-06T16:22:09.383 に答える
0

実際、プログラムでは、display(s1) を呼び出しているときに、2 つの参照文字列変数 s1 と s があります。s1 と s の両方が String "another" を参照します。

ただし、表示メソッド内では、s の参照を別の文字列「これはテストです」を指すように変更していますが、s1 は引き続き「別の」を指します。

現在、s と s1 は 2 つの異なる文字列への参照を保持しています

display(s1) --> s の参照を保持し、「これはテストです」と出力します

s= display(s1) を割り当てた場合のみ、両方の変数が同じ文字列を参照します

于 2013-09-06T17:15:01.097 に答える