>  기사  >  Java  >  자바의 소멸자

자바의 소멸자

WBOY
WBOY원래의
2024-08-30 15:26:431117검색

Java의 소멸자는 Java의 finalize 메소드를 통해 학습할 수 있습니다. 개념은 finalize 메소드와 동일합니다. Java는 가비지 컬렉션의 도움으로 소멸자를 제외한 모든 항목에서 작동합니다. 따라서 소멸자를 호출해야 하는 경우 finalize 메소드를 사용하면 됩니다. 이 방법은 가비지 수집에 의존하므로 독립적이지 않습니다. 가비지 컬렉터는 힙 영역에서 사용하지 않는 객체를 삭제하거나 파기하는 스레드입니다. 객체가 파일에 연결되어 있거나 일부 데이터베이스 애플리케이션 또는 네트워크 연결이 있다고 가정하면 객체를 삭제하거나 삭제하기 전에 가비지 수집이 수행되기 전에 이러한 리소스와 관련된 모든 연결을 닫아야 합니다. 이러한 함수 닫기는 finalize 메소드를 호출하여 수행됩니다.

자바의 소멸자 정의

“ 소멸자는 객체가 소멸될 때 호출되는 메서드입니다. “ 소멸자의 주요 목표는 할당된 메모리를 확보하고 열린 파일 닫기, 데이터베이스 연결 닫기, 네트워크 리소스 닫기 등과 같은 리소스를 정리하는 것입니다.

광고 이 카테고리에서 인기 있는 강좌 JAVA MASTERY - 전문 분야 | 78 코스 시리즈 | 15가지 모의고사

구문

class Object
{
protected void finalize()
{
//statements like the closure of database connection
}
}

Java에서 소멸자는 어떻게 작동하나요?

소멸자에는 C++의 소멸자와 유사한 java의 finalize() 메서드가 있습니다. 객체가 생성되면 힙 메모리에 저장됩니다. 이는 기본 스레드 또는 하위 스레드에서 액세스할 수 있습니다. 따라서 이러한 개체가 기본 스레드나 해당 하위 스레드에서 더 이상 사용되지 않으면 가비지 수집 대상이 되며 획득한 메모리는 이제 생성되는 새 개체에서 사용할 수 있게 됩니다. 객체가 가비지 수집기에 의해 수집된 가비지이기 전에 JRE(Java Runtime Environment)는 finalize() 메서드를 호출하여 입출력 스트림, 데이터베이스 연결, 네트워크 연결 등을 닫습니다. 호출된 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() 메서드는 한 번만 호출됩니다.
  3. finalize() 메서드를 재정의하려면 finalize 메서드를 명시적으로 호출해야 합니다.
  4. GC()는 Garbage Collection을 실행하는 JVM의 서비스입니다. 힙 메모리가 가득 차서 새로 도착하는 객체에 대한 메모리가 필요할 때 호출됩니다.
  5. JVM은 finalize 메소드에서 발생하는 확인되지 않은 예외를 제외한 모든 예외를 무시합니다.

예시 #1

아래 프로그램에서는 프로그램에 존재하는 finalize 메서드 대신 String 클래스에 해당하는 finalizes 메서드가 호출됩니다. 여기에서는 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 ");
}
}

출력:

자바의 소멸자

예시 #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 ");
}
}

출력:

자바의 소멸자

예시 #3

아래 프로그램에서는 생성된 객체 수에 따라 내부적으로 finalize를 호출했습니다.

코드

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");
}
}

출력:

자바의 소멸자

예시 #4

아래 프로그램에서는 두 개의 개체가 생성되고 두 개체가 모두 동일한 항목을 가리키므로 finalize가 한 번 호출됩니다.

코드:

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");
}
}

출력:

자바의 소멸자

예시 #5

아래 프로그램에서는 finalize 메소드가 명시적으로 두 번 호출되고 내부적으로도 호출됩니다.

코드

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 ");
}
}

출력:

자바의 소멸자

예시 #6

아래 프로그램에서는 명시적으로 호출된 대로 finalize 메소드에서 산술 예외가 호출되어 추가로 예외가 발생하고 나머지 프로그램의 실행이 중지됩니다.

코드:

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);
}
}

출력:

자바의 소멸자

예 #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:

자바의 소멸자

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.

위 내용은 자바의 소멸자의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:자바의 생성자다음 기사:자바의 생성자