Java >> Java tutorial >  >> Tag >> return

Constructor Return Type i Java

1. Oversigt

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

Først vil vi blive fortrolige med, hvordan objektinitialisering fungerer i Java og JVM. Derefter vil vi grave dybere for at se, hvordan objektinitialisering og -tildeling fungerer under hætten.

2. Forekomstinitialisering

Lad os starte med en tom klasse:

public class Color {}

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

Color color = new Color();

Efter at have kompileret dette enkle Java-uddrag, lad os tage et kig på dets bytekode via javap -c kommando:

0: new           #7                  // class Color
3: dup
4: invokespecial #9                  // Method Color."<init>":()V
7: astore_1

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

  1. For det første finder den et sted i sit procesrum til det nye objekt.
  2. Derefter udfører JVM'en systeminitialiseringsprocessen. I dette trin opretter den objektet i dets standardtilstand. Den nye  opcode i bytekoden er faktisk ansvarlig for dette trin.
  3. Til sidst initialiserer den 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:

Method Color."<init>":()V

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

  • tager intet som input (tomme parenteser efter metodenavnet)
  • returnerer intet (V står for void )

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

Et nyt kig på vores simple opgave:

Color color = new Color();

Nu hvor vi ved, returnerer konstruktøren void , lad os se, hvordan opgaven fungerer.

3. Sådan fungerer opgaven

JVM er en stack-baseret virtuel maskine. Hver stak består af stakrammer. Enkelt sagt svarer hver stakramme til et metodekald. Faktisk opretter JVM rammer med et nyt metodekald og ødelægger dem, når de afslutter deres job:

Hver stakramme bruger en matrix til at gemme lokale variabler og en operandstak til at gemme delvise resultater . Givet det, lad os tage et nyt kig på bytekoden:

0: new           #7                // class Color
3: dup
4: invokespecial #9               // Method Color."<init>":()V
7: astore_1

Sådan fungerer opgaven:

  • Det nye  instruktion opretter en forekomst af Farve  og skubber sin reference ind på operand-stakken
  • Den dup  opcode dublerer det sidste element på operand-stakken
  • Det påkaldespecielle  tager den duplikerede reference og bruger den til initialisering. Herefter forbliver kun den oprindelige reference på operandstakken
  •  astore_1  gemmer den oprindelige reference til indeks 1 i det lokale variable-array. Præfikset "a" betyder, at elementet, der skal gemmes, er en objektreference, og "1" er matrixindekset

Fra nu af er det andet element (indeks 1) i det lokale variable-array 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 dette hurtige selvstudie lærte vi, hvordan JVM'en opretter og initialiserer vores klasseforekomster. Desuden så vi, hvordan instansinitialiseringen fungerer under hætten.

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


Java tag