Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

戻り値に指定していないのに…

下記のように記述したとき、
method1の実行前後で変数iの値が5から6に変わるのですが、
なぜ戻り値に指定していない変数が変わってしまうのでしょうか。

int i=5;
int j=method(i);
(中略)
private int method1(int x){
  x++;
  return x;
}

7

回答

78488

閲覧

7件の回答

評価

0

????

これを見る限り
i の値が変わることはありえませんね。

評価

0

何処かで変なことしてるのよね

>(中略)
のところでなんかやってるのでは?

更に他のところで何かやらかしているかもというより
変数iというのが思い込みだったりして

評価

0

すみません、説明しやすくするためにint型にしたのが間違いでした。

String[] i={"一番"};
String[] j=method( i );
(中略)
private String[] method1(String[] i){
  i[0]="二番";
  return i;
}

このコードだと、method1の実行前後でi[0]の値が変わりますよね。
これは、method1に渡している引数がiの中身("一番")ではなく
iのアドレス(=番地?)だから、ということでしょうか。

評価

0

>iのアドレス(=番地?)だから
ちゃんと説明すると長くなりますが、とりあえずそういうことです。

Javaの変数にはプリミティブ型と参照型が存在しますが、配列は参照型になります。
プリミティブ型は値を保持し、参照型はオブジェクトへの参照(ポインタ)かnullを保持します。

メソッドに渡す変数は呼び出すたびにメソッド仮引数にそのままコピーされます。
つまりプリミティブ型は値がコピーされ、参照型はポインタがコピーされます。

メソッド内で参照型の仮引数を利用すると、参照先のオブジェクトを利用していることになります。
プリミティブ型は変更してもコピーされた仮引数の値が変わるだけです。

なお、Stringは参照型ですが特別で、Stringオブジェクトは定数です、String変数はその定数を参照しています。
例えば+演算子で文字を追加しようとすると、新しいオブジェクト(定数)が生成され変数はその新しいオブジェクトを参照します。
なので、メソッド内で変更?しても、仮引数の参照が変わるだけで、実引数に影響はありません。

今回の件は、String型の配列なので仮引数には配列型の参照が渡ります、多少ややこしいですが、配列要素のString変数の参照先を変更したので、メソッドから返ってきたときには、見ている場所が違うため
”二番”になっている、ということですね。

評価

0

からくりはtamaさんが書いてくれているのでさておき。

>説明しやすくするためにint型にしたのが間違いでした。
再現することを確認してから、質問しましょう。
実際にやってもいないことを書くと、今回のようなことになります。

それから、配列を渡す場合要素の型はStringでもintでも同じことになります。

評価

0

もっと簡単に済むのかも?

2006-12-05 20:04の例では
引数としてiを渡しても(先頭行にある)i自身が書き換えられるということはないけど

2006-12-07 19:23の例では
配列の"中身"を触ってる

なので2006-12-07 19:23でやってるように配列iの"中身"を見ればその各要素になるものは書き換えられているけど
配列i自身は書き換えられる(別の配列オブジェクトとして)ことはない

ということ


無理矢理(?)例を挙げてみれば・・

と思ったけど、混乱するかもなのでやめておきました。。。

評価

0

みなさん、親切丁寧なアドバイスありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。