Java-sollicitatievragen

1. Inleiding

Dit artikel bevat antwoorden op enkele van de belangrijkste sollicitatiegesprekvragen over core Java. De antwoorden op sommige zijn misschien niet voor de hand liggend, dus dit artikel zal helpen om dingen op te helderen.

2. Vragen over de kern-Java-taal voor beginners

V1. Worden gegevens doorgegeven via referentie of op waarde in Java?

Hoewel het antwoord op deze vraag vrij eenvoudig is, kan deze vraag voor beginners verwarrend zijn. Laten we eerst verduidelijken waar de vraag over gaat:

  1. Waarde passeren - het betekent dat we slagen een kopie van een object als parameter in een methode.
  2. Passeren door middel van referentie - het betekent dat we slagen een verwijzing naar een object als parameter in een methode.

Om de vraag te beantwoorden, moeten we twee gevallen analyseren. Ze vertegenwoordigen twee soorten gegevens die we kunnen doorgeven aan een methode: een primitief en een object.

Wanneer we primitieven aan een methode doorgeven, wordt de waarde ervan naar een nieuwe variabele gekopieerd. Als het om objecten gaat, wordt de waarde van de referentie gekopieerd naar een nieuwe variabele. We kunnen dus zeggen dat Java een strikt pass-by-waarde taal.

We kunnen daar meer over leren in een van onze artikelen: Pass-By-Value als een mechanisme voor het doorgeven van parameters in Java.

Q2. Wat is het verschil tussen import en statische import?

We kunnen reguliere import gebruiken om een ​​specifieke klasse of alle klassen die in een ander pakket zijn gedefinieerd, te importeren:

importeer java.util.ArrayList; // import van specifieke klassen java.util. *; // alle klassen in het util-pakket

We kunnen ze ook gebruiken om openbaar geneste klassen van een omsluitende klasse te importeren:

importeer com.baeldung.A. *

We moeten er echter rekening mee houden dat de bovenstaande import de klasse niet importeert EEN zelf.

Er zijn ook statische importen waarmee we statische leden of geneste klassen kunnen importeren:

importeer statische java.util.Collections.EMPTY_LIST;

Het effect is dat we de statische variabele EMPTY_LIST kunnen gebruiken zonder de volledig gekwalificeerde klassenaam vooraf te laten gaan, d.w.z. alsof deze in de huidige klasse is gedeclareerd.

Q3. Welke toegangsmodificatoren zijn beschikbaar in Java en wat is hun doel?

Er zijn vier toegangsmodificatoren in Java:

  1. privaat
  2. standaard (pakket)
  3. beschermd
  4. openbaar

De privaat modifier zorgt ervoor dat klasleden niet toegankelijk zijn buiten de klas. Het kan worden toegepast op methoden, eigenschappen, constructors, geneste klassen, maar niet op klassen op het hoogste niveau zelf.

In tegenstelling tot de privaat modifier, kunnen we de standaard modificator voor alle typen klasleden en voor de klas zelf. We kunnen solliciteren standaard zichtbaarheid door helemaal geen toegangsmodificator toe te voegen. Als we standaard zichtbaarheid onze klas of haar leden zullen alleen toegankelijk zijn binnen het pakket van onze klas. We moeten in gedachten houden dat de standaard toegangsmodificator niets gemeen heeft met de standaard trefwoord.

Net als bij de standaard modifier, hebben alle klassen binnen één pakket toegang beschermd leden. Wat meer is, de beschermd modifier geeft subklassen toegang tot de beschermde leden van een superklasse, zelfs als ze niet in hetzelfde pakket zitten. We kunnen deze toegangsmodificator niet toepassen op klassen, alleen op klasleden.

De openbaar modifier kan samen met het class-sleutelwoord en alle klasleden worden gebruikt. Het maakt klassen en klasleden toegankelijk in alle pakketten en door alle klassen.

We kunnen meer leren in het artikel over Java Access Modifiers.

V4. Welke andere modificatoren zijn beschikbaar in Java en wat is hun doel?

Er zijn vijf andere modificatoren beschikbaar in Java:

  • statisch
  • laatste
  • abstract
  • gesynchroniseerd
  • vluchtig

Deze hebben geen invloed op de zichtbaarheid.

