Java interjúkérdések

1. Bemutatkozás

Ez a cikk válaszokat tartalmaz a legfontosabb Java-val kapcsolatos állásinterjúkra. Néhányukra adott válaszok nem feltétlenül nyilvánvalóak, ezért ez a cikk segít tisztázni a dolgokat.

2. Core-Java nyelvi kérdések kezdőknek

Q1. Az adatokat hivatkozás vagy érték adja át Java-ban?

Bár a válasz erre a kérdésre meglehetősen egyszerű, ez a kérdés kezdők számára zavaró lehet. Először tisztázzuk, mi a kérdés:

  1. Érték elhaladása - ez azt jelenti, hogy elhaladunk egy tárgy másolata paraméterként egy metódusba.
  2. Hivatkozás útján - ez azt jelenti, hogy elhaladunk objektumra való hivatkozás paraméterként egy metódusba.

A kérdés megválaszolásához két esetet kell elemeznünk. Kétféle adatot képviselnek, amelyeket átadhatunk egy módszernek: egy primitívet és egy objektumot.

Amikor primitíveket adunk át egy módszerhez, annak értéke egy új változóba másolódik. Objektumokról a referencia értéke átmásolódik egy új változóba. Tehát elmondhatjuk, hogy a Java szigorúan elhaladó érték nyelv.

Erről többet tudhat meg egyik cikkünkben: Pass-By-Value as a Parameter Passing Mechanism in Java.

Q2. Mi a különbség az import és a statikus import között?

Rendszeres importálást használhatunk egy adott osztály vagy egy másik csomagban definiált összes osztály importálására:

import java.util.ArrayList; // adott osztály importjava.util. *; // összes osztály a util csomagban

Használhatjuk őket egy mellékelt osztály nyilvános beágyazott osztályainak importálására is:

import com.baeldung.A. *

Tudnunk kell azonban, hogy a fenti import nem importálja az osztályt A maga.

Vannak statikus importálások is, amelyek lehetővé teszik statikus tagok vagy beágyazott osztályok importálását:

statikus import: java.util.Collections.EMPTY_LIST;

Ennek hatása az, hogy az EMPTY_LIST statikus változót a teljes minősítésű osztálynév előkészítése nélkül használhatjuk, vagyis mintha az aktuális osztályban lett volna deklarálva.

Q3. Mely hozzáférési módosítók érhetők el a Java-ban, és mi a célja?

Négy hozzáférés-módosító van Jáva:

  1. magán
  2. alapértelmezett (csomag)
  3. védett
  4. nyilvános

A magán A módosító biztosítja, hogy az osztály tagjai nem lesznek elérhetők az osztályon kívül. Alkalmazható módszerekre, tulajdonságokra, konstruktorokra, beágyazott osztályokra, de magukra a legfelső szintű osztályokra nem.

ellentétben a magán módosító, alkalmazhatjuk a alapértelmezett módosító az osztály minden tagjának és magának az osztálynak. Jelentkezhetünk alapértelmezett láthatóságot úgy, hogy egyáltalán nem ad hozzá hozzáférési módosítót. Ha használjuk alapértelmezett láthatóság osztályunk vagy tagjai csak az osztályunk csomagjában lesznek elérhetők. Nem szabad megfeledkeznünk arról, hogy az alapértelmezett hozzáférés-módosítónak nincs semmi közös vonása a alapértelmezett kulcsszó.

Hasonlóan a alapértelmezett módosítóval, egy csomagon belül minden osztály hozzáférhet védett tagok. Sőt, a védett A módosító lehetővé teszi az alosztályok számára a szuperosztály védett tagjainak elérését, még akkor is, ha nem ugyanabban a csomagban vannak. Ezt a hozzáférés-módosítót nem alkalmazhatjuk az osztályokra, csak az osztály tagjaira.

A nyilvános a módosító az osztály kulcsszavával és az osztály összes tagjával együtt használható. Ez az osztályokat és az osztálytagokat minden csomagban és minden osztály számára hozzáférhetővé teszi.

A Java Access Modifiers cikkben többet megtudhatunk.

Q4. Milyen további módosítók érhetők el a Java-ban, és mi a célja?

Öt másik módosító érhető el a Java-ban:

  • statikus
  • végső
  • absztrakt
  • szinkronizált
  • illó

Ezek nem irányítják a láthatóságot.

