参照がなくなったら?
質問:インスタンスを操作するための参照がなくなったら、そのインスタンスはどうなるの?
解答:操作できなくなり、いずれ消えます。
参照型変数内の参照は、他の参照で上書きすることができます。
そのため、次のプログラムのように、あるインスタンスが「どの参照型変数も参照を持たない」という状態になることがあります。
// 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変数が指していたインスタンスは、参照がないため
// もう操作できません。
}
}
/**
* フィールド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 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)」とは「ごみ拾い」という意味で、その名の通り「ごみ」となってしまったインスタンスを回収して消去します。