Allereerst kunnen we de statisch trefwoord voor velden en methoden. Statische velden of methoden zijn klassenleden, terwijl niet-statische velden objectleden zijn. Klasleden hebben geen instantie nodig om te worden aangeroepen. Ze worden aangeroepen met de klassenaam in plaats van met de objectreferentienaam. Dit artikel gaat dieper in op het statisch trefwoord.

Dan hebben we de laatste trefwoord. We kunnen het gebruiken met velden, methoden en klassen. Wanneer laatste wordt gebruikt op een veld, betekent dit dat de veldreferentie niet kan worden gewijzigd. Het kan dus niet opnieuw worden toegewezen aan een ander object. Wanneer laatste wordt toegepast op een klasse of methode, verzekert het ons dat die klasse of methode niet kan worden uitgebreid of overschreven. De laatste trefwoord wordt in dit artikel in meer detail uitgelegd.

Het volgende sleutelwoord is abstract. Deze kan klassen en methoden beschrijven. Wanneer klassen zijn abstract, ze kunnen niet worden geïnstantieerd. In plaats daarvan zijn ze bedoeld om te worden onderverdeeld. Wanneer methoden zijn abstract, blijven ze zonder implementatie en kunnen ze in subklassen worden overschreven.

De gesynchroniseerd trefwoord is wellicht het meest geavanceerd. We kunnen het zowel met de instantie als met statische methoden en codeblokken gebruiken. Wanneer we dit trefwoord gebruiken, laten we Java een monitorvergrendeling gebruiken om synchronisatie op een bepaald codefragment te bieden. Meer informatie over gesynchroniseerd vind je in dit artikel.

Het laatste sleutelwoord dat we gaan bespreken is vluchtig. We kunnen het alleen samen met instantievelden gebruiken. Het verklaart dat de veldwaarde moet worden gelezen van en geschreven naar het hoofdgeheugen - waarbij de CPU-cache wordt omzeild. Alle lees- en schrijfbewerkingen voor een vluchtige variabele zijn atomair. Het vluchtige trefwoord wordt in dit artikel in detail uitgelegd.

V5. Wat is het verschil tussen JDK, JRE en JVM?

JDK betekent Java-ontwikkelingskit, een set tools die ontwikkelaars nodig hebben om applicaties in Java te schrijven. Er zijn drie soorten JDK-omgevingen:

  • Standard Edition - ontwikkelkit voor het maken van draagbare desktop- of servertoepassingen
  • Enterprise Edition - een uitbreiding op de Standard Edition met ondersteuning voor gedistribueerde computers of webservices
  • Micro Edition - ontwikkelplatform voor embedded en mobiele applicaties

Er zijn tal van tools opgenomen in de JDK die help programmeurs bij het schrijven, debuggen of onderhouden van applicaties. De meest populaire zijn een compiler (Javac), een tolk (Java), een archiver (pot) en een documentatiegenerator (javadoc).

JRE is een Java Runtime-omgeving. Het is een onderdeel van de JDK, maar het bevat de minimale functionaliteit om Java-applicaties uit te voeren. Het bestaat uit een Java virtuele machine, kernklassen en ondersteunende bestanden. Het heeft bijvoorbeeld geen compiler.

JVM is de afkorting voor Java virtuele machine, wat een virtuele machine is die programma's kan uitvoeren die zijn gecompileerd naar bytecode. Het wordt beschreven door de JVM-specificatie, omdat het belangrijk is om de interoperabiliteit tussen verschillende implementaties te garanderen. De belangrijkste functie van een JVM is om gebruikers in staat te stellen dezelfde Java-applicatie in verschillende besturingssystemen en omgevingen te implementeren zonder zich zorgen te hoeven maken over wat eronder ligt.

Laten we voor meer informatie het artikel Verschil tussen JVM, JRE en JDK bekijken.

V6. Wat is het verschil tussen stapel en hoop?

Er zijn twee delen van het geheugen waar alle variabelen en objecten worden opgeslagen door de JVM. De eerste is de stapel en de tweede is de hoop.

De stapel is een plaats waar de JVM blokken reserveert voor lokale variabelen en aanvullende gegevens. De stapel is een LIFO (last in first out) structuur. Het betekent dat wanneer een methode wordt aangeroepen, er een nieuw blok wordt gereserveerd voor lokale variabelen en objectreferenties. Elke nieuwe methode-aanroep reserveert het volgende blok. Wanneer methoden hun uitvoering hebben voltooid, worden blokken vrijgegeven op de omgekeerde manier waarop ze zijn gestart.

