Java-Interviewfragen

Java Interview Fragen

1. Einführung

Dieser Artikel enthält Antworten auf einige der wichtigsten Fragen zum Vorstellungsgespräch zu Core Java. Die Antworten auf einige von ihnen sind möglicherweise nicht eindeutig, sodass dieser Artikel zur Aufklärung beiträgt.

2. Fragen zur Core-Java-Sprache für Anfänger

Q1. Werden Daten in Java als Referenz oder als Wert übergeben?

Obwohl die Antwort auf diese Frage ziemlich einfach ist, kann diese Frage für Anfänger verwirrend sein. Lassen Sie uns zunächst klären, worum es bei der Frage geht:

  1. Passing by value – bedeutet, dass wira copy of an object als Parameter an eine Methode übergeben.

  2. Passing by reference – bedeutet, dass wira reference to an object als Parameter an eine Methode übergeben.

Um die Frage zu beantworten, müssen wir zwei Fälle analysieren. Sie stellen zwei Arten von Daten dar, die wir an eine Methode übergeben können: ein Grundelement und ein Objekt.

Wenn wir einer Methode Primitive übergeben, wird deren Wert in eine neue Variable kopiert. Bei Objekten wird der Wert der Referenz in eine neue Variable kopiert. So we can say that Java is a strictly pass-by-value language.

Mehr dazu erfahren Sie in einem unserer Artikel:Pass-By-Value as a Parameter Passing Mechanism in Java.

Q2. Was ist der Unterschied zwischen Import und statischen Importen?

Wir können reguläre Importe verwenden, um eine bestimmte Klasse oder alle Klassen zu importieren, die in einem anderen Paket definiert sind:

import java.util.ArrayList; //specific class
import java.util.*; //all classes in util package

Wir können sie auch verwenden, um öffentlich verschachtelte Klassen einer einschließenden Klasse zu importieren:

import com.example.A.*

Wir sollten uns jedoch bewusst sein, dass der obige Import die KlasseAelbst nicht importiert.

Es gibt auch statische Importe, mit denen wir statische Mitglieder oder verschachtelte Klassen importieren können:

import static java.util.Collections.EMPTY_LIST;

Der Effekt ist, dass wir die statische Variable EMPTY_LIST verwenden können, ohne dem vollständig qualifizierten Klassennamen voranzustellen, d. H. als ob es in der aktuellen Klasse deklariert wurde.

Q3. Welche Zugriffsmodifikatoren sind in Java verfügbar und wozu dienen sie?

Es gibt vier Zugriffsmodifikatoren inJava:

  1. Privat

  2. default (Paket)

  3. geschützt

  4. Öffentlichkeit

The private modifier assures that class members won’t be accessible outside the class. Kann auf Methoden, Eigenschaften, Konstruktoren und verschachtelte Klassen angewendet werden, jedoch nicht auf Klassen der obersten Ebene.

Im Gegensatz zum Modifikatorprivate können wir den Modifikatordefault auf alle Arten von Klassenmitgliedern und auf die Klasse selbst anwenden. Wir können die Sichtbarkeit vondefaultanwenden, indem wir überhaupt keinen Zugriffsmodifikator hinzufügen. If we use default visibility our class or its members will be accessible only inside the package of our class. Wir sollten berücksichtigen, dass der Standardzugriffsmodifikator nichts mit dem Schlüsselwortdefaultgemein hat.

Ähnlich wie beim Modifikatordefaultkönnen alle Klassen in einem Paket auf die Mitglieder vonprotectedzugreifen. What’s more, the protected modifier allows subclasses to access the protected members of a superclass, even if they are not within the same package. Wir können diesen Zugriffsmodifikator nicht auf Klassen anwenden, sondern nur auf Klassenmitglieder.

Der Modifikatorpublic kann zusammen mit dem Schlüsselwort class und allen Klassenmitgliedern verwendet werden. It makes classes and class members accessible in all packages and by all classes.

Wir können mehr im Artikel vonJava Access Modifierserfahren.

Q4. Welche anderen Modifikatoren sind in Java verfügbar und wozu dienen sie?

In Java sind fünf weitere Modifikatoren verfügbar:

  • statisch

  • Finale

  • abstrakt

  • synchronisiert

  • flüchtig

Diese steuern nicht die Sichtbarkeit.

