Mint tudják, egy osztály biztosítja az objektumok tervrajzát; osztályból hoz létre objektumot. A következő utasítások, amelyek a CreateObjectDemo
programból származnak, létrehoznak egy objektumot, és hozzárendelik egy változóhoz:
Az első sor létrehoz egy objektumot a Point
osztály, a második és a harmadik sor egyaránt létrehoz egy objektumot a Rectangle
osztályból.
Ezeknek az utasításoknak három részből áll. (az alábbiakban részletesen tárgyaljuk):
- Nyilatkozat: A félkövérrel beírt kód mind olyan változó deklaráció, amely egy változó nevet társít egy objektumtípussal. egy Java operátor, amely létrehozza az objektumot.
- Inicializálás: Az új operátort hívja egy konstruktor, amely inicializálja az új objektumot.
Változó deklarálása Objektum hivatkozása
Korábban megtanulta, hogy egy változó deklarálásához ezt írja:
type name;
Ez értesíti a fordítót arról, hogy a név használatával hivatkozni fog a típus típusú adatokra. Egy primitív változó esetén ez a deklaráció a megfelelő memóriamennyiséget is fenntartja a változó számára.
Egy referenciaváltozót deklarálhat a saját sorára is. Például:
Point originOne;
Ha így deklarálja a originOne
-t, akkor az értéke addig nem határozható meg, amíg egy objektum ténylegesen létre nem jön és hozzá van rendelve. Egy referencia változó egyszerű deklarálása nem hoz létre objektumot. Ehhez a new
operátort kell használni, a következő szakaszban leírtak szerint. Az objektumot a originOne
fájlhoz kell rendelnie, mielőtt felhasználná a kódban. Ellenkező esetben fordítói hibát kap.
Az ebben az állapotban lévő, jelenleg objektumra nem hivatkozó változó a következőképpen szemléltethető (a változó neve, originOne
, plusz a semmire mutató referencia):
Osztály létrehozása
Az új operátor az osztályt úgy állítja elő, hogy memóriát oszt ki egy új objektum számára, és visszaküldi az adott memória hivatkozását. Az új operátor meghívja az objektum konstruktort is.
Az új operátorhoz egyetlen postfix argumentumra van szükség: hívás egy konstruktorra. A konstruktor neve adja meg a példányosítandó osztály nevét.
Az új operátor hivatkozást ad vissza az általa létrehozott objektumra. Ez a hivatkozás általában egy megfelelő típusú változóhoz van hozzárendelve, például:
Az új operátor által visszaadott referencia nem változóhoz kell rendelni. Kifejezésben közvetlenül is használható. Például:
int height = new Rectangle().height;
Ezt az állítást a következő szakasz tárgyalja.
Objektum inicializálása
Itt van a Point osztály kódja:
public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; }}
Ez az osztály egyetlen konstruktort tartalmaz. Felismerhet egy konstruktort, mert a deklarációja ugyanazt a nevet használja, mint az osztály, és nincs visszatérési típusa. A Point osztálybeli konstruktor két egész argumentumot vesz fel, amint azt a kód deklarálja (int a, int b). A következő utasítás 23 és 94 értékeket ad meg ezeknek az argumentumoknak:
Point originOne = new Point(23, 94);
Ennek végrehajtásának eredménye utasítás a következő ábrán szemléltethető:
Itt van a négy téglalapot tartalmazó Rectangle osztály kódja:
Minden konstruktor lehetővé teszi a téglalap eredetének, szélességének és magasságának kezdeti értékeinek megadását, primitív és referencia típusok használatával is. Ha egy osztálynak több konstruktora van, akkor különböző aláírásokkal kell rendelkezniük.A Java fordító megkülönbözteti a t konstruktorok az érvek száma és típusa alapján. Amikor a Java fordító a következő kóddal találkozik, tudja, hogy felhívja a konstruktort a Téglalap osztályba, amelyhez egy Point argumentumra és két egész argumentumra van szükség:
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Ez felhívja az egyik Rectangle
“konstruktort, amely inicializálja a origin
elemet originOne
A konstruktor a width
-et 100-ra, a height
-et pedig 200-ra állítja.Két hivatkozás van ugyanarra a Point objektumra – egy objektumnak több hivatkozása is lehet rá, amint az a következő ábrán látható:
A következő kódsor az Rectangle
konstruktort hívja meg, amely két egész argumentumot igényel, amelyek megadják a kezdőbetűt a szélesség és a magasság értékei. Ha megvizsgálja a kódot a konstruktorban, látni fogja, hogy létrehoz egy új Point objektumot, amelynek x és y értéke 0-ra inicializálódik:
Rectangle rectTwo = new Rectangle(50, 100);
A következő utasításban használt téglalap konstruktor nem vesz fel argumentumokat, ezért hívja az argumentum nélküli konstruktort:
Rectangle rect = new Rectangle();
Minden osztályban van legalább egy konstruktor. Ha egy osztály nem nyilatkozik kifejezetten, akkor a Java fordító automatikusan megad egy argumentum nélküli konstruktort, az alapértelmezett konstruktort. Ez az alapértelmezett konstruktor hívja az osztály szülő “argumentum nélküli konstruktort”, vagy a Object
konstruktort, ha az osztálynak nincs másik szülője. Ha a szülőnek nincs konstruktora (Object
van), a fordító elutasítja a programot.