#pragma twice

KAB-studio > プログラミング > Javaのオブジェクト指向入門 > 2. クラスQ and A > 2.4 参照されないインスタンスはどうなるの?
 
前のページへつぎ

2.4 参照されないインスタンスはどうなるの?

del.icio.us 登録する はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数 livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数 Yahoo!ブックマーク 詳細を表示 users RSSに登録
更新日: 2008/03/31
動作確認環境:Windows XP Professional SP2, Java SE 5

参照がなくなったら?

 質問:インスタンスを操作するための参照がなくなったら、そのインスタンスはどうなるの?
 解答:操作できなくなり、いずれ消えます。

 参照型変数内の参照は、他の参照で上書きすることができます。
 そのため、次のプログラムのように、あるインスタンスが「どの参照型変数も参照を持たない」という状態になることがあります。

// RefChangeRunner.java

/**
 * フィールド1つだけ持つシンプルなクラス。
 * (SimpleClassと同じものです)
 */
class SimpleClass4
{
    // int型変数のフィールドdataを定義します。
    int data;
}

/**
 * 実行用クラス。このクラスを実行してください。
 */
class RefChangeRunner
{
    public static void main( String[] args )
    {
        // SimpleClass4クラスの参照型変数とインスタンスを2つ作ります。
        SimpleClass4 ref1 = new SimpleClass4();
        SimpleClass4 ref2 = new SimpleClass4();

        // ref2変数に、ref1変数に入っている参照をコピーします。
        ref2 = ref1;

        // ref変数とref2変数の両方から1つのインスタンスを
        // 参照する形になります。
        ref1.data = 100;
        System.out.println( ref2.data );
        // 出力結果:
        // 100

        // 最初ref2変数が指していたインスタンスは、参照がないため
        // もう操作できません。
    }
}
// RefChangeRunner.java
/**
 * フィールド1つだけ持つシンプルなクラス。
 * (SimpleClassと同じものです)
 */
class SimpleClass4
{
	// int型変数のフィールドdataを定義します。
	int data;
}
/**
 * 実行用クラス。このクラスを実行してください。
 */
class RefChangeRunner
{
	public static void main( String[] args )
	{
		// SimpleClass4クラスの参照型変数とインスタンスを2つ作ります。
		SimpleClass4 ref1 = new SimpleClass4();
		SimpleClass4 ref2 = new SimpleClass4();
		// ref2変数に、ref1変数に入っている参照をコピーします。
		ref2 = ref1;
		// ref変数とref2変数の両方から1つのインスタンスを
		// 参照する形になります。
		ref1.data = 100;
		System.out.println( ref2.data );
		// 出力結果:
		// 100
		// 最初ref2変数が指していたインスタンスは、参照がないため
		// もう操作できません。
	}
}

 このプログラムでは、SimpleClass4クラスのインスタンスを2つ作っているのですが、ref2変数に入っていた「後に作ったインスタンス」の参照を、「最初に作ったインスタンス」の参照で上書きしてしまうため、「後に作ったインスタンス」の参照がなくなってしまいます。

        // SimpleClass4クラスの参照型変数とインスタンスを2つ作ります。
        SimpleClass4 ref1 = new SimpleClass4();
        SimpleClass4 ref2 = new SimpleClass4();

        // ref2変数に、ref1変数に入っている参照をコピーします。
        ref2 = ref1;
		// SimpleClass4クラスの参照型変数とインスタンスを2つ作ります。
		SimpleClass4 ref1 = new SimpleClass4();
		SimpleClass4 ref2 = new SimpleClass4();
		// ref2変数に、ref1変数に入っている参照をコピーします。
		ref2 = ref1;

 こうすると、ref1変数とref2変数の両方が「最初に作ったインスタンス」の参照を持ち、「後に作ったインスタンス」の参照はどの参照型変数も持たない状態になってしまいます

 この状態になると、「後に作ったインスタンス」はもう操作できません
 参照は、インスタンスを操作する唯一の方法です。参照がなければ、たとえインスタンスが存在していても、もう操作できません。インスタンスの参照を再取得する方法もありません。参照だけが、インスタンスの「命綱」なのです。

 このようにして、プログラム側でインスタンスを操作できなくなると、「ガベージコレクタ」というものがそのインスタンスを削除します。
 「ガベージコレクタ(garbage collector)」とは「ごみ拾い」という意味で、その名の通り「ごみ」となってしまったインスタンスを回収して消去します。

2.4 参照されないインスタンスはどうなるの?
このページは、Java言語を用いたオブジェクト指向プログラミングのチュートリアル解説を行う「Javaのオブジェクト指向入門」の一ページです。
詳しい説明は「Javaのオブジェクト指向入門」目次をご覧ください。