Zunächst können wir das Schlüsselwortstaticauf Felder und Methoden anwenden. Static fields or methods are class members, whereas non-static ones are object members. Klassenmitglieder müssen keine Instanz aufrufen. Sie werden mit dem Klassennamen anstelle des Objektreferenznamens aufgerufen. This article geht detaillierter auf das Schlüsselwortstatic ein.

Dann haben wir das Schlüsselwortfinal. Wir können es mit Feldern, Methoden und Klassen verwenden. When final is used on a field, it means that the field reference cannot be changed. Es kann also nicht einem anderen Objekt zugewiesen werden. When final is applied to a class or a method, it assures us that that class or method cannot be extended or overridden. Das Schlüsselwortfinal wird inthis article ausführlicher erläutert.

Das nächste Schlüsselwort istabstract. Dieser kann Klassen und Methoden beschreiben. When classes are abstract, they can’t be instantiated. Stattdessen sollen sie in Unterklassen unterteilt werden. Wenn Methodenabstract sind, bleiben sie ohne Implementierung und können in Unterklassen überschrieben werden.

Das Schlüsselwortsynchronizedist möglicherweise das am weitesten fortgeschrittene. Wir können es sowohl mit der Instanz als auch mit statischen Methoden und Codeblöcken verwenden. When we use this keyword, we make Java use a monitor lock to provide synchronization on a given code fragment. Weitere Informationen zusynchronized finden Sie inthis article.

Das letzte Keyword, das wir diskutieren werden, istvolatile. Wir können es nur zusammen mit Instanzfeldern verwenden. It declares that the field value must be read from and written to main memory – bypassing the CPU cache. Alle Lese- und Schreibvorgänge für eine flüchtige Variable sind atomar. Das Schlüsselwort volatile wird inthis article ausführlich erläutert.

Q5. Was ist der Unterschied zwischen JDK, JRE und JVM?

JDK steht fürJava Development Kit, eine Reihe von Tools, die Entwickler zum Schreiben von Anwendungen in Java benötigen. Es gibt drei Arten von JDK-Umgebungen:

  • Standard Edition - Entwicklungskit zum Erstellen tragbarer Desktop- oder Serveranwendungen

  • Enterprise Edition - eine Erweiterung der Standard Edition mit Unterstützung für verteiltes Computing oder Webservices

  • Micro Edition - Entwicklungsplattform für eingebettete und mobile Anwendungen

Das JDK enthält zahlreiche Tools, diehelp programmers with writing, debugging or maintaining applications. Die beliebtesten sind ein Compiler (javac), ein Interpreter (java), ein Archivierer (jar) und ein Dokumentationsgenerator (javadoc).

JRE ist einJava Runtime Environment. Es ist Teil des JDK, aberit contains the minimum functionality to run Java applications. Es besteht ausJava Virtual Machine, Kernklassen und unterstützenden Dateien. Zum Beispiel hat es keinen Compiler.

JVM ist das Akronym fürJava Virtual Machine, eine virtuelle Maschine, die Programme ausführen kann, die zu Bytecode kompiliert wurden. Dies wird in der JVM-Spezifikation beschrieben, da es wichtig ist, die Interoperabilität zwischen verschiedenen Implementierungen sicherzustellen. The most important function of a JVM is to enable users to deploy the same Java application into different operating systems and environments without worrying about what lies underneath.

Weitere Informationen finden Sie im ArtikelDifference Between JVM, JRE, and JDK.

Q6. Was ist der Unterschied zwischen Stapel und Haufen?

Es gibt zwei Speicherbereiche, in denen alle Variablen und Objekte von der JVM gespeichert werden. Das erste ist dasstack und das zweite ist dasheap.

Diestack is a place where the JVM reserves blocks for local variables and additional data. Der Stapel ist eineLIFO-Struktur (last in first out). Dies bedeutet, dass bei jedem Aufruf einer Methode ein neuer Block für lokale Variablen und Objektreferenzen reserviert wird. Jeder neue Methodenaufruf reserviert den nächsten Block. Wenn die Ausführung der Methoden abgeschlossen ist, werden die Blöcke in umgekehrter Reihenfolge freigegeben, in der sie gestartet wurden.

Jeder neue Thread hat einen eigenen Stapel.

Wir sollten uns darüber im Klaren sein, dass der Stack viel weniger Speicherplatz hat als der Heap. Und wenn ein Stapel voll ist, wirft die JVM einStackOverflowError. Dies tritt wahrscheinlich auf, wenn ein schlechter rekursiver Aufruf vorliegt und die Rekursion zu tief geht.