Először is alkalmazhatjuk a statikus kulcsszó a mezőkhöz és módszerekhez. A statikus mezők vagy módszerek osztálytagok, míg a nem statikusak objektumtagok. Az osztály tagjai nem igényelnek egyetlen példányt sem. Objektum hivatkozási név helyett osztálynévvel hívják meg őket. Ez a cikk a statikus kulcsszó.

Aztán megvan a végső kulcsszó. Használhatjuk mezőkkel, módszerekkel és osztályokkal. Mikor végső mezőn használatos, ez azt jelenti, hogy a mező hivatkozása nem változtatható meg. Tehát nem rendelhető át más objektumhoz. Mikor végső osztályra vagy módszerre alkalmazzák, biztosít minket arról, hogy ez az osztály vagy módszer nem bővíthető vagy felülírható. A végső kulcsszó ebben a cikkben van részletesebben kifejtve.

A következő kulcsszó: absztrakt. Ez leírhatja az osztályokat és módszereket. Amikor az órák vannak absztrakt, nem lehet őket példányosítani. Ehelyett alosztályokra szánják őket. Amikor a módszerek absztrakt, megvalósítás nélkül maradnak, és alosztályokban felülírhatók.

A szinkronizált kulcsszó lehet a legfejlettebb. Használhatjuk a példánnyal, valamint a statikus módszerekkel és a kódblokkokkal. Ha ezt a kulcsszót használjuk, akkor a Java-t egy monitorzár használatával szinkronizáljuk az adott kódrészleten. További információ szinkronizált ebben a cikkben található.

Az utolsó kulcsszó, amelyet megvitatunk, az illó. Csak példánymezőkkel együtt használhatjuk. Kijelenti, hogy a mező értékét be kell olvasni és ki kell írni a fő memóriába - megkerülve a CPU gyorsítótárát. Az illékony változó összes olvasása és írása atom. Az illékony kulcsszót ebben a cikkben részletesen ismertetjük.

Q5. Mi a különbség a JDK, a JRE és a JVM között?

JDK áll Java fejlesztőkészlet, amely egy olyan eszközkészlet, amely a fejlesztők számára szükséges az Java alkalmazások írásához. A JDK környezeteknek három típusa van:

  • Standard Edition - fejlesztőkészlet hordozható asztali vagy szerver alkalmazások létrehozásához
  • Enterprise Edition - a Standard Edition kiterjesztése az elosztott számítástechnika vagy webes szolgáltatások támogatásával
  • Micro Edition - fejlesztési platform beágyazott és mobil alkalmazásokhoz

Rengeteg eszköz található a JDK-ban, amely segítsen a programozóknak az alkalmazások írásában, hibakeresésében vagy karbantartásában. A legnépszerűbbek egy fordító (javac) tolmács (Jáva), archiváló (befőttes üveg) és egy dokumentációs generátort (javadoc).

JRE egy Java futásidejű környezet. A JDK része, de tartalmazza a Java alkalmazások futtatásához szükséges minimális funkciókat. Ez áll a Java virtuális gép, törzsosztályok és a támogató fájlok. Például nincs fordítója.

JVM a rövidítése Java virtuális gép, amely egy virtuális gép, amely képes bájtkódolásra lefordított programok futtatására. A JVM specifikáció írja le, mivel fontos a különböző megvalósítások közötti átjárhatóság biztosítása. A JVM legfontosabb funkciója az, hogy lehetővé tegye a felhasználók számára, hogy ugyanazt a Java alkalmazást telepítsék különböző operációs rendszerekbe és környezetekbe anélkül, hogy aggódnának az alatta rejlő kérdések miatt..

További információért nézzük meg a JVM, JRE és JDK közötti különbséget cikket.

Q6. Mi a különbség a verem és a kupac között?

A memóriának két része van, ahol az összes változót és objektumot a JVM tárolja. Az első a Kazal a második pedig a halom.

A Kazal olyan hely, ahol a JVM fenntartja a blokkokat a helyi változók és további adatok számára. A verem a LIFO (utoljára az első ki) szerkezet. Ez azt jelenti, hogy amikor egy metódust meghívnak, egy új blokkot tartanak fenn a helyi változók és objektum hivatkozások számára. Minden új metódushívás fenntartja a következő blokkot. Amikor a metódusok befejezik a végrehajtásukat, a blokkok az indításuk megfordított módon szabadulnak fel.

Minden új szálnak megvan a maga vereme.

