在 Java 中刪除一個物件

Rupam Yadav 2023年10月12日
  1. Java 通過引用 null 來刪除物件
  2. Java 通過將物件賦值為 null 來刪除一個在限制範圍內的物件
在 Java 中刪除一個物件

我們將在下面的例子中學習如何在 Java 中刪除一個物件和使用垃圾回收器。

Java 通過引用 null 來刪除物件

在第一個刪除 Java 物件的例子中,我們建立了一個帶有建構函式的類,該建構函式初始化了變數 nameage。在 main 方法中,建立了一個 User 類的物件,並傳遞了 nameage 的值。現在,object 已經被初始化,我們可以用它來獲取 age,並進行比較來顯示一條訊息。但是在這之後,我們要刪除 myObject,以便不再使用。

要做到這一點,我們再次初始化 myObject,但需要使用 null。一旦 myObjectnull,我們就不能使用它來呼叫它的任何方法或變數,如果我們這樣做,它將丟擲一個異常。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 類的方法在 student1student2 物件上被呼叫。在後面的程式碼中,我們已經在一個範圍內建立了更多的 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
作者: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

相關文章 - Java Object