次のソースを実行して、なぜ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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
サーブレットコンテキストの意...
-
servletからjspへオブジェクト...
-
ADOのOPENで実行時エラー
-
VB.netでメソッドからコントロ...
-
Excel VBA 定数にオブジェクト...
-
VBスクリプトでテキストファイ...
-
オブジェクトの参照渡しについて
-
C#で親にイベントを投げる方法
-
VBAでの[]
-
MessageBox.Show(Me,…の「Me」...
-
Excel Book の変更の検知
-
System.Collections.SortedList
-
javaで、、、
-
抽象クラスのオブジェクトを生...
-
getParameter()について
-
JSPでのArrayListの表示につい...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
インスタンス参照でアクセスで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
VBAでの[]
-
サーブレットコンテキストの意...
-
VB.netでメソッドからコントロ...
-
C#のクラスで値渡しをする
-
Excel VBA 定数にオブジェクト...
-
servletからjspへオブジェクト...
-
VB.NETでのnothing の意義について
-
javaで、、、
-
PrintFormを使用してのプリント
-
Vba ListViewの行挿入に関して...
-
String型からlong型への変換は...
-
Dispose()は、どんな時に使うの...
-
ピクチャーボックスに点を打つ...
-
C#で親にイベントを投げる方法
-
VBS でのソート処理Excel2003
-
JSPでのArrayListの表示につい...
-
VB2005でADDとINSERTの違いは?
-
[ASP.NET]DropDownListのDB連携...
-
ADOのOPENで実行時エラー
おすすめ情報