Elke nieuwe thread heeft zijn eigen stapel.

We moeten ons ervan bewust zijn dat de stapel veel minder geheugenruimte heeft dan de heap. En als een stapel vol is, gooit de JVM een StackOverflowError. Het treedt waarschijnlijk op als er een slechte recursieve oproep is en de recursie te diep gaat.

Elk nieuw object wordt op Java gemaakt heap die wordt gebruikt voor een dynamische toewijzing. Er is een gvuilnisman die verantwoordelijk is voor het wissen van ongebruikte objecten die zijn onderverdeeld in jonge (kinderkamer) en oude ruimtes. Geheugentoegang tot de heap is langzamer dan toegang tot de stapel. De JVM gooit een Onvoldoende geheugen fout als de hoop vol is.

We kunnen meer details vinden in het artikel Stack Memory en Heap Space in Java.

V7. Wat is het verschil tussen de Vergelijkbaar en Comparator Interfaces?

Als we een nieuwe klasse schrijven, willen we soms objecten van die klasse kunnen vergelijken. Dit is vooral handig als we gesorteerde verzamelingen willen gebruiken. Er zijn twee manieren waarop we dit kunnen doen: met de Vergelijkbaar interface of met de Comparator koppel.

Laten we eerst eens kijken naar het Vergelijkbaar koppel:

openbare interface Vergelijkbaar {int CompareTo (T var1); }

We zouden die interface moeten implementeren door de klasse waarvan we de objecten willen sorteren.

Het heeft de vergelijk met() methode en retourneert een geheel getal. Het kan drie waarden retourneren: -1, 0 en 1, wat betekent dat dit object kleiner is dan, gelijk aan of groter is dan het vergeleken object.

Het is vermeldenswaard dat de overschreven vergelijkT0 () methode moet consistent zijn met de is gelijk aan () methode.

Aan de andere kant kunnen we de Comparator koppel. Het kan worden doorgegeven aan het soort() methoden van de Verzameling interface of bij het instantiëren van gesorteerde verzamelingen. Daarom wordt het meestal gebruikt om een ​​eenmalige sorteerstrategie te maken.

Bovendien is het ook handig wanneer we een klasse van derden gebruiken die de vergelijkbare interface niet implementeert.

Zoals de vergelijk met() methode, de overschreven vergelijken() methoden moeten consistent zijn met de is gelijk aan () methode, maar ze kunnen optioneel een vergelijking met null-waarden mogelijk maken.

Laten we het artikel Comparator en Comparable in Java bezoeken voor meer informatie.

V8. Wat is de leegte Type en wanneer gebruiken we het?

Elke keer dat we een methode in Java schrijven, moet deze een retourtype hebben. Als we willen dat de methode geen waarde retourneert, kunnen we de leegte trefwoord.

We moeten ook weten dat er een Ongeldig klasse. Het is een placeholder-klasse die bijvoorbeeld kan worden gebruikt bij het werken met generieke geneesmiddelen. De Ongeldig klasse kan niet worden geïnstantieerd of uitgebreid.

V9. Wat zijn de methoden van de objectklasse en wat doen ze?

Het is belangrijk om te weten welke methoden het Voorwerp class bevat en hoe ze werken. Het is ook erg handig als we die methoden willen negeren:

  • kloon () - geeft een kopie van dit object terug
  • is gelijk aan () - geeft terug waar wanneer dit object gelijk is aan het object dat als parameter is doorgegeven
  • afronden() - de garbage collector roept deze methode aan tijdens het opschonen van het geheugen
  • getClass () - geeft de runtime-klasse van dit object terug
  • hashCode () - geeft een hash-code van dit object terug. We moeten ons ervan bewust zijn dat het consistent moet zijn met de is gelijk aan () methode
  • melden () - stuurt een melding naar een enkele thread die wacht op de monitor van het object
  • informerenAll () - stuurt een melding naar alle threads die wachten op de monitor van het object
  • toString () - geeft een stringvoorstelling van dit object terug
  • wacht() - er zijn drie overbelaste versies van deze methode. Het dwingt de huidige thread om de opgegeven hoeveelheid tijd te wachten totdat een andere thread wordt aangeroepen melden () of informerenAll () op dit object.

V10. Wat is een opsomming en hoe kunnen we die gebruiken?

