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:

  1. Először is helyet kap a folyamatterében az új objektum számára.
  2. 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.
  3. 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.