Forskjeller mellom Final, Endelig og Finalize i Java

1. Oversikt

I denne opplæringen skal vi ta en oversikt over tre Java-nøkkelord: endelig, endelig og fullføre.

Mens disse nøkkelordene ligner på hverandre, har hver en veldig annen betydning i Java. Vi lærer formålet med hver av dem og ser noen eksempler gjennom litt kode.

2. endelig Nøkkelord

La oss først ta en titt på endelig nøkkelord, hvor du skal bruke det og hvorfor. Vi kan bruke endelig nøkkelord til erklæring om klasse, metode, felt, variabel og metode.

Det har imidlertid ikke den samme effekten på hver av dem:

  • Å lage en klasse endelig betyr at det ikke vil være mulig å utvide den klassen
  • Legger til endelig til en metode betyr at det ikke vil være mulig å overstyre den metoden
  • Til slutt, putte endelig foran et felt, betyr en variabel eller en parameter at når referansen er tildelt, kan den ikke endres (hvis referansen er til et foranderlig objekt, kan den interne tilstanden endres til tross for at den er endelig)

En detaljert artikkel om endelig nøkkelord finner du her.

La oss se hvordan endelig søkeord fungerer gjennom noen eksempler.

2.1. endelig Felt, parametere og variabler

La oss lage en Foreldre klasse med to int felt, a endelig en, og en vanlig ikke-endelig:

offentlig klasse Forelder {int felt1 = 1; siste int felt2 = 2; Forelder () {felt1 = 2; // OK felt2 = 3; // Kompileringsfeil}}

Som vi kan se, forbyr kompilatoren oss å tilordne en ny verdi felt2.

La oss nå legge til en metode med et vanlig og et endelig argument:

 ugyldig metode1 (int arg1, final int arg2) {arg1 = 2; // OK arg2 = 3; // Kompileringsfeil}

På samme måte som felt er det ikke mulig å tildele noe til arg2 ettersom den er erklært endelig.

Vi kan nå legge til en annen metode for å illustrere hvordan dette fungerer med lokale variabler:

 ugyldig metode2 () {final int localVar = 2; // OK localVar = 3; // Kompileringsfeil}

Ingenting overraskende skjer, kompilatoren lar oss ikke tildele en ny verdi localVar etter første oppdrag.

2.2. endelig Metode

Anta nå at vi lager metode2 final og lag en underklasse av Foreldre, la oss si Barn, der vi prøver å overstyre begge superklassemetodene:

offentlig klasse Barn utvider foreldre {@Override ugyldig metode1 (int arg1, int arg2) {// OK} @Override endelig ugyldig metode2 () {// Kompilasjonsfeil}}

Som vi kan se, er det ikke noe problem med å overstyre metode1 (), men vi får en kompileringsfeil når vi prøver å overstyre metode2 ().

2.3. endelig Klasse

Og til slutt, la oss lage Barn klasse final og prøv å lage en underklasse av den, GrandChild:

offentlig avsluttende klasse Barn utvider foreldre {// ...}
offentlig klasse GrandChild utvider barnet {// kompileringsfeil}

Nok en gang klager kompilatoren. De Barn klassen er endelig og derfor umulig å utvide.

3. endelig Blokkere

De endelig blokk er en valgfri blokk å bruke med en prøve / fange uttalelse. I denne blokken inkluderer vi kode som skal utføres etter prøve / fange struktur, enten det blir kastet et unntak eller ikke.

Det er til og med mulig å bruke den med prøve blokkere uten noen å fange blokk forutsatt at vi inkluderer en endelig blokkere. Koden blir deretter utført etter prøve eller etter at et unntak er kastet.

Vi har en grundig artikkel om unntakshåndtering i Java her.

La oss nå demonstrere en endelig blokker i et kort eksempel. Vi lager en dummy hoved() metode med en prøve / fange / endelig struktur:

public static void main (String args []) {try {System.out.println ("Execute try block"); kaste nytt unntak (); } fangst (Unntak e) {System.out.println ("Utfør fangstblokk"); } til slutt {System.out.println ("Utfør til slutt blokk"); }}

Hvis vi kjører denne koden, vil den sende følgende:

Utfør prøveblokk Utfør fangstblokk Utfør endelig blokkering

La oss nå endre metoden ved å fjerne fangstblokken (og legge til kaster Unntak til signaturen):

public static void main (String args []) kaster Unntak {try {System.out.println ("Execute try block"); kaste nytt unntak (); } til slutt {System.out.println ("Utfør til slutt blokk"); }}

Resultatet er nå:

Utfør prøveblokk Utfør til slutt blokkering

Hvis vi nå fjerner kast nytt unntak () instruksjon, kan vi observere at utgangen forblir den samme. Våre endelig blokkutførelse skjer hver gang.

4. fullføre Metode

Og til slutt, fullføre metoden er en beskyttet metode, definert i objektklassen. Det kalles av søppelmann på gjenstander som det ikke er referert til lenger og som er valgt for søppeloppsamling.

Som alle andre ikke-endelige metoder kan vi overstyre denne metoden for å definere oppførselen et objekt må ha når det samles inn av søppelmann.

Igjen, en detaljert artikkel som dekker fullføre metode finner du her.

La oss se et eksempel på hvordan det fungerer. Vi bruker System.gc () å foreslå JVM å utløse søppelsamling:

 @ Override beskyttet tomrom finalize () kaster Throwable {System.out.println ("Execute finalize method"); super.finalize (); }
 offentlig statisk ugyldig hoved (String [] args) kaster Unntak {FinalizeObject-objekt = nytt FinalizeObject (); objekt = null; System.gc (); Tråd. Søvn (1000); }

I dette eksemplet overstyrer vi fullfør () metode i vårt objekt og lage en hoved() metode som instantierer objektet vårt og umiddelbart slipper referansen ved å sette den opprettede variabelen til null.

Etter det ringer vi System.gc () å kjøre søppelmann (i det minste forventer vi at den skal kjøre) og venter et sekund (bare for å sikre at JVM stenger ikke før søppelmann har sjansen til å ringe fullfør () metode).

Resultatet av denne kodeutførelsen skal være:

Utfør fullføringsmetoden

Merk at det anses å være dårlig praksis å overstyre fullfør () metoden ettersom kjøringen avhenger av søppelsamling som er i hånden på JVM. I tillegg har denne metoden vært utfaset siden Java 9.

5. Konklusjon

I denne artikkelen har vi kort diskutert forskjellene mellom de tre Java-nøkkelordene: endelig, endelig og fullføre.

Den fulle koden til artikkelen finner du på GitHub.


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