Enum is een type klasse waarmee ontwikkelaars een set vooraf gedefinieerde constante waarden kunnen specificeren. Om zo'n klasse te maken, moeten we de opsomming trefwoord. Laten we ons een opsomming van dagen van de week voorstellen:

openbare lijst Dag {ZONDAG, MAANDAG, DINSDAG, WOENSDAG, DONDERDAG, VRIJDAG, ZATERDAG}

Om alle constanten te herhalen, kunnen we de static gebruiken waarden () methode. Bovendien stellen enums ons in staat om leden te definiëren, zoals eigenschappen en methoden, zoals gewone klassen.

Hoewel het een speciaal type klasse is, kunnen we er geen subklasse van maken. Een enum kan echter een interface implementeren.

Een ander interessant voordeel van Enums is dat ze draadveilig zijn en daarom worden ze in de volksmond gebruikt als singletons.

We kunnen meer over Enums vinden in een van onze gidsen.

V11. Wat is een POT?

POT is een snelkoppeling voor Java-archief. Het is een archiefbestand dat is verpakt in het ZIP-bestandsformaat. We kunnen het gebruiken om de klassebestanden en hulpbronnen op te nemen die nodig zijn voor applicaties. Het heeft veel kenmerken:

  • Veiligheid - we kunnen JAR-bestanden digitaal ondertekenen
  • Compressie - terwijl we een JAR gebruiken, kunnen we bestanden comprimeren voor efficiënte opslag
  • Draagbaarheid - we kunnen hetzelfde JAR-bestand op meerdere platforms gebruiken
  • Versiebeheer - JAR-bestanden kunnen metagegevens bevatten over de bestanden die ze bevatten
  • Afdichting - we kunnen een pakket verzegelen in een JAR-bestand. Dit betekent dat alle klassen van één pakket in hetzelfde JAR-bestand moeten zijn opgenomen
  • Extensies - we kunnen het JAR-bestandsformaat gebruiken om modules of extensies voor bestaande software te verpakken

V12. Wat is eenNullPointerException?

De NullPointerException is waarschijnlijk de meest voorkomende uitzondering in de Java-wereld. Het is een ongecontroleerde uitzondering en strekt zich dus uit RuntimeException. We moeten het niet proberen aan te pakken.

Deze uitzondering wordt gegenereerd wanneer we proberen toegang te krijgen tot een variabele of een methode van een null-referentie aanroepen, zoals wanneer:

  • het aanroepen van een methode van een null-referentie
  • het instellen of ophalen van een veld met een null-referentie
  • het controleren van de lengte van een null-arrayverwijzing
  • het instellen of ophalen van een item van een null-arrayverwijzing
  • gooien nul

V13. Wat zijn twee soorten gieten in Java? Welke uitzondering kan worden geworpen tijdens het gieten? Hoe kunnen we dit vermijden?

We kunnen twee soorten casting in Java onderscheiden. We kunnen upcasting doen, wat een object naar een supertype werpt, of downcasting, wat een object naar een subtype cast.

Upcasting is heel eenvoudig, aangezien we dat altijd kunnen doen. We kunnen bijvoorbeeld een Draad instantie naar de Voorwerp type:

Object str = "string";

Als alternatief kunnen we neerslachtig een variabele. Het is niet zo veilig als upcasting, maar het gaat om een ​​typecontrole. Als we een object onjuist casten, gooit de JVM een ClassCastExcpetion tijdens runtime. Gelukkig kunnen we de instantie van trefwoord om ongeldig casten te voorkomen:

Object o = "string"; String str = (String) o; // het is ok Object o2 = new Object (); String str2 = (String) o2; // ClassCastException wordt gegenereerd als (o2 instanceof String) {// false String ret3 = (String) o2; }

In dit artikel kunnen we meer leren over het gieten van typen.

3. Vragen over de kern-Java-taal voor gevorderde programmeurs

V1. Waarom is String een onveranderlijke klasse?

