0

私の理解では、Javaのオブジェクトは参照によって渡されます。より正確には、オブジェクトへの参照は値によって渡されます。では、文字列を宣言して、文字列の値を変更する関数に渡すと、元の文字列が変更されないのはなぜですか? 例えば:

class Thing 
{

    static void func(String x){ x = "new"; }

    public static void main(String [] args)
    {
        String y = "old";
        func(y);
        System.out.print(y);
    }
}

y の値がまだ「古い」のはなぜですか?

編集: なぜ次は Thing something の属性 x を 90 に設定するのですか?

class Thing { int x = 0; 

static void func(Thing t){ t.x = 90; }

public static void main(String [] args){
    Thing something = null;
    something = new Thing();
    func(something);
    System.out.print(something.x);
}
}
4

5 に答える 5

2

まず第一に、Java のすべては値渡しです。参照も値渡しです。

新しいstringリテラルを作成しましたが、メソッドでそれを返しませんfunc()

元の ではなく、渡された引数を変更しているstringため、変更を確認できません。

あなたはこれを必要とするかもしれません、

public static void main(String [] args)
    {
        String y = "old";
        y= func(y);
        System.out.print(y);
    }

 static String func(String x){ 
  x = "new";  
  return x
 } 

コメントの編集:

いいえ、どちらも同一ではありません。Stringの 2 つの方法には、特にメモリの面で多くの違いがあります。

読んだ

編集2:

最初のケースでは、メソッドで新しい文字列リテラルが作成されfunc ますが、ここでは参照を変更しています。

あなたの疑いは、あなたがやったときに明確になります

  static void func(Thing t){
     t = new Thing(); //as like previous example
     t.x = 90;       // points to new one. Not the original.

    }

今すぐ結果を確認してください。

于 2013-10-19T06:03:35.670 に答える
0

ここで述べたように:

Java はすべてを参照ではなく値で渡します。これを覚えておいてください。オブジェクト、配列 (Java ではオブジェクト)、プリミティブ型 (int や float など) など、すべてを意味します。これらはすべて、Java では値によって渡されます。値渡しと参照渡しの違いは何ですか? 引数 (または複数の引数) をメソッドに渡す場合、Java は元の変数内の値のコピーを作成し、それを引数としてメソッドに渡します。これが値渡しと呼ばれる理由です。 . 値渡しの重要な点は、メソッドが渡される実際の変数を受け取るのではなく、変数内に格納されている値のコピーを受け取ることです。

于 2013-10-19T06:11:09.820 に答える
0

不変性とは何の関係もありません。パラメーターがどのように渡されるか、および変数のスコープがすべてです。

これがあなたの関数呼び出しです

String y = "old"; // The reference y pointing to the string object "old": y ---> "old"
func(y);  

呼び出された関数に入ると

static void func(String x){  // x = y which means x now points to "old": x ---> "old"
    x = "new"; // x ---> "new": now the local variable x is pointing to a different object. y still points to "old".
} //Scope of x ends here

印刷するとき

System.out.println(y);

y はまだ「古い」を指しています。メソッド func にローカルな新しい String オブジェクトが x に割り当てられました。したがって、まだ「古い」と出力されます。

于 2013-10-19T06:17:16.190 に答える
-1

Java では、オブジェクトと文字列の扱いが異なります。Java では、文字列は不変に保たれます。

あなたの例でより明確にするために:

文字列 y がメモリ位置 2000 を指し、文字列 x がメモリ位置 2001 を指していると仮定して、同じ古い値を取得します。

オブジェクトの場合は、私の例を参照してください:

http://javaambition.blogspot.kr/2013/08/java-pass-by-value.html

于 2013-10-19T06:15:05.550 に答える