Útmutató objektumok létrehozásához Java-ban

1. Áttekintés

Egyszerűen fogalmazva, mielőtt dolgozni tudnánk egy objektummal a JVM-en, inicializálni kell.

A következő szakaszokban áttekintjük a primitív típusok és objektumok inicializálásának különböző módjait.

2. Nyilatkozat kontra inicializálás

Kezdjük azzal, hogy megbizonyosodunk arról, hogy ugyanazon az oldalon vagyunk.

A deklarálás a változó meghatározásának folyamata típusával és nevével együtt.

Itt deklaráljuk a id változó:

int id;

Az inicializálás viszont egy érték hozzárendeléséről szól; például:

id = 1;

A demonstráláshoz létrehozunk egy Felhasználó osztály a név és id tulajdonságok:

public class Felhasználó {private String name; private int id; // szabványos kivitelező, mérőeszközök, beállítók,}

Ezután látni fogjuk, hogy az inicializálás az inicializálandó mező típusától függően másképpen működik.

3. Tárgyak és primitívek

A Java kétféle adatábrázolást kínál: primitív és referencia típusokat. Ebben a részben megvitatjuk a kettő közötti különbségeket az inicializálás tekintetében.

A Java nyolc beépített adattípussal rendelkezik, ezeket Java primitív típusoknak nevezik; Az ilyen típusú változók közvetlenül tartják az értékeiket.

A hivatkozástípusok objektumokra (osztályok példányaira) utalnak. Ellentétben azokkal a primitív típusokkal, amelyek értékeiket a változó kiosztott memóriájában tárolják, a hivatkozások nem tartják meg az objektum értékét, amelyre hivatkoznak.

Helyette, egy hivatkozás egy objektumra mutat azáltal, hogy eltárolja a memória címét, ahol az objektum található.

Ne feledje, hogy a Java nem teszi lehetővé számunkra, hogy kiderítsük, mi a fizikai memória cím. Inkább csak a hivatkozást használhatjuk az objektumra való hivatkozásra.

Nézzünk meg egy példát, amely deklarál és inicializál egy referencia típust a mi példánkból Felhasználó osztály:

@Test public void whenIntializedWithNew_thenInstanceIsNotNull () {User user = new User (); assertThat (felhasználó) .isNotNull (); }

Amint itt láthatjuk, a kulcsszó segítségével referencia rendelhető egy újhoz új, amely felelős az új létrehozásáért Felhasználó tárgy.

Folytassuk azzal, hogy többet megtudjunk az objektum létrehozásáról.

5. Objektumok létrehozása

A primitívekkel ellentétben az objektumok létrehozása egy kicsit összetettebb. Ez azért van, mert nem csak hozzáadjuk az értéket a mezőhöz; ehelyett kiváltjuk az inicializálást a új kulcsszó. Ez cserébe meghív egy konstruktort, és inicializálja az objektumot a memóriában.

Beszéljünk a kivitelezőkről és a új kulcsszó részletesebben.

A új kulcsszó felelős az új objektum memóriájának kiosztásáért egy konstruktoron keresztül.

A konstruktort általában a létrehozott objektum fő tulajdonságait reprezentáló példányváltozók inicializálására használják.

Ha nem adunk meg kifejezetten egy konstruktort, akkor a fordító létrehoz egy alapértelmezett konstruktort, amelynek nincs argumentuma, és csak memóriát oszt ki az objektum számára.

Egy osztálynak sok konstruktora lehet, mindaddig, amíg paraméterlistáik eltérnek (túlterhelés). Minden konstruktor, amely nem hív meg másik konstruktort ugyanabban az osztályban, felhívja a szülő konstruktorát, akár kifejezetten írta, akár a fordító írta be szuper().

Adjunk hozzá egy konstruktort a sajátunkhoz Felhasználó osztály:

public User (karakterlánc neve, int id) {this.name = név; ez.id = id; }

Most a konstruktorunkkal létrehozhatunk egy Felhasználó objektum tulajdonságainak kezdeti értékeivel:

Felhasználó felhasználó = új felhasználó ("Alice", 1);

6. Változó hatókör

A következő szakaszokban megvizsgáljuk a különböző hatókörök típusait, amelyeken belül a Java-ban egy változó létezhet, és hogy ez hogyan befolyásolja az inicializálási folyamatot.

6.1. Példány és osztályváltozók

A példány- és osztályváltozók nem igénylik, hogy inicializáljuk őket. Amint deklaráljuk ezeket a változókat, a következő alapértelmezett értéket kapják:

Most próbáljuk meg definiálni néhány példányhoz és osztályhoz kapcsolódó változót, és teszteljük, hogy van-e alapértelmezett értékük vagy sem:

@Test public void whenValuesAreNotInitialized_thenUserNameAndIdReturnDefault () {User user = new User (); assertThat (user.getName ()). isNull (); assertThat (user.getId () == 0); }

6.2. Helyi változók

Használat előtt a helyi változókat inicializálni kell, mivel nincs alapértelmezett értékük, és a fordító nem engedi, hogy használjunk egy nem inicializált értéket.

Például a következő kód fordítói hibát generál:

public void print () {int i; System.out.println (i); }

7. Az Végső Kulcsszó

A végső egy mezőre alkalmazott kulcsszó azt jelenti, hogy a mező értéke az inicializálás után már nem változtatható meg. Ily módon definiálhatunk konstansokat a Java-ban.

Adjunk hozzá egy állandót a mi értékünkhöz Felhasználó osztály:

privát statikus végső int YEAR = 2000;

Az állandókat inicializálni kell, vagy deklaráláskor, vagy egy konstruktorban.

8. Inicializálók Java-ban

Java-ban egy az inicializáló olyan kódblokk, amelyhez nincs társítva név vagy adattípus és bármilyen módszeren, konstruktoron vagy más kódblokkon kívül helyezkedik el.

A Java kétféle inicializálót kínál, a statikus és a példány inicializátorokat. Lássuk, hogyan használhatjuk mindegyiket.

8.1. Példánykezdeményezők

Ezeket felhasználhatjuk a példányváltozók inicializálására.

A bemutatáshoz adjunk meg egy értéket a felhasználó számára id példány inicializáló használatával Felhasználó osztály:

{id = 0; }

8.2. Statikus inicializálási blokk

A statikus inicializáló vagy statikus blokk - az inicializáláshoz használt kódblokk statikus mezők. Más szóval, ez egy egyszerű inicializáló, amelyet a kulcsszó jelöl statikus:

privát statikus String fórum; statikus {forum = "Java"; }

9. Az inicializálás rendje

A különféle típusú mezőket inicializáló kód írásakor természetesen figyelnünk kell az inicializálás sorrendjére.

A Java-ban az utasítások inicializálása a következő:

  • statikus változók és statikus inicializálók sorrendben
  • példányváltozók és példányindítók sorrendben
  • kivitelezők

10. Az objektum életciklusa

Most, hogy megtanultuk az objektumok deklarálását és inicializálását, fedezzük fel, mi történik az objektumokkal, ha azokat nem használják.

Ellentétben más nyelvekkel, ahol aggódnunk kell az objektum pusztulásáért, a Java szemétgyűjtőjén keresztül gondoskodik az elavult tárgyakról.

A Java összes objektuma a program halom memóriájában van tárolva. Valójában a halom egy nagy kihasználatlan memóriakészletet jelent, amelyet a Java alkalmazásunkhoz allokáltunk.

Másrészt a a szemétgyűjtő egy Java program, amely gondoskodik az automatikus memóriakezelésről olyan objektumok törlésével, amelyek már nem érhetők el.

Ahhoz, hogy a Java objektumok elérhetetlenné váljanak, a következő helyzetek egyikével kell szembenéznie:

  • Az objektumnak már nincsenek rá utaló hivatkozásai
  • Az objektumra mutató összes hivatkozás kívül esik

Összefoglalva: egy objektumot először egy osztályból hoznak létre, általában a kulcsszóval új. Ezután az objektum életét éli, és hozzáférést biztosít számunkra módszereihez és területeihez.

Végül, amikor már nincs rá szükség, a szemétszedő megsemmisíti.

11. Egyéb módszerek az objektumok létrehozására

Ebben a részben röviden áttekintjük módszerektől eltérő új kulcsszó az objektumok létrehozásához és alkalmazásukhoz, különösképpen a reflektálás, klónozás és sorosítás.

A reflexió egy olyan mechanizmus, amelyet felhasználhatunk az osztályok, mezők és módszerek futás közbeni ellenőrzésére. Itt van egy példa a mi létrehozására Felhasználó objektum tükrözés segítségével:

@Test public void whenInitializedWithReflection_thenInstanceIsNotNull () dobja a (z) {User user = User.class.getConstructor (String.class, int.class) .newInstance ("Alice", 2) kivételt. assertThat (felhasználó) .isNotNull (); }

Ebben az esetben a reflexió segítségével keressük meg és hívjuk meg a konstruktort Felhasználó osztály.

A következő módszer, klónozás, egy objektum pontos másolatának létrehozásának módja. Erre a mi Felhasználó osztálynak végre kell hajtania a Klónozható felület:

public class Felhasználó megvalósítja a Clonable {// ...}

Most már használhatjuk a klón () módszer egy új létrehozására clonedUser objektum, amelynek tulajdonságai megegyeznek a felhasználó tárgy:

@Test public void whenCopiedWithClone_thenExactMatchIsCreated () dobja a CloneNotSupportedException {User user = new User ("Alice", 3); Felhasználó clonedUser = (Felhasználó) user.clone (); assertThat (clonedUser) .isEqualTo (felhasználó); }

Használhatjuk a sun.misc.biztonságos osztály, hogy memóriát rendeljen egy objektumhoz konstruktor meghívása nélkül:

Felhasználó u = (Felhasználó) unsafeInstance.allocateInstance (Felhasználó.osztály);

12. Következtetés

Ebben az oktatóanyagban a mezők inicializálását ismertettük a Java-ban. Különféle adattípusokat fedeztünk fel a Java-ban és azok használatát. Alaposan megvizsgáltuk az objektumok Java-ban történő létrehozásának több módját is.

A bemutató teljes megvalósítása a Github oldalon található.