今月末Java Silver を受験予定で参照渡しが理解できなくて行き詰まっています!!
どなたかわかりやすくご説明できる方助けてください。
13行目がどうして0が表示されるかが理解できません。
2行目で int[] other = { 10 }; となっているので10が表示されると考えてしまいます。
実際に動かすとたしかに0が表示されます。
どうしても理解できません。(汗)
1 static void method1(int[] a) {
2 int[] other = { 10 };
3 a = other;
4 }
5 static void method2(int[] a) {
6 a[0] = 100;
7 }
8 public static void main(String[] args) {
9 int[] array = { 0 };
10 System.out.println(array[0]); // => 0
11
12 method1(array);
13 System.out.println(array[0]); // => 0
14
15 method2(array);
16 System.out.println(array[0]); // => 100
17}
追記
ご回答してくださった方々本当にありがとうございます!
アドバイスをもとに、自分なりに図を書いてみました。
私の勉強不足でまだ腑に落ちていないような気がします。
この図のような認識であっているでしょうか?
そもそも、この問題は参照渡しが理解できないというより
「参照渡し」と「参照の値渡し」の違いが理解できていないという事だったのですね。
メソッド1(参照の値渡し)
記述が省略してあるがnewしているので参照の値渡し → 呼び出し元の値は変わらない。
メソッド2は(参照渡し)
こちらは参照先の値が共通なので呼び出し元の値も変わる。
みなさんはこれはこういうものだって割り切って理解しているのでしょうか?
なんかもっとスッキリしたいな~
もう少しで納得しそうです。本当に皆様ありがとうございます。
12行目でメソッド1にarrayを渡していますがこれは、あくまで実態ではなく参照値のコピー
ここでもし実態を渡していたら(javaではありえませんが)aとarrayは同一のものになり
3行目の a = other; の処理で同じところが書き換えられarrayに反映するかと思うのですが、これがコピーだから影響ないという認識で間違いないでしょうか?
このような処理をC言語やC++での参照渡しでおこなったらどうなるのでしょうか?
お詳しい方いたら教えていただけると助かります。

回答4件
あなたの回答
tips
プレビュー