次のソースを実行して、なぜHelloとHello,Worldが出力されるのかがよくわかりません。func()の中でa=bと参照の受け渡しが行われないのでしょうか。
class F{
static void func(StringBuffer a, StringBuffer b){
b.append(", World.");
StringBuffer w = a;
a = b;
b = w;
System.out.println("a="+a +" b=" +b);
}
}
class HelloWorld{
public static void main(String args[]){
StringBuffer s1 = new StringBuffer("Hello");
StringBuffer s2 = new StringBuffer("Hello");
F.func(s1, s2);
System.out.println(s1);
System.out.println(s2);
}
}
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
s1などにはStringBufferそのものが入っているわけではなく、
それはある特定のStringBufferを見て(参照して)いるのです。
メソッドが呼び出された時点では、aにはs1と同じ内容、bにはs2と同じ内容が入っています。
すなわち、同じStringBufferを見ているのです。
よって、b.append(", World.")でs2(が参照しているStringBuffer)に文字列が追加されます。
ただし、aとs1、bとs2は別の変数なのでaやbの内容を変更しても(参照先を入れ替えても)、
funcの中でその変更が有効に働くだけで、s1やs2までにはその変更が反映されません。
よって、s1が参照している先の内容とs2が参照している先の内容が入れ替わることはありません。
以下のように、呼び出すメソッドに参照を入れるものの参照(配列)を渡せば、
呼び出されたメソッドでの変更を呼び出したほうにまで反映させられます。
class F {
static void func(StringBuffer[] a, StringBuffer[] b){
b[0].append(", World.");
StringBuffer w = a[0];
a[0] = b[0];
b[0] = w;
System.out.println("a="+a[0] +" b=" +b[0]);
}
}
public class HelloWorld {
public static void main(String args[]){
StringBuffer s1[] = new StringBuffer[1]; s1[0] = new StringBuffer("Hello");
StringBuffer s2[] = new StringBuffer[1]; s2[0] = new StringBuffer("Hello");
F.func(s1, s2);
System.out.println(s1[0]);
System.out.println(s2[0]);
}
}
No.1
- 回答日時:
funcの呼び出しで、s1とs2が交換されることを期待したのだけど、
そうならなかったということですね。
これは、そうならないようになってるんです。
s1とs2には、それぞれのStringBufferのオブジェクトの参照が入っています。
つまり番地です。
s1は「このオブジェクトはXXXX番地」
s2は「このオブジェクトはYYYY番地」
という、番地を書いたメモです。
funcが呼び出されるときは、「XXXX番地」「YYYY番地」のところが
コピーされてa, bに写されます。
コピーされるだけです。それ以降のs1、s2とはもう関係がなくなります。
向こうの方で、a、bの間で値を交換しても、s1s2はそのままです。
これはC言語でも同様になります。
ファックスで書類を送ったとき、向こうで書き換えるとこちらの
書類も変わる…なんてことは起こらないでしょう。それと同じです。
では、Javaで変数を交換したいときにはどうするかというと、
簡便な方法はありません。
オブジェクトの中身をそっくり入れ替えれば、同様な効果が得られます。
StringBufferなら、deleteとかreplaceを使って中身を入れ替えるのです。
しかし、あまりそういうことはしません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
servletからjspへオブジェクト...
-
Excel VBA 定数にオブジェクト...
-
C#のクラスで値渡しをする
-
javaで、、、
-
VBAでの[]
-
setRequestAttributeとは?
-
VB.netでメソッドからコントロ...
-
サーブレットコンテキストの意...
-
VBS でのソート処理Excel2003
-
MessageBox.Show(Me,…の「Me」...
-
System.Collections.SortedList
-
オブジェクトの参照渡しについて
-
画像ファイルをリクエストパラ...
-
String型からlong型への変換は...
-
SocketでXMLオブジェクトを送信...
-
VBスクリプトでテキストファイ...
-
ピクチャーボックスに点を打つ...
-
mkdirsでフォルダが作成されない
-
getHeigth,getWidthについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
VBAでの[]
-
サーブレットコンテキストの意...
-
VB.netでメソッドからコントロ...
-
C#のクラスで値渡しをする
-
servletからjspへオブジェクト...
-
Excel VBA 定数にオブジェクト...
-
javaで、、、
-
VB.NETでのnothing の意義について
-
JSPでのArrayListの表示につい...
-
Dispose()は、どんな時に使うの...
-
String型からlong型への変換は...
-
ピクチャーボックスに点を打つ...
-
PrintFormを使用してのプリント
-
Javaでブラウザ判定
-
Vba ListViewの行挿入に関して...
-
C#で親にイベントを投げる方法
-
VBスクリプトでテキストファイ...
-
mkdirsでフォルダが作成されない
-
ArrayListのデバッグ方法について
おすすめ情報