Constructor Return Type i Java

1. Oversigt

I denne hurtige vejledning fokuserer vi på returtypen for en konstruktør i Java.

Først bliver vi fortrolige med, hvordan objektinitialisering fungerer i Java og JVM. Derefter graver vi dybere for at se, hvordan objektinitialisering og tildeling fungerer under emhætten.

2. Instansinitialisering

Lad os starte med en tom klasse:

offentlig klassefarve {}

Her skal vi oprette en forekomst fra denne klasse og tildele den til en eller anden variabel:

Farve farve = ny farve ();

Efter at have samlet dette enkle Java-uddrag, lad os kigge på dets bytecode via javap -c kommando:

0: ny # 7 // klasse Farve 3: dup 4: invokespecial # 9 // Metodefarve. "" :() V 7: astore_1

Når vi instantierer et objekt i Java, udfører JVM følgende operationer:

  1. For det første finder det et sted i dets procesrum til det nye objekt.
  2. Derefter udfører JVM systeminitialiseringsprocessen. I dette trin opretter det objektet i dets standardtilstand. Det ny opcode i bytecode er faktisk ansvarlig for dette trin.
  3. Endelig initialiserer det objektet med konstruktøren og andre initialiseringsblokke. I dette tilfælde er invokespecial opcode kalder konstruktøren.

Som vist ovenfor er metodesignaturen for standardkonstruktøren:

Metodefarve. "" :() V

Det er navnet på instans initialiseringsmetoder i JVM. I dette tilfælde er er en funktion, der:

  • tager intet som input (tomme parenteser efter metodens navn)
  • returnerer intet (V står for ugyldig)

Derfor er returtypen for en konstruktør i Java og JVM ugyldig.

Ser vi endnu en gang på vores enkle opgave:

Farve farve = ny farve ();

Nu hvor vi ved, at konstruktøren vender tilbage ugyldig, lad os se, hvordan opgaven fungerer.

3. Sådan fungerer opgave

JVM er en stakbaseret virtuel maskine. Hver stak består af stabelrammer. Enkelt sagt svarer hver stakramme til et metodeopkald. Faktisk opretter JVM rammer med et nyt metodekald og ødelægger dem, når de er færdige med deres job:

Hver stabelramme bruger en matrix til at gemme lokale variabler og en operandstak til at gemme delresultater. I betragtning af det, lad os tage et nyt kig på bytecode:

0: ny # 7 // klasse Farve 3: dup 4: invokespecial # 9 // Metodefarve. "" :() V 7: astore_1

Sådan fungerer opgaven:

  • Det ny instruktion opretter en instans af Farve og skubber sin reference på operandstakken
  • Det dup opcode duplikerer det sidste element i operandstakken
  • Det invokespecial tager den duplikerede reference og bruger den til initialisering. Efter dette er kun den originale reference tilbage på operandstakken
  • Det astore_1 gemmer den oprindelige reference til indeks 1 i den lokale variabelarray. Præfikset “a” betyder, at det element, der skal gemmes, er en objektreference, og “1” er matrixindekset

Fra nu af, det andet element (indeks 1) i arrayet med lokale variabler er en reference til det nyoprettede objekt. Derfor mister vi ikke referencen, og opgaven fungerer faktisk - selv når konstruktøren ikke returnerer noget!

4. Konklusion

I denne hurtige vejledning lærte vi, hvordan JVM opretter og initialiserer vores klasseinstanser. Desuden så vi, hvordan instansinitialiseringen fungerer under hætten.

For en endnu mere detaljeret forståelse af JVM er det altid en god ide at tjekke dens specifikation.


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