寿命
日本語 | 寿命 |
英語 | lifetime |
ふりがな | じゅみょう |
フリガナ | ジュミョウ |
変数やインスタンス等が存在しているその「期間」。
変数やインスタンスは、永遠に存在していると、プログラムを終了させない限りメモリを使用し続けることになってしまう。そこに新たな変数やインスタンスが作られたら、メモリが枯渇してしまう。
そこで、変数やインスタンスには「寿命」が存在し、プログラムの実行中に消えることとなる。
変数の場合、スコープから外れることで寿命となり、消える。
消えた変数にはアクセスできず、格納された値も消える。
インスタンスの場合、ガベージコレクションが削除しない限り寿命は来ない。
インスタンスの参照を格納する参照型変数が、スコープから外れて寿命が来ても、参照先のインスタンスはそのまま残り、ガベージコレクションが削除しない限り残る。
もし、インスタンスが「参照型変数の削除と共に寿命が来て消える」ことになってしまうと、インスタンスが複数の参照型変数から参照されていた場合、他の参照型変数も使えなくなってしまう。
こういった問題を避けるため、インスタンスは参照型変数の寿命とは無関係となっている。
変数やインスタンスは、永遠に存在していると、プログラムを終了させない限りメモリを使用し続けることになってしまう。そこに新たな変数やインスタンスが作られたら、メモリが枯渇してしまう。
そこで、変数やインスタンスには「寿命」が存在し、プログラムの実行中に消えることとなる。
変数の場合、スコープから外れることで寿命となり、消える。
消えた変数にはアクセスできず、格納された値も消える。
インスタンスの場合、ガベージコレクションが削除しない限り寿命は来ない。
インスタンスの参照を格納する参照型変数が、スコープから外れて寿命が来ても、参照先のインスタンスはそのまま残り、ガベージコレクションが削除しない限り残る。
もし、インスタンスが「参照型変数の削除と共に寿命が来て消える」ことになってしまうと、インスタンスが複数の参照型変数から参照されていた場合、他の参照型変数も使えなくなってしまう。
こういった問題を避けるため、インスタンスは参照型変数の寿命とは無関係となっている。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
{
// 変数は、ブロックの外に出ると
// (つまりスコープから外れると)
// なくなります。
int i = 100;
System.out.println( i );
// 100
}
// i = 200;
// コンパイルエラー:
// i は解決できません。
// つまり、iの寿命は上記のブロックの
// 中だけで、ブロックの外に出たら
// 寿命が尽きて消えてしまった、という
// わけです。
// 取っておくための参照。
Integer integerBackup = null;
{
// クラスの場合、参照型変数は
// なくなりますが、参照している
// インスタンスはなくなりません。
Integer integer = new Integer( 200 );
System.out.println( integer );
// 100
// 参照を「バックアップ」しておきます。
integerBackup = integer;
}
// integer = null;
// コンパイルエラー:
// integer は解決できません。
// この場合、寿命が尽きて消えたのは
// integer変数であって、そのinteger変数が
// 指し示していたIntegerクラスのインスタンスは
// なくなってません。ガベージコレクションが
// 削除するまでは寿命は尽きません。
// integerBackupにはそのインスタンスの参照が
// 入っているので、この参照からアクセスできます。
System.out.println( integerBackup );
// 200
// 逆に言うと、もし参照型変数の寿命が来ることで
// インスタンスも消えてしまうと、integerBackupの
// 中に入っている参照の指し示すインスタンスも
// 消えてしまうことになるため、いつの間にか
// integerBackupは使えなくなってしまいます。
// 他の言語、たとえばC言語やC++言語では
// こういう事があり得るため、それを避けるために
// Javaではガベージコレクションが削除する、
// というシステムになっています。
}
}
public class Sample
{
public static void main( String[] args )
{
{
// 変数は、ブロックの外に出ると
// (つまりスコープから外れると)
// なくなります。
int i = 100;
System.out.println( i );
// 100
}
// i = 200;
// コンパイルエラー:
// i は解決できません。
// つまり、iの寿命は上記のブロックの
// 中だけで、ブロックの外に出たら
// 寿命が尽きて消えてしまった、という
// わけです。
// 取っておくための参照。
Integer integerBackup = null;
{
// クラスの場合、参照型変数は
// なくなりますが、参照している
// インスタンスはなくなりません。
Integer integer = new Integer( 200 );
System.out.println( integer );
// 100
// 参照を「バックアップ」しておきます。
integerBackup = integer;
}
// integer = null;
// コンパイルエラー:
// integer は解決できません。
// この場合、寿命が尽きて消えたのは
// integer変数であって、そのinteger変数が
// 指し示していたIntegerクラスのインスタンスは
// なくなってません。ガベージコレクションが
// 削除するまでは寿命は尽きません。
// integerBackupにはそのインスタンスの参照が
// 入っているので、この参照からアクセスできます。
System.out.println( integerBackup );
// 200
// 逆に言うと、もし参照型変数の寿命が来ることで
// インスタンスも消えてしまうと、integerBackupの
// 中に入っている参照の指し示すインスタンスも
// 消えてしまうことになるため、いつの間にか
// integerBackupは使えなくなってしまいます。
// 他の言語、たとえばC言語やC++言語では
// こういう事があり得るため、それを避けるために
// Javaではガベージコレクションが削除する、
// というシステムになっています。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { { // 変数は、ブロックの外に出ると // (つまりスコープから外れると) // なくなります。 int i = 100; System.out.println( i ); // 100 } // i = 200; // コンパイルエラー: // i は解決できません。 // つまり、iの寿命は上記のブロックの // 中だけで、ブロックの外に出たら // 寿命が尽きて消えてしまった、という // わけです。 // 取っておくための参照。 Integer integerBackup = null; { // クラスの場合、参照型変数は // なくなりますが、参照している // インスタンスはなくなりません。 Integer integer = new Integer( 200 ); System.out.println( integer ); // 100 // 参照を「バックアップ」しておきます。 integerBackup = integer; } // integer = null; // コンパイルエラー: // integer は解決できません。 // この場合、寿命が尽きて消えたのは // integer変数であって、そのinteger変数が // 指し示していたIntegerクラスのインスタンスは // なくなってません。ガベージコレクションが // 削除するまでは寿命は尽きません。 // integerBackupにはそのインスタンスの参照が // 入っているので、この参照からアクセスできます。 System.out.println( integerBackup ); // 200 // 逆に言うと、もし参照型変数の寿命が来ることで // インスタンスも消えてしまうと、integerBackupの // 中に入っている参照の指し示すインスタンスも // 消えてしまうことになるため、いつの間にか // integerBackupは使えなくなってしまいます。 // 他の言語、たとえばC言語やC++言語では // こういう事があり得るため、それを避けるために // Javaではガベージコレクションが削除する、 // というシステムになっています。 } }