Tudnunk kell, hogy a verem sokkal kevesebb memóriaterülettel rendelkezik, mint a kupac. És amikor a verem megtelt, a JVM a-t dobja StackOverflowError. Valószínűleg akkor fordul elő, ha rossz rekurzív hívás van, és a rekurzió túl mélyre süllyed.

Minden új objektum létrejön a Java-on heap amelyet dinamikus allokációra használnak. Van egy garbázs gyűjtő amely felelős a fel nem használt tárgyak törléséért, amelyek fiatal (óvodai) és régi terekre vannak felosztva. A halom memóriához való hozzáférése lassabb, mint a veremhez való hozzáférés. A JVM dob egy OutOfMemoryError amikor a kupac megtelik.

További részleteket a Java halmozott memória- és kupacterében találhatunk.

Q7. Mi a különbség a Hasonló és Összehasonlító Interfészek?

Néha, amikor új osztályt írunk, szeretnénk összehasonlítani az adott osztály objektumait. Különösen hasznos, ha válogatott gyűjteményeket akarunk használni. Ezt kétféleképpen tehetjük meg: a Hasonló interfész vagy a Összehasonlító felület.

Először nézzük meg a Hasonló felület:

nyilvános felület Összehasonlítható {int vertaTo (T var1); }

Az interfészt annak az osztálynak kell megvalósítanunk, amelynek objektumait rendezni szeretnénk.

Megvan az összehasonlítani() metódus és egész számot ad vissza. Három értéket adhat vissza: -1, 0 és 1, ami azt jelenti, hogy ez az objektum kisebb, egyenlő vagy nagyobb, mint az összehasonlított objektum.

Érdemes megemlíteni, hogy a felülbírált összehasonlítT0 () módszernek összhangban kell lennie a egyenlő () módszer.

Másrészt használhatjuk a Összehasonlító felület. Át lehet adni a fajta() módszerei Gyűjtemény felületen vagy válogatott gyűjtemények példányosításakor. Ezért többnyire egyszeri válogatási stratégia létrehozására használják.

Sőt, akkor is hasznos, ha olyan harmadik fél osztályt használunk, amely nem valósítja meg az Összehasonlítható felületet.

Mint a összehasonlítani() módszer, a felülbírált összehasonlít () módszereknek összhangban kell lenniük a egyenlő () módszerrel, de adott esetben engedélyezhetik a nullákkal való összehasonlítást.

Látogasson el a Comparator and Comparable in Java cikkbe további információkért.

Q8. Mi a üres Típus és mikor használjuk?

Minden alkalommal, amikor egy metódust Java-ban írunk, meg kell adnia egy return típust. Ha azt akarjuk, hogy a módszer ne adjon értéket, használhatjuk a üres kulcsszó.

Azt is tudnunk kell, hogy van egy Üres osztály. Ez egy helyőrző osztály, amely felhasználható például a generikusokkal való munka során. A Üres osztály sem nem példázható, sem nem bővíthető.

Q9. Mik az objektumosztály módszerei és mit csinálnak?

Fontos tudni, hogy milyen módszerek vannak Tárgy osztály tartalmazza és hogyan működnek. Az is nagyon hasznos, ha felül akarjuk írni ezeket a módszereket:

  • klón () - visszaadja ennek az objektumnak a másolatát
  • egyenlő () - visszatér igaz amikor ez az objektum megegyezik a paraméterként átadott objektummal
  • véglegesítés () - a szemétgyűjtő hívja ezt a módszert, miközben tisztítja a memóriát
  • getClass () - ennek az objektumnak a futási osztályát adja vissza
  • hash kód() - ennek az objektumnak hash-kódot ad vissza. Tudatában kell lennünk annak, hogy összhangban kell lennie a egyenlő () módszer
  • értesít () - értesítést küld egyetlen szálra, amely az objektum monitorjára vár
  • értesítMinden () - értesítést küld minden szálra, amely az objektum monitorjára vár
  • toString () - az objektum karakterlánc-reprezentációját adja vissza
  • várjon() - ennek a módszernek három túlterhelt változata van. Arra kényszeríti az aktuális szálat, hogy várjon a megadott ideig, amíg egy másik szál felhív értesít () vagy értesítMinden () ezen a tárgyon.

Q10. Mi az a Enum és hogyan tudjuk használni?

Enum olyan osztálytípus, amely lehetővé teszi a fejlesztők számára, hogy előre meghatározott állandó értékeket adjanak meg. Egy ilyen osztály létrehozásához a enum kulcsszó. Képzeljük el a hét egyes napjainak számát:

nyilvános enum nap {VASÁRNAP, HÉTFŐ, KEDD, SZERDA, CSÜTÖRTÖK, PÉNTEK, SZOMBAT}

Az összes konstans ismétléséhez használhatjuk a statikát értékek () módszer. Mi több, az enums lehetővé teszi számunkra, hogy olyan tagokat definiáljunk, mint a tulajdonságok és a módszerek, például a reguláris osztályok.

Bár ez egy speciális osztálytípus, nem tudjuk alosztályba sorolni. Az enum azonban megvalósíthat egy interfészt.

Egy másik érdekes előnye Enums az, hogy szálbiztosak, ezért népszerûen szingliként használják.

Az Enums-ről többet találhatunk az egyik útmutatónkban.

Q11. Mi a a BEFŐTTES ÜVEG?

BEFŐTTES ÜVEG a parancsikon a Java archívum. Ez egy ZIP fájl formátumú csomagolású archív fájl. Használhatjuk az alkalmazásokhoz szükséges osztályfájlokat és kiegészítő erőforrásokat. Számos funkcióval rendelkezik:

  • Biztonság - digitálisan aláírhatjuk a JAR fájlokat
  • Tömörítés - JAR használata közben tömöríthetjük a fájlokat a hatékony tárolás érdekében
  • Hordozhatóság - ugyanazt a JAR fájlt több platformon is használhatjuk
  • Verziókészítés - A JAR fájlok tartalmazhatnak metaadatokat a bennük található fájlokról
  • Tömítés - csomagot lezárhatunk egy JAR fájlban. Ez azt jelenti, hogy egy csomag összes osztályát fel kell venni ugyanabba a JAR fájlba
  • Bővítmények - a JAR fájlformátumot használhatjuk a meglévő szoftver modulok vagy bővítmények csomagolására

Q12. Mi a aNullPointerException?

A NullPointerException valószínűleg a leggyakoribb kivétel a Java világban. Ellenőrizetlen kivétel, és így kiterjed RuntimeException. Nem kellene megpróbálnunk kezelni.

Ez a kivétel akkor fordul elő, amikor megpróbálunk elérni egy változót, vagy null referencia metódust hívunk meg, például amikor:

  • null referencia módszerének meghívása
  • null referencia mező beállítása vagy lekérése
  • null tömb hivatkozás hosszának ellenőrzése
  • null tömb hivatkozás elemének beállítása vagy lekérése
  • dobás nulla

Q13. Mi a kétféle casting a Java-ban? Melyik kivételt lehet dobni casting közben? Hogyan kerülhetjük el?

Kétféle castingot különböztethetünk meg a Java-ban. Megtehetjük azt a feltöltést, amely objektumot öntípusba önt, vagy downcastingot, amely egy objektumot altípusba önt.

Felborulás nagyon egyszerű, mivel ezt mindig megtehetjük. Például felboríthatjuk a Húr például a Tárgy típus:

Objektum str = "string";

Alternatív megoldásként megtehetjük lehangolt egy változó. Ez nem olyan biztonságos, mint a felborítás, mivel egy típusellenőrzést tartalmaz. Ha helytelenül vetünk egy tárgyat, a JVM dob egy ClassCastExcpetion futás közben. Szerencsére használhatjuk a Például az kulcsszó az érvénytelen átküldés megakadályozásához:

Object o = "string"; String str = (String) o; // rendben van Object o2 = new Object (); Húr str2 = (húr) o2; // A ClassCastException dobódik, ha (o2 példánya a karakterláncból) {// hamis karakterláncot ad vissza str3 = (karakterlánc) o2; }

Ebben a cikkben többet megtudhatunk a típus castingról.

3. Core-Java nyelvi kérdések haladó programozóknak

Q1. Miért változtatható osztály a húr?

Ezt tudnunk kellene Húr a tárgyakat más módon kezeli, mint a többi tárgyat JVM. Az egyik különbség az Húr a tárgyak megváltoztathatatlanok. Ez azt jelenti, hogy miután létrehoztuk őket, nem tudjuk megváltoztatni őket. Több oka van annak, hogy miért viselkednek így:

  1. A húrmedence amely a halomemlékezet különleges része. Ez felelős a sok hely megtakarításáért.
  2. A. Megváltoztathatatlansága Húr osztály garantálja, hogy a kivonatkód nem változik. Ennek a ténynek köszönhetően Húrok hatékonyan használható kulcsokként a hash gyűjteményekben. Biztosak lehetünk benne, hogy a kivonatkódok változása miatt nem írunk felül semmilyen adatot.
  3. Több szálon biztonságosan használhatók. Egyetlen szál sem változtathatja meg az a értékét Húr tárgy, így ingyen kapjuk meg a menetbiztonságot.
  4. A húrok megváltoztathatatlanok a komoly biztonsági kérdések elkerülése érdekében. Az érzékeny adatokat, például a jelszavakat, megbízhatatlan forrás vagy más szál módosíthatja.