Every new object is created on the Java heap which is used for a dynamic allocation. Es gibt eingarbage collector, das für das Löschen nicht verwendeter Objekte verantwortlich ist, die in junge (Kindergarten) und alte Räume unterteilt sind. Der Speicherzugriff auf den Heap ist langsamer als der Zugriff auf den Stack. Die JVM wirft einOutOfMemoryError, wenn der Heap voll ist.

Weitere Details finden Sie im Artikel vonStack Memory and Heap Space in Java.

Q7. Was ist der Unterschied zwischen denComparable andComparator-Schnittstellen?

Manchmal, wenn wir eine neue Klasse schreiben, möchten wir in der Lage sein, Objekte dieser Klasse zu vergleichen. Dies ist besonders hilfreich, wenn Sie sortierte Sammlungen verwenden möchten. Es gibt zwei Möglichkeiten, dies zu tun: mit derComparable-Schnittstelle oder mit derComparator-Schnittstelle.

Schauen wir uns zunächst dieComparable-Schnittstelle an:

public interface Comparable {
    int compareTo(T var1);
}

Wir sollten diese Schnittstelle durch die Klasse implementieren, deren Objekte wir sortieren möchten.

Es hat die MethodecompareTo()und gibt eine Ganzzahl zurück. Es können drei Werte zurückgegeben werden: -1, 0 und 1, was bedeutet, dass dieses Objekt kleiner, gleich oder größer als das verglichene Objekt ist.

Es ist erwähnenswert, dass die überschriebenecompareT0()-Methode mit derequals()-Methode übereinstimmen sollte.

Auf der anderen Seite können wir dieComparator-Schnittstelle verwenden. Es kann an diesort()-Methoden derCollection-Schnittstelle oder beim Instanziieren sortierter Sammlungen übergeben werden. Aus diesem Grund wird es hauptsächlich verwendet, um eine einmalige Sortierstrategie zu erstellen.

Darüber hinaus ist es auch nützlich, wenn wir eine Drittanbieter-Klasse verwenden, die die vergleichbare Schnittstelle nicht implementiert.

Wie die MethodecompareTo() sollten die überschriebenen Methodencompare()mit der Methodeequals()konsistent sein, sie können jedoch optional einen Vergleich mit Nullen ermöglichen.

Weitere Informationen finden Sie im ArtikelComparator and Comparable in Java.

Q8. Was ist dervoid-Typ und wann verwenden wir ihn?

Jedes Mal, wenn wir eine Methode in Java schreiben, muss sie einen Rückgabetyp haben. Wenn die Methode keinen Wert zurückgeben soll, können wir das Schlüsselwortvoidverwenden.

Wir sollten auch wissen, dass es eineVoid-Klasse gibt. Dies ist eine Platzhalterklasse, die beispielsweise bei der Arbeit mit Generika verwendet werden kann. Die KlasseVoidkann weder instanziiert noch erweitert werden.

Q9. Was sind die Methoden der Objektklasse und was tun sie?

Es ist wichtig zu wissen, welche Methoden dieObject-Klasse enthält und wie sie funktionieren. Es ist auch sehr hilfreich, wenn wir diese Methoden überschreiben möchten:

  • clone() - gibt eine Kopie dieses Objekts zurück

  • equals() - gibttrue zurück, wenn dieses Objekt dem als Parameter übergebenen Objekt entspricht

  • finalize() - Der Garbage Collector ruft diese Methode auf, während er den Speicher bereinigt

  • getClass() - gibt die Laufzeitklasse dieses Objekts zurück

  • hashCode() - gibt einen Hash-Code dieses Objekts zurück. We should be aware that it should be consistent with the equals() method

  • notify() - sendet eine Benachrichtigung an einen einzelnen Thread, der auf den Monitor des Objekts wartet

  • notifyAll() - sendet eine Benachrichtigung an alle Threads, die auf den Monitor des Objekts warten

  • toString() - gibt eine Zeichenfolgendarstellung dieses Objekts zurück

  • wait() - Es gibt drei überladene Versionen dieser Methode. Der aktuelle Thread wird gezwungen, die angegebene Zeit zu warten, bis ein anderer Threadnotify() odernotifyAll() für dieses Objekt aufruft.

Q10. Was ist eine Aufzählung und wie können wir sie verwenden?

Enum ist ein Klassentyp, mit dem Entwickler eine Reihe vordefinierter konstanter Werte angeben können. Um eine solche Klasse zu erstellen, müssen wir das Schlüsselwortenumverwenden. Stellen wir uns eine Anzahl von Wochentagen vor:

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

