5

このプログラムは出力として 6 を返しますが、9 行目のコメントを外すと、出力は 5 になります。なぜですか? ba は変わらないほうがいいと思います。メインは 5 のままです。

1  class C1{
2      int a=5;

3      public static void main(String args[]){
4          C1 b=new C1();
5          m1(b);
6          System.out.println(b.a);
7      }

8      static void m1(C1 c){
9          //c=new C1();
10         c.a=6;
11    }
12 }
4

6 に答える 6

10

Java でオブジェクトを渡すと、メソッドで参照されるオブジェクトを意味する参照として渡されbmainメソッドでc引数として渡されますm1。どちらも同じオブジェクトを指しているため、値を 6 に変更すると、mainメソッドに反映されます。

c = new C1();実行しようとするcと、別のオブジェクトbを指すようになりましたが、メソッドで作成したオブジェクトをまだ指しているmainため、更新された値 6 はメイン メソッドで表示されず、5 を取得します。

于 2012-04-24T15:02:04.507 に答える
3

Java は値渡しです。つまり、引数を渡すと、ポインター変数のコピーが作成されます。オブジェクト変数は、実際には C のポインターのように読み取る必要があります。これにより、少なくとも C の世界 (C は値渡しのみである) から来ている場合は、理解しやすくなります。

したがって、 をc=new C1()実行するとき、または一般的に への代入を実行するときcは、c(以前は指していたメモリの同じ場所をb指していた) を別の場所に指し示しています。したがって、以下c.a=6は が指すオブジェクトのメンバーへの代入です。cこれは、 が指すオブジェクトではありませbん。

于 2012-04-24T15:09:26.683 に答える
3

タイプ C1 のオブジェクトへの参照のコピーをメソッド m1 に渡しています。

行のコメントを外すと、その参照を取得して別の場所を指すことになります (元の参照がまだ最初のオブジェクトを指しているわけではありません)。したがって、b の値を出力すると、変更していない元のオブジェクト。

この質問にはいくつかの非常に良い答えがあり、実際に見てみる必要があります。

Javaは「参照渡し」または「値渡し」ですか?

于 2012-04-24T15:03:06.087 に答える
1

メソッドm1(b);がメインで呼び出され、m1 で作成された新しいインスタンスが、メイン メソッドで既に作成されている C1 のインスタンスに置き換わります。m1 のインスタンス化をコメント化すると、main の最初のインスタンスが有効になります。これは、Java オブジェクトが値ではなく参照によって渡されるためです。

于 2012-04-24T15:06:55.443 に答える
1

プリミティブ型以外のJavaでは、参照のコピーを渡すと書かれていますが、すべてが参照渡しです。

したがって、最初のインスタンスの場合、ポインター b と c の両方が同じオブジェクトを指しているため、更新された値がメインメソッドに反映されます。

2 番目のインスタンスでは、(new を呼び出して) c を新しいオブジェクトを指すようにすると、b はまだメイン メソッドで作成されたオブジェクトを指しているため、b と c が 2 つの異なるオブジェクトを指しているため、更新された値はメイン メソッドに反映されません。

于 2012-04-26T03:34:32.207 に答える
1

これは、m1(C1 c) の c がオブジェクトへの参照であり、ca=6 を実行すると、このオブジェクトで a が 6 に等しくなるためです。しかし、このメソッド内で c=new c1() を実行すると、c は完全に新しいオブジェクトを参照するようになり、この新しいオブジェクトで ca=6 を実行することになります。その後、メソッドを終了しますが、他の c オブジェクトの値は 5 のままです。

于 2012-04-24T15:03:46.877 に答える