C++にはデストラクタがあります。デストラクタとはコンストラクタの逆で
インスタンスが破壊される時に呼ばれる関数です。しかしJavaにはデストラクタがありません。これは
Javaのインスタンスの破棄はガーベージコレクタに任されていて、インスタンスがいつ破壊されるか
わからないためです。
しかし、これでは不便なことがあります。例えばファイルを開いた場合はファイルをクローズするとか、
通信ポートを開いたらそれを閉じるといったメモリー以外のリソースを解放したい場合です。
このような場合は、Objectクラスのfinalize()メソッドをオーバーライドします。finalize()メソッドは
ガーベージコレクタによって、メモリーが解放される前に呼び出されるメソッドです。このメソッドを
オーバーライドし、その中でリソースの解放を行います。
このfinalize()メソッドもいつ呼ばれるかは保証されていません。インスタンスが参照されなくなったことが
確認され、実際にそのインスタンスが占有していたメモリーを解放される間のどこかで実行されることが保証
されているだけです。
また、ガーベージコレクタが不要になったインスタンスを発見し、まだfinalize()メソッドを実行していない
場合、SystemクラスのrunFinalize()メソッドを実行することで、finalize()の実行を
促すことができます。しかしrunFinalize()メソッドを実行したらすぐにfinalize()メソッドを実行するのではなく
実行するタイミングはJVMの判断に任されています。