Um alle Konstanten zu durchlaufen, können wir die statische Methodevalues()verwenden. Darüber hinaus können wir mithilfe von Aufzählungen Elemente wie Eigenschaften und Methoden wie reguläre Klassen definieren.

Although it’s a special type of class, we can’t subclass it. Eine Aufzählung kann jedoch eine Schnittstelle implementieren.

Ein weiterer interessanter Vorteil vonEnums ist, dass sie threadsicher sind und daher häufig als Singletons verwendet werden.

Wir können mehr über Enums inone of our guides finden.

Q11. Was ista JAR?

JAR ist eine Verknüpfung fürJava archive. Es handelt sich um eine Archivdatei, die im ZIP-Dateiformat verpackt ist. Wir können es verwenden, um die Klassendateien und Hilfsressourcen einzuschließen, die für Anwendungen erforderlich sind. Es hat viele Funktionen:

  • Security – können wir JAR-Dateien digital signieren

  • Compression – Bei Verwendung einer JAR können Dateien für eine effiziente Speicherung komprimiert werden

  • Portability – können wir dieselbe JAR-Datei auf mehreren Plattformen verwenden

  • Versioning – JAR-Dateien können Metadaten zu den darin enthaltenen Dateien enthalten

  • Sealing – können wir ein Paket innerhalb einer JAR-Datei versiegeln. Dies bedeutet, dass alle Klassen aus einem Paket in derselben JAR-Datei enthalten sein müssen

  • Extensions – können wir das JAR-Dateiformat verwenden, um Module oder Erweiterungen für vorhandene Software zu verpacken

Q12. Was istaNullPointerException?

NullPointerException ist wahrscheinlich die häufigste Ausnahme in der Java-Welt. Dies ist eine ungeprüfte Ausnahme und verlängert somitRuntimeException. Wir sollten nicht versuchen, damit umzugehen.

Diese Ausnahme wird ausgelöst, wenn versucht wird, auf eine Variable zuzugreifen oder eine Methode eines Nullverweises aufzurufen, beispielsweise wenn:

  • Aufrufen einer Methode einer Nullreferenz

  • Festlegen oder Abrufen eines Felds mit einer Nullreferenz

  • Überprüfen der Länge einer Null-Array-Referenz

  • Festlegen oder Abrufen eines Elements einer Null-Array-Referenz

  • null werfen

Q13. Was sind zwei Arten von Casting in Java? Welche Ausnahme darf beim Casting geworfen werden? Wie können wir das vermeiden?

Wir können zwei Arten von Casting in Java unterscheiden. We can do upcasting which is casting an object to a supertype or downcasting which is casting an object to a subtype.

Upcasting ist sehr einfach, da wir das immer können. Zum Beispiel können wir die Instanz vonStringauf den TypObjecthochstufen:

Object str = "string";

Alternativ können wirdowncast eine Variable sein. Es ist nicht so sicher wie Upcasting, da es eine Typprüfung beinhaltet. Wenn wir ein Objekt falsch umwandeln, wirft die JVM zur Laufzeit einClassCastExcpetion. Fortunately, we can use the instanceof keyword to prevent invalid casting:

Object o = "string";
String str = (String) o; // it's ok

Object o2 = new Object();
String str2 = (String) o2; // ClassCastException will be thrown

if (o2 instanceof String) { // returns false
    String str3 = (String) o2;
}

Wir können mehr über Typ Castingin this article erfahren.

3. Fragen zur Core-Java-Sprache für fortgeschrittene Programmierer

Q1. Warum ist String eine unveränderliche Klasse?

Wir sollten wissen, dassString Objekte vonJVM anders behandelt werden als andere Objekte. Ein Unterschied besteht darin, dassString Objekte unveränderlich sind. It means that we can’t change them once we have created them. Es gibt mehrere Gründe, warum sie sich so verhalten:

  1. Sie werden instring pool gespeichert, einem speziellen Teil des Heapspeichers. Es ist dafür verantwortlich, viel Platz zu sparen.

  2. Die Unveränderlichkeit der KlasseStringgarantiert, dass sich der Hash-Code nicht ändert. Due to that fact, Strings can be effectively used as keys in hashing collections. Wir können sicher sein, dass wir aufgrund einer Änderung der Hash-Codes keine Daten überschreiben.

  3. Sie können sicher über mehrere Threads hinweg verwendet werden. No thread can change the value of a String object, so we get thread safety for free.

  4. Zeichenfolgen sind unveränderlich, um schwerwiegende Sicherheitsprobleme zu vermeiden. Sensible Daten wie Kennwörter können von einer unzuverlässigen Quelle oder einem anderen Thread geändert werden.

