胡瓜のプログラミング日記

Javaメモ 参照の値渡し

参照やら参照渡しやらは、いつも

「『あぁ、あれね』⇒ そういえばどうだっけ… ⇒ 『あぁ、そっか』…」

の繰り返し。twitterで流れてきたものを確認し、忘れないうちにメモ。

public static void main(String[] args) {
	// ArrayListインスタンスの生成(右辺)で確保された領域の先頭番地をlistに代入
	ArrayList<String> list = new ArrayList<String>();
	// list の値が指す領域に"Hello"を追加
	list.add("Hello");
	// listの値(listそのものではない)をmethodに渡す
	method(list);
	System.out.println(list);
}

private static void method(ArrayList<String> list){
	// listの値が指す領域に"こんにちは"を追加
	list.add("こんにちは");     // ⇒ [Hello, こんにちは]
}

・「list.add("こんにちは")」のlistは、main 側のlistと同じ値をもつだけで、main側のlistそのものではない。
・が、methodではlistの値がさす領域にあるArrayListそのものに対して操作(add)をしているので、「こんにちは」が追加される。

public static void main(String[] args) {
	ArrayList<String> list = new ArrayList<String>();
	list.add("Hello");
	method(list);
	System.out.println(list);
}

private static void method(ArrayList<String> list){
	// listに新たなArrayListインスタンスを代入。main側のlistには影響なし。
	list = new ArrayList<String>();   
	list.add("こんにちは");    // ⇒ Hello
}

・method側のlistには、mainで生成したものとは別のインスタンスの生成で確保された領域を指す値が入る
・method側のlistは、前述の通りmain側のものとは値が同じだけの別物なので、「System.out.println(list)」のlistの値が指す領域のインスタンスには影響しない

C言語で中途半端にポインタやっちゃった影響がある気がする…ちゃんと理解できていれば大丈夫なんだろうけど。