HOWTO · Java

在 Java 中删除一个对象

本书通过两个实例介绍了如何删除一个 Java 对象。

本页内容

我们将在下面的例子中学习如何在 Java 中删除一个对象和使用垃圾回收器。

Java 通过引用 null 来删除对象

在第一个删除 Java 对象的例子中,我们创建了一个带有构造函数的类,该构造函数初始化了变量 name 和 age。在 main 方法中,创建了一个 User 类的对象,并传递了 name 和 age 的值。现在,object 已经被初始化,我们可以用它来获取 age,并进行比较来显示一条消息。但是在这之后,我们要删除 myObject,以便不再使用。

要做到这一点,我们再次初始化 myObject,但需要使用 null。一旦 myObject 是 null,我们就不能使用它来调用它的任何方法或变量,如果我们这样做,它将抛出一个异常。System.gc() 用于收集任何剩余的垃圾,这样就不会有空字段或对象剩下来释放内存。

我们可以看到,在 User 类中有一个 finalize() 方法。它是一个重载方法,在收集垃圾之前对对象进行调用。

public class JavaDeleteObject {
  public static void main(String[] args) {
    User myObject = new User("John", 30);
    int userAge = myObject.age;

    if (userAge > 25) {
      System.out.println("User age is : " + userAge);
    } else {
      System.out.println("User age is less than 25 : " + userAge);
    }
    myObject = null;
    System.gc();

    System.out.println(myObject.age);
  }
}

class User {
  String name;
  int age;

  User(String n, int a) {
    name = n;
    age = a;
  }

  protected void finalize() {
    System.out.println("Object is garbage collected.");
  }
}

输出:

User age is : 30
Object is garbage collected.
Exception in thread "main" java.lang.NullPointerException
	at com.company.JavaDeleteObject.main(JavaDeleteObject.java:18)

Java 通过将对象赋值为 null 来删除一个在限制范围内的对象

在下面的代码中,我们有一个 Student 类,它有三个数据成员,这些数据成员使用该类的参数化构造函数赋值。它有一个 showDetails() 方法和 showNextIndex() 方法。它还有 finalize() 方法来显示下一个学生的索引。

Student 类的新对象是用 new 关键字创建的。Student 类的方法在 student1 和 student2 对象上被调用。在后面的代码中,我们已经在一个范围内创建了更多的 Student 类对象。在使用它们之后,我们调用 System.gc(),要求 JVM 对这个作用域内创建的两个对象进行垃圾回收。

在进入作用域之前,nextIndex 值会递增到 3,在离开作用域之前是 5。为了减少 nextIndex 值,在对象被垃圾收集之前,使用 System.runFinalization() 方法对 5 值调用两次。

然后显示正确的 nextIndex 值,不包括范围内的值。

class Student {
  private int index;
  private String name;
  private int age;
  private static int nextIndex = 1;

  Student(String name, int age) {
    this.name = name;
    this.age = age;
    this.index = nextIndex++;
  }

  public void showDetails() {
    System.out.println("Student at Index : " + index + ", Student name: " + name + ", age: " + age);
  }

  public void showNextIndex() {
    System.out.println("Next Index: " + nextIndex);
  }

  protected void finalize() {
    --nextIndex;
  }
}

class UseStudent {
  public static void main(String[] args) {
    Student student1 = new Student("John", 23);
    Student student2 = new Student("Doe", 20);
    student1.showDetails();
    student2.showDetails();
    student1.showNextIndex();
    student2.showNextIndex();
    {
      Student student3 = new Student("Sam", 22);
      Student student4 = new Student("Ben", 21);
      student3.showDetails();
      student4.showDetails();
      student3.showNextIndex();
      student4.showNextIndex();

      student3 = student4 = null;
      System.gc();
      System.runFinalization();
    }
    student2.showNextIndex();
  }
}

输出:

Student at Index : 1, Student name: John, age: 23
Student at Index : 2, Student name: Doe, age: 20
Next Index: 3
Next Index: 3
Student at Index : 3, Student name: Sam, age: 22
Student at Index : 4, Student name: Ben, age: 21
Next Index: 5
Next Index: 5
Next Index: 3