Wir können mehr über die Unveränderlichkeit von Stringsin this article erfahren.

Q2. Was ist der Unterschied zwischen dynamischer und statischer Bindung?

Beim Binden in Java wird ein Methodenaufruf dem richtigen Methodenhauptteil zugeordnet. In Java können zwei Arten von Bindungen unterschieden werden: statische und dynamische.

Der Hauptunterschied zwischen statischer Bindung und dynamischer Bindung besteht darin, dass die statische Bindung zur Kompilierungszeit und die dynamische Bindung zur Laufzeit erfolgt.

Static binding verwendet Klasseninformationen zum Binden. Es ist für die Auflösung von Klassenmitgliedern verantwortlich, dieprivate oderstatic undfinal Methoden und Variablen sind. Die statische Bindung bindet auch überladene Methoden.

Dynamic binding verwendet dagegen Objektinformationen, um Bindungen aufzulösen. Aus diesem Grund ist es für die Auflösung virtueller und überschriebener Methoden verantwortlich.

Q3. Was ist JIT?

JIT steht für "just in time". Es ist eine Komponente der JRE, die zur Laufzeit ausgeführt wird und die Leistung der Anwendung erhöht. Specifically, it’s a compiler which runs just after the program’s start.

Dies unterscheidet sich vom regulären Java-Compiler, der den Code lange vor dem Start der Anwendung kompiliert. JIT kann die Anwendung auf verschiedene Arten beschleunigen.

Beispielsweise ist der JIT-Compiler dafür verantwortlich, Bytecode im laufenden Betrieb in systemeigene Anweisungen zu kompilieren, um die Leistung zu verbessern. Außerdem kann der Code für die Ziel-CPU und das Betriebssystem optimiert werden.

Darüber hinaus hat es Zugriff auf viele Laufzeitstatistiken, die zum erneuten Kompilieren verwendet werden können, um eine optimale Leistung zu erzielen. Mit dieser Funktion können Sie auch einige globale Codeoptimierungen vornehmen oder den Code neu anordnen, um die Cache-Nutzung zu verbessern.

Q4. Was ist Reflection in Java?

Reflexion ist ein sehr leistungsfähiger Mechanismus in Java. Reflection ist ein Mechanismus der Java-Sprache, mit dem Programmierer den internen Status des Programms (Eigenschaften, Methoden, Klassen usw.) zur Laufzeit überprüfen oder ändern können. Das Paket java.lang.reflect enthält alle erforderlichen Komponenten für die Verwendung von Reflection.

Mit dieser Funktion können wir auf alle möglichen Felder, Methoden und Konstruktoren zugreifen, die in einer Klassendefinition enthalten sind. Wir können unabhängig von ihrem Zugriffsmodifikator auf sie zugreifen. So können wir beispielsweise auf private Mitglieder zugreifen. Dazu müssen wir ihre Namen nicht kennen. Wir müssen lediglich einige statische Methoden vonClass verwenden.

Es ist wichtig zu wissen, dass es eine Möglichkeit gibt, den Zugang durch Reflexion einzuschränken. Dazu können wir den Java-Sicherheitsmanager und die Java-Sicherheitsrichtliniendatei verwenden. Sie ermöglichen es uns, Klassen Berechtigungen zu erteilen.

Wenn wir mit Modulen seit Java 9 arbeiten, sollten wir wissen, dass wir standardmäßig keine Reflexion für Klassen verwenden können, die aus einem anderen Modul importiert wurden. Damit andere Klassen mithilfe von Reflection auf die privaten Mitglieder eines Pakets zugreifen können, müssen Sie die Berechtigung "Reflection" erteilen.

This article befasst sich eingehender mit Java Reflection.

Q5. Was ist der Classloader vona?

classloader ist eine der wichtigsten Komponenten in Java. Es ist ein Teil der JRE.

Einfach ausgedrückt ist classloader für das Laden von Klassen in die JVM verantwortlich. Wir können drei Typen von Klassenladern unterscheiden:

  • Bootstrap classloader – lädt die Java-Kernklassen. Sie befinden sich im Verzeichnis<JAVA_HOME>/jre/lib

  • Extension classloader – lädt Klassen, die sich in<JAVA_HOME>/jre/lib/ext oder in dem durch die Eigenschaftjava.ext.dirs definierten Pfad befinden

  • System classloader – lädt Klassen in den Klassenpfad unserer Anwendung