Ebben a cikkben többet megtudhatunk a húrok megváltoztathatatlanságáról.

Q2. Mi a különbség a dinamikus és a statikus kötés között?

A Java-ban történő megkötés a metódushívás társítása a megfelelő metódustörzsbe. A Java-ban kétféle kötést különböztethetünk meg: statikus és dinamikus.

A statikus kötés és a dinamikus kötés közötti fő különbség az, hogy a statikus kötés fordításkor, a dinamikus kötés futás közben történik.

Statikus kötés osztályinformációkat használ a kötéshez. Feladata az osztálytagok feloldása magán vagy statikus és végső módszerek és változók. A statikus kötés megköti a túlterhelt módszereket is.

Dinamikus kötésmásrészt objektuminformációkat használ a kötések feloldására. Ezért felelős a virtuális és felülbírált módszerek megoldásáért.

Q3. Mi a JIT?

JIT rövidítése „éppen időben”. Ez a JRE egyik futtató része, amely futás közben fut, és növeli az alkalmazás teljesítményét. Pontosabban, ez egy fordító, amely közvetlenül a program indítása után fut.

Ez eltér a szokásos Java fordítótól, amely már jóval az alkalmazás elindítása előtt lefordítja a kódot. A JIT különböző módon felgyorsíthatja az alkalmazást.

Például a JIT fordító felelős a bájtkód natív utasításokba történő lefordításáért menet közben, a teljesítmény javítása érdekében. Ezenkívül optimalizálni tudja a kódot a megcélzott CPU és operációs rendszer számára.

Ezenkívül számos futási statisztikához fér hozzá, amelyek felhasználhatók az optimális teljesítmény érdekében az újrafordításhoz. Ezzel néhány globális kódoptimalizálást is elvégezhet, vagy átrendezheti a kódot a gyorsítótár jobb kihasználása érdekében.

Q4. Mi a tükrözés a Java-ban?

A reflexió egy nagyon hatékony mechanizmus a Java-ban. A Reflection a Java nyelv mechanizmusa, amely lehetővé teszi a programozók számára, hogy futás közben megvizsgálják vagy módosítsák a program belső állapotát (tulajdonságok, módszerek, osztályok stb.). A java.lang.reflect csomag minden szükséges komponenst tartalmaz a reflexió használatához.

Ennek a szolgáltatásnak a használatakor elérhetjük az összes lehetséges mezőt, metódust, konstruktort, amelyek egy osztálydefinícióban szerepelnek. Hozzáférés-módosítójuktól függetlenül hozzáférhetünk hozzájuk. Ez azt jelenti, hogy például hozzáférhetünk magántagokhoz. Ehhez nem kell tudnunk a nevüket. Csak annyit kell tennünk, hogy néhány statikus módszert alkalmazunk Osztály.

Érdemes tudni, hogy lehetőség van reflexió útján történő hozzáférés korlátozására. Ehhez használhatjuk a Java biztonsági kezelőjét és a Java biztonsági házirend-fájlt. Ezek lehetővé teszik számunkra, hogy engedélyeket adjunk az osztályoknak.

Amikor a Java 9 óta modulokkal dolgozunk, tudnunk kell, hogy alapértelmezés szerint nem tudjuk használni a másik modulból importált osztályok reflexióját. Ahhoz, hogy más osztályok reflektálást használhassanak a csomag privát tagjaihoz való hozzáféréshez, meg kell adnunk a „Reflection” engedélyt.

Ez a cikk részletesebben elmagyarázza a Java Reflection témakörét.

Q5. Mi a a Osztálytervező?

A osztálytervező a Java egyik legfontosabb összetevője. Ez a JRE része.

