Java-类-垃圾回收和finalize方法

时间:2020-02-23 14:36:25  来源:igfitidea点击:

在本教程中,我们将学习Java编程语言中的垃圾回收和finalize方法。

Java中的垃圾回收是什么?

垃圾回收是一种在不存在对对象的引用的情况下自动取消分配给该对象的内存空间的技术。

在像C ++这样的编程语言中,我们必须手动释放分配给对象的内存空间,而不是Java。

因此,当我们使用new关键字实例化一个对象时,一定大小的内存会动态分配给该对象,并且该内存位置的引用会保存在object变量中。

例如,如果我们有一个类" Awesome",并且实例化了一个对象" person",那么将为新创建的对象分配一个存储空间,并且对该存储空间的引用将保存在该对象中。

Awesome person = new Awesome();

现在,如果将" person"对象的值设置为" null",则分配的内存空间的引用将丢失。

person = null;

Java检查不再被引用的这种动态分配的内存空间,并假定不再需要它们,因此它将回收分配的空间。

在我们的程序执行期间,Java中的垃圾回收不定期发生,并且Java运行时实现对垃圾回收的方法有所不同。
因此,不能保证垃圾回收会在执行代码时发生。
但是我们不必担心在编写代码时释放内存空间,因为最后它会由Java处理。

finalize方法

在销毁对象之前,我们可能需要执行一些最终任务,例如释放非Java资源(例如文件句柄)。
为此,我们在要销毁对象之前执行的类中创建" finalize"方法。

语法

protected void finalize() {
  //some code ...
}

Java运行时在回收对象之前调用该类的finalize方法。

在下面的示例中,我们将创建一个具有构造函数,方法和finalize方法的" Awesome"类。

class Awesome {

  //member variable
  int awesomeness;
  
  //constructor
  Awesome(int awesomeness) {
    System.out.println("Inside the Awesome class constructor.");
    this.awesomeness = awesomeness;
    System.out.println("Awesomeness set!");
  }

  //method
  public int getAwesomeness() {
    return this.awesomeness;
  }

  //finalize
  protected void finalize() {
    System.out.println("Inside the Awesome class finalize method...");
    System.out.println("Object getting destroyed... Bye...");
  }
}

class AwesomeExample {
  public static void main(String[] args) {
    //create an awesome object
    Awesome obj = new Awesome(10);

    //now print the awesomeness
    System.out.println("Awesomeness of the object is " + obj.getAwesomeness());
  }
}
$javac AwesomeExample.java 
$java AwesomeExample
Inside the Awesome class constructor.
Awesomeness set!
Awesomeness of the object is 10

注意!在以上输出中,Java运行时未调用finalize方法,这意味着未发生垃圾回收。
如果它被调用,那么我们将看到来自finalize方法的消息。