Dat zouden we moeten weten Draad objecten worden anders behandeld dan andere objecten door de JVM. Een verschil is dat Draad objecten zijn onveranderlijk. Het betekent dat we ze niet meer kunnen veranderen nadat we ze hebben gemaakt. Er zijn verschillende redenen waarom ze zich zo gedragen:

  1. Ze worden opgeslagen in het string zwembad dat is een speciaal onderdeel van het heap-geheugen. Het is verantwoordelijk voor het besparen van veel ruimte.
  2. De onveranderlijkheid van de Draad class garandeert dat de hash-code niet zal veranderen. Vanwege dat feit, Snaren kan effectief worden gebruikt als sleutels in hashing-verzamelingen. We kunnen er zeker van zijn dat we geen gegevens zullen overschrijven vanwege een wijziging in hashcodes.
  3. Ze kunnen veilig worden gebruikt over verschillende threads. Geen enkele thread kan de waarde van een Draad object, dus we krijgen gratis draadveiligheid.
  4. Strings zijn onveranderlijk om ernstige beveiligingsproblemen te voorkomen. Gevoelige gegevens zoals wachtwoorden kunnen worden gewijzigd door een onbetrouwbare bron of een andere thread.

In dit artikel kunnen we meer leren over de onveranderlijkheid van strings.

Q2. Wat is het verschil tussen dynamische binding en statische binding?

Binding in Java is een proces waarbij een methodeaanroep wordt geassocieerd met de juiste methodetekst. We kunnen twee soorten binding in Java onderscheiden: statisch en dynamisch.

Het belangrijkste verschil tussen statische binding en dynamische binding is dat statische binding optreedt tijdens het compileren en dynamische binding tijdens runtime.

Statische binding gebruikt klasse-informatie voor binding. Het is verantwoordelijk voor het oplossen van klasleden die dat wel zijn privaat of statisch en laatste methoden en variabelen. Statische binding bindt ook overbelaste methoden.

Dynamische bindinggebruikt daarentegen objectinformatie om bindingen op te lossen. Daarom is het verantwoordelijk voor het oplossen van virtuele en overschreven methoden.

Q3. Wat is JIT?

JIT staat voor "just in time". Het is een onderdeel van de JRE dat tijdens runtime wordt uitgevoerd en de prestaties van de applicatie verhoogt. In het bijzonder is het een compiler die wordt uitgevoerd net nadat het programma is gestart.

Dit verschilt van de reguliere Java-compiler die de code compileert lang voordat de applicatie wordt gestart. JIT kan de applicatie op verschillende manieren versnellen.

De JIT-compiler is bijvoorbeeld verantwoordelijk voor het direct compileren van bytecode in native instructies om de prestaties te verbeteren. Het kan ook de code optimaliseren voor de beoogde CPU en het besturingssysteem.

Bovendien heeft het toegang tot veel runtime-statistieken die kunnen worden gebruikt voor hercompilatie voor optimale prestaties. Hiermee kan het ook een aantal globale code-optimalisaties uitvoeren of code herschikken voor een beter cachegebruik.

V4. Wat is reflectie in Java?

Reflectie is een zeer krachtig mechanisme in Java. Reflection is een mechanisme van Java-taal dat programmeurs in staat stelt de interne staat van het programma (eigenschappen, methoden, klassen enz.) Tijdens runtime te onderzoeken of te wijzigen. Het pakket java.lang.reflect bevat alle vereiste componenten voor het gebruik van reflectie.

Wanneer we deze functie gebruiken, hebben we toegang tot alle mogelijke velden, methoden en constructors die zijn opgenomen in een klassendefinitie. We hebben er toegang toe, ongeacht hun toegangsmodificator. Het betekent dat we bijvoorbeeld toegang hebben tot privé-leden. Om dat te doen, hoeven we hun namen niet te weten. Het enige wat we hoeven te doen is een aantal statische methoden van Klasse.

Het is de moeite waard om te weten dat er een mogelijkheid is om de toegang via reflectie te beperken. Om dat te doen, kunnen we de Java-beveiligingsmanager en het Java-beveiligingsbeleidsbestand gebruiken. Ze stellen ons in staat om machtigingen te verlenen aan klassen.

Als we met modules werken sinds Java 9, moeten we weten dat we standaard geen reflectie kunnen gebruiken over klassen die uit een andere module zijn geïmporteerd. Om andere klassen toe te staan ​​reflectie te gebruiken om toegang te krijgen tot de privé-leden van een pakket, moeten we de "Reflection" -toestemming verlenen.

Dit artikel gaat dieper in op Java Reflection.

V5. Wat is een Classloader?

De classloader is een van de belangrijkste componenten in Java. Het maakt deel uit van de JRE.

