在 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
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