web-dev-qa-db-ja.com

デストラクタを定義する方法は?

    public class A {

    double wage;

    A(double wage){
    this.wage=wage;
    }

    }

//このコードでは、コンストラクタとデストラクタを定義することになっています。

  • デストラクタを定義するためのコードは何ですか?
6
ema

Javaにはno destructorsがありますが、回避策としてメソッド Object#finalize() を使用できます。

Javaプログラミング言語は、どのスレッドが特定のオブジェクトのfinalizeメソッドを呼び出すかを保証しません。ただし、finalizeを呼び出すスレッドは、finalizeが呼び出されたときに、ユーザーに表示される同期ロックを保持しないことが保証されています。キャッチされなかった例外がfinalizeメソッドによってスローされた場合、例外は無視され、そのオブジェクトのファイナライズは終了します。

class Book {
  @Override
  public void finalize() {
    System.out.println("Book instance is getting destroyed");
  }
}

class Demo {
  public static void main(String[] args) {
    new Book();//note, its not referred by variable
    System.gc();//gc, won't run for such tiny object so forced clean-up
  }
}

出力:

Book instance is getting destroyed

System.gc()

ガベージコレクターを実行します。 gcメソッドを呼び出すと、Java仮想マシンは、現在占有しているメモリをすばやく再利用できるようにするために、未使用のオブジェクトのリサイクルに労力を費やしていることがわかります。制御がメソッド呼び出しから戻ると、Java仮想マシンは、破棄されたすべてのオブジェクトからスペースを再利用するために最善を尽くしました。

System.gc()の呼び出しは、実質的に次の呼び出しと同等です。

Runtime.getRuntime()。gc()

Object#finalize()

ガベージコレクションがオブジェクトへの参照がこれ以上ないと判断したときに、オブジェクトのガベージコレクターによって呼び出されます。サブクラスは、finalizeメソッドをオーバーライドして、システムリソースを破棄したり、その他のクリーンアップを実行したりします。

7
user2575725

独自のメソッドを作成して使用します。 finalizeメソッドをオーバーライドすることはお勧めしません。

2
igreenfield