ガベージ コレクタに関する Java の考え方の章を読んでいて、時々実行されている例を見つけました。しかし、私はその理由を理解できません。
public class Book {
boolean checkedOut = false;
Book(boolean checkOut) {
checkedOut = checkOut;
}
void checkIn() {
checkedOut = false;
}
@Override
protected void finalize() {
if (checkedOut) {
System.out.println("Error: checked out");
}
// Normally, you’ll also do this:
//super.finalize(); // Call the base-class version
}
public static void main(String[] args) {
Book novel = new Book(true);
// Proper cleanup:
novel.checkIn();
// Drop the reference, forget to clean up:
new Book(true);
// Force garbage collection & finalization:
System.gc();
}
}
への呼び出しSystem.gc()
は、メモリが不足していない場合でも、オブジェクトのファイナライズを強制する必要があります。
したがって、なぜプログラムはエラーを出力するのでしょうか? 要点がわかりません、分かりやすく説明していただけますか? GC が呼び出されるたびに finalize メソッドも実行されるので、チェックアウト エラーが毎回表示されるはずです。
ありがとう