Tip povratnika konstruktora u Javi

1. Pregled

U ovom brzom vodiču usredotočit ćemo se na tip povratka za konstruktor u Javi.

Prvo ćemo se upoznati s tim kako inicijalizacija objekata funkcionira u Javi i JVM-u. Zatim ćemo dublje kopati kako bismo vidjeli kako inicijalizacija i dodjela objekata funkcioniraju ispod haube.

2. Inicijalizacija instance

Počnimo s praznim razredom:

javna klasa u boji {}

Ovdje ćemo stvoriti instancu iz ove klase i dodijeliti je nekoj varijabli:

Boja boje = nova Color ();

Nakon sastavljanja ovog jednostavnog Java isječka, zavirimo u njegov bytecode preko javap -c naredba:

0: nova # 7 // klasa Boja 3: dup 4: invokespecial # 9 // Boja metode. "" :() V 7: astore_1

Kada instanciramo objekt u Javi, JVM izvodi sljedeće operacije:

  1. Prvo, u svom procesnom prostoru pronalazi mjesto za novi objekt.
  2. Tada JVM izvodi postupak inicijalizacije sustava. U ovom koraku stvara objekt u zadanom stanju. The novi opcode u bytecodeu zapravo je odgovoran za ovaj korak.
  3. Konačno, inicijalizira objekt konstruktorom i ostalim blokovima inicijalizatora. U ovom slučaju, invokespecial opcode poziva konstruktor.

Kao što je gore prikazano, potpis metode za zadani konstruktor je:

Boja metode. "" :() V

The je naziv metoda inicijalizacije instance u JVM-u. U ovom slučaju, je funkcija koja:

  • ne uzima ništa kao ulaz (prazne zagrade nakon naziva metode)
  • ne vraća ništa (V. stoji za poništiti)

Stoga je povratni tip konstruktora u Javi i JVM-u poništiti.

Još jedan pogled na naš jednostavan zadatak:

Boja boje = nova Color ();

Sad kad znamo da se konstruktor vraća poništiti, da vidimo kako funkcionira zadatak.

3. Kako dodjeljivanje djeluje

JVM je virtualni stroj zasnovan na stogu. Svaka se hrpa sastoji od okvira hrpe. Pojednostavljeno, svaki okvir steka odgovara pozivu metode. U stvari, JVM stvara okvire s novim pozivom metode i uništava ih dok završavaju svoj posao:

Svaki okvir steka koristi polje za pohranu lokalnih varijabli i stog operanda za pohranu djelomičnih rezultata. S obzirom na to, pogledajmo još jedan bytecode:

0: nova # 7 // klasa Boja 3: dup 4: invokespecial # 9 // Boja metode. "" :() V 7: astore_1

Evo kako zadatak radi:

  • The novi instrukcija stvara instancu Boja i gura njegovu referencu na hrpu operanda
  • The dup opcode duplicira zadnju stavku na stogu operanda
  • The invokespecial uzima dupliciranu referencu i troši je za inicijalizaciju. Nakon toga na stogu operanda ostaje samo izvorna referenca
  • The astore_1 pohranjuje izvornu referencu na indeks 1 niza lokalnih varijabli. Prefiks "a" znači da je stavka koju treba pohraniti referenca objekta, a "1" indeks niza

Odsada pa nadalje, druga stavka (indeks 1) u polju lokalnih varijabli referenca je na novostvoreni objekt. Stoga ne gubimo referencu, a dodjela zapravo funkcionira - čak i kad konstruktor ništa ne vraća!

4. Zaključak

U ovom smo brzom uputstvu naučili kako JVM stvara i inicijalizira naše instance klase. Štoviše, vidjeli smo kako inicijalizacija instance djeluje ispod haube.

Za još detaljnije razumijevanje JVM-a, uvijek je dobro provjeriti njegove specifikacije.