Javaのデストラクタ

WBOY
リリース: 2024-08-30 15:26:43
オリジナル
1117 人が閲覧しました

Java のデストラクターは、Java の Finalize メソッドで学習できます。考え方はfinalizeメソッドと同じです。 Java は、ガベージ コレクションの助けを借りてデストラクターを除いてすべて機能します。したがって、デストラクターを呼び出す必要がある場合は、finalize メソッドを使用して実行できます。このメソッドはガベージ コレクションに依存しているため、独立していません。ガベージ コレクターは、ヒープ領域内の未使用のオブジェクトを削除または破棄するスレッドです。オブジェクトがファイルに接続されている場合、またはデータベース アプリケーションやネットワーク接続がある場合、オブジェクトを削除または破棄する前に、ガベージ コレクションが実行される前に、これらのリソースに関連するすべての接続を閉じる必要があります。この関数の終了は、finalize メソッドを呼び出すことによって行われます。

Java のデストラクター の定義

「デストラクターは、オブジェクトの破棄が行われるときに呼び出されるメソッドです。 “ デストラクターの主な目的は、割り当てられたメモリを解放し、開いているファイルのクローズ、データベース接続のクローズ、ネットワーク リソースのクローズなどのリソースをクリーンアップすることです。

広告 このカテゴリーの人気コース JAVA マスタリー - スペシャライゼーション | 78 コース シリーズ | 15 回の模擬テスト

構文

class Object
{
protected void finalize()
{
//statements like the closure of database connection
}
}
ログイン後にコピー

Java ではデストラクターはどのように機能しますか?

Java のデストラクターには、C++ のデストラクターに似た Finalize() メソッドがあります。オブジェクトが作成されると、それらはヒープ メモリに保存されます。これらには、メインスレッドまたは子スレッドからアクセスできます。したがって、これらのオブジェクトがメインスレッドまたはその子スレッドによって使用されなくなると、それらはガベージコレクションの対象となり、取得されたメモリは作成される新しいオブジェクトによって使用できるようになります。オブジェクトがガベージ コレクターによってガベージ コレクションされる前に、JRE (Java ランタイム環境) は Finalize() メソッドを呼び出して、入出力ストリーム、データベース接続、ネットワーク接続などを閉じます。呼び出される Finalize メソッドは保護されていることに注意してください。 。 Finalize は基本クラスまたは派生クラスのどちらからも呼び出すことができるのに、なぜ保護されているのでしょうか? Objectクラスにはfinalizeメソッドが存在します。したがって、このファイナライズ メソッドを他のオブジェクトから呼び出したい場合は、これを protected に public に変更できます。

構文:

protected void finalize throws Throwable()
{
//Keep some resource closing operations here
}
ログイン後にコピー

finalize() のメソッド

  1. finalize() メソッドは、java.lang.Object クラスの定義に従って保護されています。
  2. finalize() メソッドは 1 回だけ呼び出されます。
  3. finalize() メソッドをオーバーライドするには、finalize メソッドを明示的に呼び出す必要があります。
  4. GC() は、ガベージ コレクションを実行するための JVM のサービスです。ヒープ メモリがいっぱいで、新しく到着するオブジェクト用のメモリが必要な場合に呼び出されます。
  5. JVM は、finalize メソッドで発生する未チェック例外を除くすべての例外を無視します。

例 #1

以下のプログラムでは、プログラム内に存在するfinalizeメソッドの代わりに、Stringクラスに対応するfinalizeメソッドが呼び出されます。ここで、finalize メソッドがオーバーライドされます。

コード:

public class Demo
{
public static void main(String[] args)
{
Integer i = new Integer(2);
i = null;
System.gc();
System.out.println("In the Main Method");
}
protected void finalize()
{
System.out.println("object is garbage collected ");
}
}
ログイン後にコピー

出力:

Javaのデストラクタ

例 #2

以下のプログラムでは、finalize メソッドが内部的に呼び出されます。明示的な呼び出しは必要ありません。

コード

public class Demo
{
public static void main(String[] args)
{
Demo dm = new Demo();
dm = null;
System.gc();
System.out.println("In the Main Method");
}
protected void finalize()
{
System.out.println("object is garbage collected ");
}
}
ログイン後にコピー

出力:

Javaのデストラクタ

例 #3

以下のプログラムでは、作成されたオブジェクトの数に応じて内部的にファイナライズが呼び出されています。

コード

public class NewProgram{
public void finalize(){
System.out.println("object is garbage collected");
}
public static void main(String args[]){
NewProgram np1=new NewProgram(); //first instantiation of Class NewProgram
NewProgram np2=new NewProgram(); //second instantiation of Class NewProgram
np1=null;
np2=null;
System.gc();
System.out.println("In the Main Method");
}
}
ログイン後にコピー

出力:

Javaのデストラクタ

例 #4

以下のプログラムでは、2 つのオブジェクトが作成され、両方のオブジェクトが同じものを指しているため、finalize が 1 回呼び出されます。

コード:

public class NewProgram{
public void finalize(){
System.out.println("garbage collected");
}
public static void main(String args[]){
NewProgram np1=new NewProgram(); //first instantiation of Class NewProgram
NewProgram np2=new NewProgram(); //second instantiation of Class NewProgram
np1 = np2; // both now pointing to same object
System.gc();
System.out.println("in the Main Method");
}
}
ログイン後にコピー

O出力:

Javaのデストラクタ

例 #5

以下のプログラムでは、finalize メソッドが明示的に 2 回、両方とも内部的に呼び出されます。

コード

public class Demo
{
public static void main(String[] args)
{
Demo dm = new Demo();
dm.finalize();
dm = null;
System.gc();
System.out.println("In the Main Method");
}
protected void finalize()
{
System.out.println("garbage collected ");
}
}
ログイン後にコピー

出力:

Javaのデストラクタ

例 #6

以下のプログラムでは、明示的に呼び出されたファイナライズ メソッドで算術例外が呼び出されます。これによりさらに例外が発生し、残りのプログラムの実行が停止されます。

コード:

public class Demo
{
public static void main(String[] args)
{
Demo dm = new Demo();
dm.finalize();
dm = null;
System.gc();
System.out.println("In the Main Method");
}
protected void finalize()
{
System.out.println("garbage collected ");
System.out.println(10 / 0);
}
}
ログイン後にコピー

出力:

Javaのデストラクタ

例 #7

以下のプログラムでは、明示的に呼び出されず、残りのプログラムの実行が継続されるため、呼び出される例外はありません。

Code:

public class Demo
{
public static void main(String[] args)
{
Demo dm = new Demo();
dm = null;
System.gc();
System.out.println("In the Main Method");
}
protected void finalize()
{
System.out.println("garbage collected ");
System.out.println(10 / 0);
}
}
ログイン後にコピー

Output:

Javaのデストラクタ

Advantages of Destructor in Java

  1. The destructor destroys the value created by the constructor to space in heap memory.
  2. Destructor is always called at the end of the program.
  3. Destructor is never overloaded destructor doesn’t take any argument.
  4. No need to define our constructor; the compiler creates for us one.

Conclusion

I hope this article was interesting and informative both for you to learn the topic. This article given has covered almost all the topics you are looking for, and I hope fulfills all of your requirements.

以上がJavaのデストラクタの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!