0
 public void swap(Point var1, Point var2)
 {
  var1.x = 100;
  var1.y = 100;
  Point temp = var1;
  var1 = var2;
  var2 = temp;
 }

public static void main(String [] args)
{
  Point p1 = new Point(0,0);
  Point p2 = new Point(0,0);
  System.out.println("A: " + p1.x + " B: " +p1.y); 
  System.out.println("A: " + p2.x + " B: " +p2.y);
  System.out.println(" ");
  swap(p1,p2);
  System.out.println("A: " + p1.x + " B:" + p1.y); 
  System.out.println("A: " + p2.x + " B: " +p2.y);  
}

コードを実行すると、次のようになります。

A: 0 B: 0
A: 0 B: 0
A: 100 B: 100
A: 0 B: 0

関数が値渡し時にp1の値をどのように変更するかを理解しています。私が得られないのは、p1とp2のスワップが失敗した理由です。

4

4 に答える 4

4

Javaは常に値渡しされます。これが、プリミティブとオブジェクトの両方の唯一のメカニズムです。

重要なのは、オブジェクトに何が渡されるかを知ることです。オブジェクト自体ではありません。それはヒープ上に存在します。値によって渡されるのは、そのオブジェクトへ の参照です。

渡された参照を変更して新しい値を呼び出し元に返すことはできませんが、参照するオブジェクトの状態を変更することはできます-変更可能であり、呼び出すための適切なメソッドを公開している場合。

渡された参照が参照するものを変更して新しい値を呼び出し元に返すことができないため、Cで可能なことと同様に、ポインターを使用したクラススワップは機能しません。

于 2012-06-19T14:20:46.863 に答える
3

myFunction()関数内の両方のオブジェクト(外部のオブジェクトとは異なります)への参照を交換するだけですが、関数の外部の参照やオブジェクトインスタンス自体は交換しません!

于 2012-06-19T14:17:18.397 に答える
2

正式な引数の場所で生成された参照のコピーがあるため、Pointのインスタンスを指す新しい参照があります

于 2012-06-19T14:16:01.763 に答える
0

オブジェクトは複製ではなく参照によって割り当てられますが、引数は実際のオブジェクトへの参照として残り、「参照への参照」にはなりません。

つまり、最初var1と同じオブジェクトを参照しますが、次に別のオブジェクトを参照するように変更します。はへの参照ではなく、参照しているのと同じオブジェクトへの参照のみであるため、これはどのオブジェクトが参照するかに影響しません。p1var1p1var1p1p1

于 2012-06-19T14:18:13.663 に答える