Simpel gezegd, de classloader is verantwoordelijk voor het laden van klassen in de JVM. We kunnen drie soorten classloaders onderscheiden:

  • Bootstrap classloader - het laadt de kern Java-klassen. Ze bevinden zich in de / jre / lib directory
  • Extensie classloader - het laadt klassen in / jre / lib / ext of in het pad gedefinieerd door de java.ext.dirs eigendom
  • Systeem classloader - het laadt klassen op het klassenpad van onze applicatie

Een classloader laadt klassen "op aanvraag". Het betekent dat klassen worden geladen nadat ze door het programma zijn aangeroepen. Bovendien kan een klassenlader een klasse met een bepaalde naam slechts één keer laden. Als dezelfde klasse echter wordt geladen door twee verschillende klassenladers, mislukken die klassen bij een gelijkheidscontrole.

Er is meer informatie over classloaders in het artikel Class Loaders in Java.

V6. Wat is het verschil tussen statische en dynamische klassebelasting?

Het laden van statische klassen vindt plaats wanneer we bronklassen beschikbaar hebben tijdens het compileren. We kunnen er gebruik van maken door objectinstances te maken met de nieuw trefwoord.

Dynamisch laden van klassen verwijst naar een situatie waarin we tijdens het compileren geen klassendefinitie kunnen geven. Toch kunnen we dat tijdens runtime doen. Om een ​​instantie van een klasse te maken, moeten we de Class.forName () methode:

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

V7. Wat is het doel van het Serialiseerbaar Koppel?

We kunnen de Serialiseerbaar interface om serialiseerbaarheid van een klasse mogelijk te maken, met behulp van Java's Serialization API. Serialisatie is een mechanisme voor het opslaan van de toestand van een object als een reeks bytes, terwijl deserialisatie een mechanisme is voor het herstellen van de toestand van een object uit een reeks bytes. De geserialiseerde uitvoer bevat de staat van het object en enkele metagegevens over het type en de typen velden van het object.

We moeten weten dat subtypen van serialiseerbare klassen ook serialiseerbaar zijn. Als we echter een klasse serialiseerbaar willen maken, maar het supertype ervan niet serialiseerbaar is, moeten we twee dingen doen:

  • implementeer het Serialiseerbaar koppel
  • verzeker u ervan dat een constructor zonder argument aanwezig is in de superklasse

We kunnen meer lezen over serialisering in een van onze artikelen.

V8. Is er een Destructor in Java?

In Java verwijdert de garbage collector automatisch de ongebruikte objecten om geheugen vrij te maken. Ontwikkelaars hoeven de objecten niet te markeren voor verwijdering, wat foutgevoelig is. Het is dus verstandig dat Java geen destructors beschikbaar heeft.

In het geval dat de objecten open sockets, open bestanden of databaseverbindingen bevatten, de garbage collector is niet in staat om die bronnen terug te vorderen. We kunnen de middelen vrijgeven in dichtbij methode en gebruik probeer het eindelijk syntaxis om de methode daarna aan te roepen vóór Java 7, zoals de I / O-klassen FileInputStreamen FileOutputStream. Vanaf Java 7 kunnen we interface implementeren AutoCloseable en gebruiken probeer-met-middelen verklaring om kortere en schonere code te schrijven. Maar het is mogelijk dat de API-gebruikers vergeten het dichtbij methode, dus de afronden methode en Schoner klasse ontstaan ​​om te fungeren als het vangnet. Maar wees gewaarschuwd dat ze niet gelijk zijn aan de vernietiger.

Het is niet beide verzekerd het afronden methode en Schoner klasse wordt onmiddellijk uitgevoerd. Ze krijgen zelfs geen kans om weg te rennen voordat de JVM vertrekt. Hoewel we konden bellen System.runFinalization om te suggereren dat JVM het afronden methoden van objecten die in afwachting zijn van afronding, is het nog steeds niet-deterministisch.

Bovendien is de afronden methode kan prestatieproblemen, impasses enz. veroorzaken. We kunnen meer informatie vinden in een van onze artikelen: Een gids voor de finalisatiemethode in Java.

Vanaf Java 9, Schoner klasse is toegevoegd om de afronden methode vanwege de nadelen die het heeft. Hierdoor hebben we een betere controle over de draad die de schoonmaakacties uitvoert.

Maar de Java-specificatie wijst op het gedrag van schoonmakers tijdens System.exit is implementatiespecifiek en Java biedt geen garanties of er al dan niet opschoningsacties zullen worden uitgevoerd.