1

初心者の質問をご容赦ください。インターネットで次のコードフラグメントを見つけました。

public class Person {

public static void main(String [] args)
{
    StringBuffer a = new StringBuffer("A");
    StringBuffer b = new StringBuffer("B");
    operate(a,b);
    System.out.println(a+","+b);
}


static void operate(StringBuffer x, StringBuffer y)
{
    y.append(x);
    y=x;

 }
}

実行中の出力は A,A である必要があることがわかりましたが、正しい出力は A,BA である必要があります。b の値がまだ AB である理由を専門家に理解してもらえますか? 「y.append(x)」が b の値に影響するのに、「y=x」には影響しないのはなぜですか? それが私が混乱しているところです。

前もって感謝します。

4

4 に答える 4

6

簡単に言えば、Java 引数は値渡しなので、最後の代入operateは何の効果もありません。

詳細な一連のイベントは次のとおりです。

  1. ab2 つの StringBuffer オブジェクトに初期化されます。これを次のように書きましょう

     a -> S1{"A"}
     b -> S2("B")
    
  2. 呼び出し引数の (自明な) 引数式operatorが評価され、S1{"A"} と S2{"B"} が与えられます。

  3. 呼び出しが開始され、2 つの参照がローカル変数x およびに割り当てられますy。したがって、現在の状態は次のとおりです。

     a -> S1{"A"}
     x -> |
    
     b -> S2("B")
     y -> |
    
  4. このy.append(x)呼び出しは S2 オブジェクトを変更します。

     a -> S1{"A"}
     x -> |
    
     b -> S2("BA")
     y -> |
    
  5. y = x;割り当てが実行されます。

     a -> S1{"A"}
     x -> |
     y -> |
    
     b -> S2("BA")
    
  6. operateメソッドが戻り、andxy範囲外になります。

     a -> S1{"A"}
     b -> S2("BA")
    

注意すべき重要なことは、ステップ 5 で S2 オブジェクトの内容を変更しなかったことです。代わりにy、他のオブジェクトを参照するように変更しました。

于 2012-09-21T09:58:22.037 に答える
0

Java は、名前による呼び出しまたは参照による呼び出しを使用しません。

void replace(Anything x) {
  x = y;
}

呼び出し変数のエイリアスではなく、新しい変数であるため、定義により何もしません。変数への変更は、メソッド スコープに限定されます。what の参照の内容を変更する可能性があることに注意してください。xxx.setSomethingx

これは、実際にはほとんどのプログラミング言語に当てはまります。エラーを回避し、目的の結果を明示的に達成する方法があります。

Java は常に値渡しで呼び出します。参照を使用する場合でも、技術的には (オブジェクト参照型の) 値として渡されます。

つまり、変数 " Integer example;" は技術的には ではありませんが、インスタンスへIntegerの参照 ( である可能性がありますnull)です。参照Integerはコピーされます(値による呼び出し) が、もちろんその後も同じオブジェクトを参照します。したがって、オブジェクトを変更することはできますが、実際の参照を変更することはできません。これは、オブジェクトのコピーしかないためです。

于 2012-09-21T10:00:48.473 に答える
0

メソッドでは、y=x行はローカル変数のみを変更し、呼び出し元スコープyの変数には影響しません。b

bJava では変数へのポインターを渡すことができないため、operate メソッドで変数を変更するのは少し難しくなります。次のいずれかを実行できます。

  • それを返す:b = operate...
  • その内容を変更します (ただし、それはコピーになります)
于 2012-09-21T09:58:03.000 に答える
0

Operate メソッドをドライランします。

  1. 参照状態は次のとおりです。 a -> A, x -> A, b -> B, y -> B.

  2. append実行します a -> A, x -> A, b -> BA, y -> BA.

  3. y=x実行します a -> A, x -> A, b -> BA, y -> A.

さて、印刷出力はどうあるべきでしょうか?:-)

要点は、

Javaは値渡しです

.

于 2012-09-21T10:06:51.450 に答える