A Constructor Return Type Java-ban
1. Áttekintés
Ebben a gyors bemutatóban a Java-ban lévő konstruktor visszatérési típusára fogunk összpontosítani.
Először megismerjük az objektum inicializálásának működését a Java-ban és a JVM-ben. Ezután mélyebbre ásunk, hogy megnézzük, hogyan működik az objektum inicializálása és kiosztása a motorháztető alatt.
2. Példák inicializálása
Kezdjük egy üres osztállyal:
nyilvános osztály Szín {}
Itt létrehozunk egy példányt ebből az osztályból, és hozzárendeljük valamilyen változóhoz:
Szín színe = új Szín ();
Miután összeállította ezt az egyszerű Java-kódrészletet, vessünk egy pillantást a bájtkódjára a javap -c parancs:
0: new # 7 // class 3 szín: dup 4: invokepecial # 9 // Method Colour. "" :() V 7: astore_1
Amikor egy objektumot példányosítunk a Java-ban, a JVM a következő műveleteket hajtja végre:
- Először is helyet kap a folyamatterében az új objektum számára.
- Ezután a JVM elvégzi a rendszer inicializálási folyamatát. Ebben a lépésben létrehozza az objektumot az alapértelmezett állapotában. A új A bájtkódban szereplő opcode tulajdonképpen felelős ezért a lépésért.
- Végül inicializálja az objektumot a konstruktorral és más inicializáló blokkokkal. Ebben az esetben a különlegeset hív az opcode felhívja a konstruktort.
Amint fent látható, az alapértelmezett konstruktor metódus-aláírása a következő:
Módszer színe. "" :() V
A a példány inicializálási módszerek neve a JVM-ben. Ebben az esetben a olyan függvény, amely:
- semmit nem vesz be bemenetként (a metódus neve után üres zárójelek vannak)
- nem ad semmit (V áll üres)
Ezért egy Java és JVM konstruktor visszatérési típusa az üres.
Újra áttekintve egyszerű feladatunkat:
Szín színe = új Szín ();
Most, hogy tudjuk, a konstruktor visszatér üres, nézzük meg, hogyan működik a feladat.
3. Hogyan működik a hozzárendelés
A JVM egy verem alapú virtuális gép. Minden verem veremkeretekből áll. Leegyszerűsítve: minden veremkeret megfelel egy metódushívásnak. Valójában a JVM új metódushívással hoz létre kereteket, és megsemmisíti őket, amikor befejezik munkájukat:

Minden veremkeret egy tömböt használ a helyi változók, az operandus verem pedig a részeredmények tárolásához. Tekintettel arra, vessünk egy újabb pillantást a bájtkódra:
0: new # 7 // class 3 szín: dup 4: invokespecial # 9 // Method Colour. "" :() V 7: astore_1
A feladat így működik:
- A új utasítás létrehoz egy példányát Szín és az operandus veremre tolja referenciáját
- A dup Az opcode lemásolja az operandus verem utolsó elemét
- A különlegeset hív elveszi a duplikált referenciát és felhasználja az inicializáláshoz. Ezt követően csak az eredeti referencia marad az operandus veremben
- A astore_1 eltárolja az eredeti hivatkozást a lokális változók tömb 1. indexére. Az „a” előtag azt jelenti, hogy a tárolni kívánt elem objektum hivatkozás, az „1” pedig a tömbindex
Mostantól, a lokális változók tömb második eleme (1. index) hivatkozás az újonnan létrehozott objektumra. Ezért nem veszítjük el a referenciát, és a hozzárendelés valóban működik - még akkor is, ha a konstruktor semmit sem ad vissza!
4. Következtetés
Ebben a gyors bemutatóban megtudtuk, hogyan hozza létre és inicializálja a JVM az osztálypéldányainkat. Sőt, láttuk, hogyan működik a példány inicializálása a motorháztető alatt.
A JVM még részletesebb megértése érdekében mindig érdemes megnézni annak specifikációját.