Ein Classloader lädt Klassen "on demand". Dies bedeutet, dass Klassen geladen werden, nachdem sie vom Programm aufgerufen wurden. Darüber hinaus kann ein Klassenladeprogramm eine Klasse mit einem bestimmten Namen nur einmal laden. Wenn dieselbe Klasse jedoch von zwei verschiedenen Klassenladeprogrammen geladen wird, schlagen diese Klassen bei einer Gleichheitsprüfung fehl.

Weitere Informationen zu Klassenladeprogrammen finden Sie im ArtikelClass Loaders in Java.

Q6. Was ist der Unterschied zwischen statischem und dynamischem Laden von Klassen?

Das statische Laden von Klassen findet statt, wenn zum Zeitpunkt der Kompilierung Quellklassen verfügbar sind. Wir können davon Gebrauch machen, indem wir Objektinstanzen mit dem Schlüsselwortnewerstellen.

Das dynamische Laden von Klassen bezieht sich auf eine Situation, in der zum Zeitpunkt der Kompilierung keine Klassendefinition bereitgestellt werden kann. Dies können wir jedoch zur Laufzeit tun. Um eine Instanz einer Klasse zu erstellen, müssen wir die MethodeClass.forName()verwenden:

Class.forName("oracle.jdbc.driver.OracleDriver")

Q7. Was ist der Zweck derSerializable-Schnittstelle?

We can use the Serializable interface to enable serializability of a class, using Java’s Serialization API. Die Serialisierung ist ein Mechanismus zum Speichern des Status eines Objekts als Folge von Bytes, während die Deserialisierung ein Mechanismus zum Wiederherstellen des Zustands eines Objekts aus einer Folge von Bytes ist. Die serialisierte Ausgabe enthält den Status des Objekts und einige Metadaten zum Objekttyp und zu den Feldern.

Wir sollten wissen, dass Subtypen serialisierbarer Klassen auch serialisierbar sind. Wenn wir eine Klasse serialisierbar machen möchten, ihr Supertyp jedoch nicht serialisierbar ist, müssen wir zwei Dinge tun:

  • Implementieren Sie dieSerializable-Schnittstelle

  • Stellen Sie sicher, dass in der Superklasse ein Konstruktor ohne Argument vorhanden ist

Wir können mehr über Serialisierung inone of our articles lesen.

Q8. Gibt es einen Destruktor in Java?

In Java löscht der Garbage Collector die nicht verwendeten Objekte automatisch, um Speicherplatz freizugeben. Entwickler müssen die Objekte nicht zum Löschen markieren, was fehleranfällig ist. So it’s sensible Java has no destructors available.

Wenn die Objekte offene Sockets, offene Dateien oder Datenbankverbindungen enthalten,the garbage collector is not able to reclaim those resources. Wir können die Ressourcen inclose method freigeben undtry-finally syntax verwenden, um die Methode anschließend vor Java 7 aufzurufen, z. B. die E / A-KlassenFileInputStreamandFileOutputStream. As of Java 7, we can implement interface AutoCloseable and use try-with-resources statement to write shorter and cleaner code. Es ist jedoch möglich, dass die API-Benutzer vergessen, dieclose -Smethod aufzurufen, sodass diefinalize -Smethod und dieCleaner -Schlasse als Sicherheitsnetz fungieren. But please be cautioned they are not equivalent to the destructor.

It’s not assured both the finalize method and Cleaner class will run promptly. Sie haben sogar keine Chance zu laufen, bevor die JVM beendet wird. Obwohl wirSystem.runFinalization to nennen könnten, um vorzuschlagen, dass JVM diefinalize -Smethodik aller Objekte ausführt, die zur Finalisierung anstehen, ist dies immer noch nicht deterministisch.

Darüber hinaus kann diefinalize-Methode Leistungsprobleme, Deadlocks usw. verursachen. Weitere Informationen finden Sie in einem unserer Artikel:A Guide to the finalize Method in Java.

As of Java 9,Cleaner class is added to replace the finalize method wegen der Nachteile. Dadurch haben wir eine bessere Kontrolle über den Faden, der die Reinigungsvorgänge ausführt.

Die Java-Spezifikation weist jedoch auf das Verhalten von Bereinigern während der Implementierung vonSystem.exit is hin, und Java bietet keine Garantie dafür, ob Bereinigungsaktionen aufgerufen werden oder nicht.