Monthly Archives: July 2010

Javaにおける参照型引数の勘違い

最近Javaを勉強しているのでJavaネタ。 基本的なところを勘違いしていたので、メモも含めて。 次のようなコードを実行する。 [java] class Container { public String str; /** 文字列を出力する */ public void printStr(){ System.out.println(“printStr : “+str); } } class Editor{ public void edit1(Container cont){ cont.str = “Edited1”; } public void edit2(Container cont){ cont = new Container(); cont.str = “Edited2”; } public void edit3(Container cont){ cont = null; } } public class Main { public static void main(String[] args) { // Containerインスタンスの生成・初期化 Container container = new Container(); container.str = “Default”; container.printStr(); // Editorインスタンスの生成 Editor editor = new Editor(); // Edit1 editor.edit1(container); container.printStr(); // Edit2 editor.edit2(container); container.printStr(); // Edit3 editor.edit3(container); container.printStr(); } } [/java] この時出力されるのは

printStr : Default printStr : Edited1 printStr : Edited1 printStr : Edited1

である。 これが意外だった。 僕が予期していたのは

printStr : Default printStr : Edited1 printStr : Edited2 printStr : null

だった。 つまり、参照型変数を関数の引数として渡すとき

関数内のローカル変数であるcontはその参照型のメモリ領域を 一時的に指しているだけである、ということだ。 そのため、Edit2のようにcontに新たなインスタンスを代入してしまえば(指させてしまえば) 呼び出し元から引数として渡した変数とは全く無関係になってしまう。 Edit3のようにnullを代入した時も同様である。 基本的なことだけど、ちょっとつまずいたので記録。