Löschen eines Objekts in Java

Rupam Yadav 12 Oktober 2023
  1. Java Löschen ein Object durch Referenzierung auf null
  2. Java Löschen eines in einem Scope eingeschlossenen Objekts durch Referenzierung auf null
Löschen eines Objekts in Java

In den folgenden Beispielen lernen wir, wie man ein Objekt in Java löscht und den Garbage Collector verwendet.

Java Löschen ein Object durch Referenzierung auf null

Im ersten Beispiel zum Löschen eines Java-Objekts erstellen wir eine Klasse mit einem Konstruktor, der die Variablen name und age initialisiert. In der Methode main wird ein object der Klasse User erzeugt, und es werden Werte für name und age übergeben. Nachdem das object nun initialisiert wurde, können wir es benutzen, um age zu erhalten und es zu vergleichen, um eine Nachricht anzuzeigen. Aber danach wollen wir myObject löschen, damit es nicht weiter verwendet werden kann.

Um dies zu tun, initialisieren wir myObject noch einmal, aber mit null. Sobald myObject null ist, können wir es nicht mehr verwenden, um eine seiner Methoden oder Variablen aufzurufen, und es wird eine Exception werfen, wenn wir dies tun. Mit System.gc() wird jeglicher übriggebliebener Müll eingesammelt, so dass keine leeren Felder oder Objekte mehr vorhanden sind, die den Speicher freigeben.

Wir können sehen, dass es in der Klasse User eine Methode finalize() gibt. Es handelt sich um eine überschriebene Methode, die auf dem Objekt aufgerufen wird, bevor der Garbage gesammelt wird.

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.");
  }
}

Ausgabe:

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

Java Löschen eines in einem Scope eingeschlossenen Objekts durch Referenzierung auf null

In dem unten gezeigten Code haben wir eine Klasse Student mit drei Datenmitgliedern, denen über den parametrisierten Konstruktor der Klasse Werte zugewiesen werden. Sie hat eine Methode showDetails() und eine Methode showNextIndex(). Außerdem verfügt sie über die Methode finalize(), um den Index des nächsten Schülers anzuzeigen.

Neue Objekte der Klasse Student werden mit dem Schlüsselwort new erzeugt. Die Methoden der Klasse Student werden für die Objekte student1 und student2 aufgerufen. Später im Code haben wir weitere Objekte der Klasse Student innerhalb eines Bereichs erstellt. Nachdem wir sie benutzt haben, rufen wir System.gc() auf, was die JVM auffordert, die beiden in diesem Bereich erzeugten Objekte zu garbage collect.

Der nextIndex-Wert wird vor dem Betreten des Bereichs auf 3 inkrementiert, und vor dem Verlassen des Bereichs auf 5. Um den nextIndex-Wert zu dekrementieren, wird die Methode finalize() mit System.runFinalization() zweimal für den Wert 5 aufgerufen, bevor die Objekte garbage collected werden.

Anschließend wird der korrekte nextIndex-Wert angezeigt, wobei die Werte, die sich innerhalb des Bereichs befanden, ausgeschlossen werden.

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();
  }
}

Ausgabe:

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

Verwandter Artikel - Java Object