首页 > Java > java教程 > Java 中的析构函数

Java 中的析构函数

WBOY
发布: 2024-08-30 15:26:43
原创
1152 人浏览过

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中有一个finalize()方法,与C++中的析构函数类似。当对象被创建时,它们被存储在堆内存中。这些可由主线程或子线程访问。因此,当主线程或其子线程不再使用这些对象时,它们就有资格进行垃圾回收,并且现在获取的内存可供创建的新对象使用。在对象被垃圾收集器收集之前,JRE(Java Runtime Environment)会调用finalize()方法来关闭输入输出流、数据库连接、网络连接等。注意,调用的finalize方法是受保护的。为什么 Finalize 是受保护的,因为它既可以被基类调用,也可以被派生类调用? Finalize 方法存在于 Object 类中。因此,如果您想从其他对象调用此 Finalize 方法,您可以将其更改为 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()是JVM执行垃圾回收的一个服务;当堆内存已满并且需要内存来容纳新到达的对象时调用它。
  5. JVM 会忽略除了 Finalize 方法中发生的未经检查的异常之外的所有异常。

示例#1

在下面的程序中,调用了 String 类相应的 Finalizes 方法,而不是程序中存在的 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

在下面的程序中,根据创建的对象数量在内部调用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");
}
}
登录后复制

输出:

Java 中的析构函数

示例#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");
}
}
登录后复制

O输出:

Java 中的析构函数

示例#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 ");
}
}
登录后复制

输出:

Java 中的析构函数

示例 #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);
}
}
登录后复制

输出:

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中文网其他相关文章!

相关标签:
来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板