Het constructor-retourtype in Java

1. Overzicht

In deze korte tutorial gaan we ons concentreren op het retourtype voor een constructor in Java.

Eerst zullen we vertrouwd raken met hoe objectinitialisatie werkt in Java en de JVM. Vervolgens zullen we dieper graven om te zien hoe objectinitialisatie en toewijzing onder de motorkap werken.

2. Instantie-initialisatie

Laten we beginnen met een lege klas:

openbare klas Kleur {}

Hier gaan we een instantie van deze klasse maken en deze aan een variabele toewijzen:

Kleur kleur = nieuwe kleur ();

Laten we na het compileren van dit eenvoudige Java-fragment een kijkje nemen in de bytecode via de javap -c opdracht:

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

Wanneer we een object in Java instantiëren, voert de JVM de volgende bewerkingen uit:

  1. Ten eerste vindt het een plaats in zijn procesruimte voor het nieuwe object.
  2. Vervolgens voert de JVM het systeeminitialisatieproces uit. In deze stap wordt het object in de standaardstatus gemaakt. De nieuw opcode in de bytecode is eigenlijk verantwoordelijk voor deze stap.
  3. Ten slotte initialiseert het het object met de constructor en andere initialisatieblokken. In dit geval is het invokespecial opcode roept de constructor aan.

Zoals hierboven getoond, is de methodehandtekening voor de standaardconstructor:

Method Color. "" :() V

De is de naam van de initialisatiemethoden van de instantie in de JVM. In dit geval is het is een functie die:

  • neemt niets als invoer (lege haakjes achter de naam van de methode)
  • geeft niets terug (V. betekent leegte)

Daarom is het retourtype van een constructor in Java en JVM leegte.

Nog een keer kijken naar onze eenvoudige opdracht:

Kleur kleur = nieuwe kleur ();

Nu we weten dat de constructor terugkeert leegte, laten we eens kijken hoe de opdracht werkt.

3. Hoe de toewijzing werkt

JVM is een stack-gebaseerde virtuele machine. Elke stapel bestaat uit stapelframes. Simpel gezegd, elk stapelframe komt overeen met een methodeaanroep. In feite maakt JVM frames met een nieuwe methodeaanroep en vernietigt deze als ze hun werk afmaken:

Elk stapelframe gebruikt een array om lokale variabelen op te slaan en een operandstapel om gedeeltelijke resultaten op te slaan. Laten we daarom de bytecode nog eens bekijken:

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

Hier is hoe de opdracht werkt:

  • De nieuw instructie maakt een instantie van Kleur en duwt zijn referentie naar de operandstapel
  • De dup opcode dupliceert het laatste item op de operandstapel
  • De invokespecial neemt de gedupliceerde referentie en gebruikt deze voor initialisatie. Hierna blijft alleen de originele referentie op de operandstack staan
  • De astore_1 slaat de oorspronkelijke verwijzing op naar index 1 van de array met lokale variabelen. Het voorvoegsel "a" betekent dat het item dat moet worden opgeslagen een objectreferentie is, en de "1" is de array-index

Vanaf nu, het tweede item (index 1) in de array met lokale variabelen is een verwijzing naar het nieuw gemaakte object. Daarom verliezen we de referentie niet en werkt de toewijzing echt - zelfs als de constructor niets retourneert!

4. Conclusie

In deze korte tutorial hebben we geleerd hoe de JVM onze klasse-instanties maakt en initialiseert. Bovendien hebben we gezien hoe de initialisatie van de instantie onder de motorkap werkt.

Voor een nog gedetailleerder begrip van de JVM is het altijd een goed idee om de specificatie ervan te bekijken.