Egyszerűen fogalmazva: osztálytervező felelős az osztályok JVM-be történő betöltéséért. A classloaderek három típusát különböztethetjük meg:

  • Bootstrap classloader - betölti a Java alaposztályokat. Ezek a / jre / lib Könyvtár
  • Bővítő osztálytervező - ban található osztályokat tölti be / jre / lib / ext vagy a java.ext.dirs ingatlan
  • Rendszerosztályozó - osztályokat tölt be az alkalmazásunk osztályterületén

Egy osztálytervező „igény szerint” tölti be az osztályokat. Ez azt jelenti, hogy az osztályok betöltődnek, miután a program meghívta őket. Sőt, egy osztálytervező csak egyszer tölthet be egy osztályt egy névvel. Ha azonban ugyanazt az osztályt két különböző osztályterhelő tölti be, akkor ezek az osztályok kudarcot vallanak az egyenlőség ellenőrzésén.

Az osztálytervezőkről a Java osztálybetöltők című cikkben található további információ.

Q6. Mi a különbség a statikus és a dinamikus osztályterhelés között?

A statikus osztálybetöltés akkor történik, amikor a fordítási időpontban rendelkezésre állnak forrásosztályok. Használhatjuk úgy, hogy objektumpéldányokat hozunk létre a új kulcsszó.

A dinamikus osztálybetöltés olyan helyzetre utal, amikor a fordítás idején nem tudunk osztálydefiníciót megadni. Mégis, ezt futás közben is megtehetjük. Egy osztály példányának létrehozásához a Class.forName () módszer:

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

Q7. Mi a célja a Sorosítható Felület?

Használhatjuk a Sorosítható interfész az osztály sorosíthatóságának lehetővé tételéhez a Java Serialization API segítségével. A szerializálás egy objektum állapotának mentése bájtsorozatként, míg a deserializáció egy objektum állapotának helyreállítása egy bájtsorozatból. A sorosított kimenet tartalmazza az objektum állapotát és néhány metaadatot az objektum típusáról és a mezők típusairól.

Tudnunk kell, hogy a szerializálható osztályok altípusai is sorosíthatók. Ha azonban egy osztályt sorozhatóvá akarunk tenni, de a típusa nem sorosítható, két dolgot kell tennünk:

  • végre a Sorosítható felület
  • győződjön meg arról, hogy a szuperosztályban nincs argumentum-kivitelező

A szerializálásról többet olvashatunk egyik cikkünkben.

Q8. Van-e romboló a Java-ban?

A Java-ban a szemétgyűjtő automatikusan törli a fel nem használt objektumokat a memória felszabadítása érdekében. A fejlesztőknek nem kell megjelölniük az objektumokat törlésre, ami hibára hajlamos. Tehát ésszerű a Java-nak nincs elérhető destruktora.

Ha az objektumok nyitott foglalatokat, nyitott fájlokat vagy adatbázis-kapcsolatokat tartalmaznak, a szemétszedő nem képes visszaszerezni ezeket az erőforrásokat. A forrásokat felszabadíthatjuk Bezárás módszer és felhasználás próbálkozz végre szintaxis a módszer utólagos meghívására a Java 7 előtt, például az I / O osztályok előtt FileInputStreamés FileOutputStream. A Java 7-től kezdve megvalósíthatjuk az interfészt Automatikusan zárható és használja erőforrásokkal próbálkozzon nyilatkozat rövidebb és tisztább kód megírásához. De lehetséges, hogy az API-felhasználók elfelejtik felhívni a Bezárás módszer, tehát a véglegesíteni módszer és Tisztító osztály jött létre, hogy biztonsági hálóként működjön. De kérjük, vigyázzon, hogy nem egyenértékűek a rombolóval.

Nem biztos, hogy mindkettő a véglegesítés módszer és Tisztító osztály azonnal futni fog. Még esélyük sincs futni, mielőtt a JVM kilép. Bár hívhatnánk System.runFinalization javasolni, hogy a JVM futtassa a véglegesíteni a véglegesítésre váró objektumok metódusai, ez még mindig nem determinisztikus.

Sőt, a véglegesíteni A módszer teljesítményproblémákat okozhat, holtpontokat stb.

Java 9-től kezdve, Tisztító osztály kerül felvételre a véglegesíteni módszer a hátrányai miatt. Ennek eredményeként jobban ellenőrizhetjük a szálat, amely elvégzi a tisztítási műveleteket.

De a java spec rámutat a takarítók viselkedésére System.exit megvalósítás-specifikus, és a Java nem nyújt garanciát arra, hogy a takarítási műveletek megindulnak-e.


$config[zx-auto] not found$config[zx-overlay] not found