如何定义析构函数?

6
    public class A {

    double wage;

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

    }

//在这段代码中,我需要定义构造函数和析构函数。

  • 如何定义析构函数的代码?

你使用的是什么编程语言? - Justin Niessner
@JustinNiessner 我正在使用Java。 - ema
Java中没有析构函数。 - Prasad Kharkar
2
可能是Java有析构函数吗?的重复问题。 - Andreas Fester
@ema - 鉴于 Java 中没有析构函数,我猜你是指覆盖 finalize 方法? - Justin Niessner
@JustinNiessner 我基本上想要一个方法,在Java中如果没有析构函数就可以销毁对象。 - ema
2个回答

8
在Java中,虽然没有析构函数,但你可以使用Object#finalize()方法来实现类似的功能。
需要注意的是,Java编程语言不能保证哪个线程会调用任何给定对象的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方法。子类可以覆盖finalize方法以处理系统资源或进行其他清理。


请展示一下如何使用这个方法的代码。 - ema
在它的主体中我该做什么? - ema
System.gc()是什么作用?我在这里没有看到使用finalize()方法。 - ema
@ema System.gc() 在Java中调用垃圾回收器。 - Ankur Anand
1
它只是请求运行垃圾回收,而不是实际运行它。 - giraffesyo

2

编写自己的方法并使用它。不建议覆盖finalize方法。


在我的方法中,如果我只传递对象,那么只有它的引用会被销毁,而不是对象本身。 - ema
如果您有需要关闭的资源,例如套接字,您应该定义自己的close方法并关闭套接字等,然后在释放对象指针之前调用此方法。 - igreenfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接