Jak víte, třída poskytuje plán pro objekty; vytvoříte objekt z třídy. Každý z následujících příkazů převzatých z programu CreateObjectDemo
vytvoří objekt a přiřadí jej k proměnné:
První řádek vytvoří objekt Point
třída a každý druhý a třetí řádek vytváří objekt třídy Rectangle
.
Každý z těchto příkazů má tři části (podrobněji popsáno níže):
- Deklarace: Tučně nastavený kód jsou všechna deklarace proměnných, které spojují název proměnné s typem objektu.
- Instance: Nové klíčové slovo je operátor Java, který vytváří objekt.
- Inicializace: Za novým operátorem následuje volání konstruktoru, který inicializuje nový objekt.
Deklarace proměnné odkazovat na objekt
Dříve jste se dozvěděli, že pro deklaraci proměnné napíšete:
type name;
Toto upozorní kompilátor, že pomocí názvu budete odkazovat na data, jejichž typ je typ. U primitivní proměnné si tato deklarace také vyhrazuje správné množství paměti pro proměnnou.
Můžete také deklarovat referenční proměnnou na svém vlastním řádku. Například:
Point originOne;
Pokud deklarujete originOne
takto, bude jeho hodnota být neurčeno, dokud není objekt skutečně vytvořen a přiřazen k němu. Pouhé deklarace referenční proměnné nevytvoří objekt. K tomu musíte použít operátor new
, jak je popsáno v následující části. Než objekt použijete ve svém kódu, musíte jej originOne
přiřadit. Jinak se zobrazí chyba kompilátoru.
Proměnnou v tomto stavu, která aktuálně neodkazuje na žádný objekt, lze ilustrovat následovně (název proměnné originOne
, plus odkaz směřující na nic):
Vytvoření instance třídy
Nový operátor vytvoří instanci třídy přidělením paměti pro nový objekt a vrácením odkazu na tuto paměť. Nový operátor také vyvolá konstruktor objektu.
Nový operátor vyžaduje jeden argument postfixu: volání konstruktoru. Název konstruktoru poskytuje název třídy pro vytvoření instance.
Nový operátor vrací odkaz na objekt, který vytvořil. Tato reference je obvykle přiřazena proměnné příslušného typu, například:
Odkaz vrácený novým operátorem není musí být přiřazeny k proměnné. Může být také použit přímo ve výrazu. Například:
int height = new Rectangle().height;
Tomuto tvrzení se budeme věnovat v další části.
Inicializace objektu
Zde je kód třídy Point:
public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; }}
Tato třída obsahuje jediný konstruktor. Můžete rozpoznat konstruktor, protože jeho deklarace používá stejný název jako třída a nemá žádný návratový typ. Konstruktor ve třídě Point přijímá dva celočíselné argumenty, jak je deklarováno kódem (int a, int b). Následující příkaz poskytuje hodnoty 23 a 94 pro tyto argumenty:
Point originOne = new Point(23, 94);
Výsledek provedení tohoto prohlášení lze ilustrovat na následujícím obrázku:
Zde je kód třídy Rectangle, která obsahuje čtyři konstruktory:
Každý konstruktor umožňuje zadat počáteční hodnoty pro počátek, šířku a výšku obdélníku pomocí primitivních i referenčních typů. Pokud má třída více konstruktorů, musí mít různé podpisy. Kompilátor Java odlišuje t konstruktory na základě počtu a typu argumentů. Když překladač Java narazí na následující kód, ví, že má volat konstruktor ve třídě Rectangle, který vyžaduje argument Point následovaný dvěma celočíselnými argumenty:
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Toto volá jednoho z Rectangle
„konstruktorů, který inicializuje origin
na originOne
. Konstruktor také nastaví width
na 100 a height
na 200.Nyní existují dva odkazy na stejný objekt Point – objekt může mít více odkazů na něj, jak ukazuje následující obrázek:
Následující řádek kódu volá konstruktor Rectangle
, který vyžaduje dva celočíselné argumenty, které poskytují počáteční hodnoty šířky a výšky. Pokud zkontrolujete kód v konstruktoru, uvidíte, že vytvoří nový Point objekt, jehož hodnoty xay jsou inicializovány na 0:
Rectangle rectTwo = new Rectangle(50, 100);
Konstruktor Rectangle použitý v následujícím příkazu nepřijímá žádné argumenty, proto se nazývá konstruktor bez argumentů:
Rectangle rect = new Rectangle();
Všechny třídy mají alespoň jednoho konstruktora. Pokud třída výslovně nedeklaruje žádné, překladač Java automaticky poskytuje konstruktor bez argumentů, který se nazývá výchozí konstruktor. Tento výchozí konstruktor volá konstruktor bez argumentů třídy nebo konstruktor Object
, pokud třída nemá jiného rodiče. Pokud nadřazený nemá žádný konstruktor ( jeden má), překladač program odmítne.