【问题标题】:How to define destructors?如何定义析构函数?
【发布时间】:2015-07-01 02:01:03
【问题描述】:
    public class A {

    double wage;

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

    }

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

  • 定义析构函数的代码是什么?

【问题讨论】:

  • 你使用什么语言?
  • @JustinNiessner 我正在使用 java
  • java中没有析构函数
  • Is there a destructor for Java? 的可能重复项
  • @ema - 鉴于 Java 中没有析构函数,我假设您的意思是覆盖 finalize 方法?

标签: java oop destructor


【解决方案1】:

在 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 Virtual 机器已尽最大努力从所有丢弃的空间中回收 对象。

调用 System.gc() 实际上等同于调用:

Runtime.getRuntime().gc()

Object#finalize()

垃圾回收时由对象上的垃圾回收器调用 确定不再有对该对象的引用。一个子类 覆盖 finalize 方法以释放系统资源或 执行其他清理。

【讨论】:

  • 请给我看一下如何使用这个方法的代码
  • 我在它的身体里做什么
  • System.gc() 是做什么的?而且我没有看到这里使用 finalize() 方法
  • @ema System.gc() 在java中调用垃圾收集器
  • @AnkurAnand 它只是询问要运行的 gc,而不是实际运行它。
【解决方案2】:

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

【讨论】:

  • 在我自己的方法中,如果我传递对象,只有它的引用会被销毁而不是对象
  • 如果你有像套接字这样的资源需要关闭,你应该定义你的close方法并关闭套接字等,然后在释放指向对象的指针之前调用这个方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2013-04-26
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多