Jak wiesz, klasa zapewnia plan dla obiektów; tworzysz obiekt z klasy. Każda z poniższych instrukcji pobranych z programu CreateObjectDemo
tworzy obiekt i przypisuje go do zmiennej:
Pierwsza linia tworzy obiekt Point
, a druga i trzecia linia tworzą obiekt klasy Rectangle
.
Każda z tych instrukcji składa się z trzech części (omówione szczegółowo poniżej):
- Deklaracja: kod ustawiony pogrubioną czcionką to wszystkie deklaracje zmiennych, które wiążą nazwę zmiennej z typem obiektu.
- Instancja: nowe słowo kluczowe jest operatorem Javy, który tworzy obiekt.
- Inicjalizacja: po nowym operatorze następuje wywołanie konstruktora, który inicjalizuje nowy obiekt.
Deklarowanie zmiennej aby odnosić się do obiektu
Wcześniej nauczyłeś się, że aby zadeklarować zmienną, piszesz:
type name;
To powiadamia kompilator, że użyjesz nazwy do odniesienia się do danych, których typ jest typem. W przypadku zmiennej pierwotnej deklaracja ta rezerwuje również odpowiednią ilość pamięci dla zmiennej.
Możesz także zadeklarować zmienną referencyjną w osobnym wierszu. Na przykład:
Point originOne;
Jeśli zadeklarujesz originOne
w ten sposób, jego wartość być nieokreślone, dopóki obiekt nie zostanie faktycznie utworzony i przypisany do niego. Samo zadeklarowanie zmiennej referencyjnej nie tworzy obiektu. W tym celu musisz użyć operatora new
, jak opisano w następnej sekcji. Musisz przypisać obiekt do originOne
, zanim użyjesz go w swoim kodzie. W przeciwnym razie wystąpi błąd kompilatora.
Zmienną w tym stanie, która obecnie nie odwołuje się do żadnego obiektu, można zilustrować w następujący sposób (nazwa zmiennej, originOne
plus odniesienie wskazujące na nic):
Tworzenie instancji klasy
New operator tworzy instancję klasy, przydzielając pamięć dla nowego obiektu i zwracając odwołanie do tej pamięci. Operator new wywołuje również konstruktor obiektów.
Nowy operator wymaga pojedynczego argumentu pofiksowego: wywołania konstruktora. Nazwa konstruktora zawiera nazwę klasy do utworzenia.
Operator new zwraca referencję do utworzonego przez siebie obiektu. To odwołanie jest zwykle przypisywane do zmiennej odpowiedniego typu, na przykład:
Odwołanie zwrócone przez nowy operator nie muszą być przypisane do zmiennej. Można go również używać bezpośrednio w wyrażeniu. Na przykład:
int height = new Rectangle().height;
Ta instrukcja zostanie omówiona w następnej sekcji.
Inicjalizacja obiektu
Oto kod klasy Point:
public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; }}
Ta klasa zawiera pojedynczy konstruktor. Możesz rozpoznać konstruktor, ponieważ jego deklaracja używa tej samej nazwy co klasa i nie ma typu zwracanego. Konstruktor w klasie Point przyjmuje dwa argumenty w postaci liczb całkowitych, zgodnie z deklaracją w kodzie (int a, int b). Poniższa instrukcja podaje wartości 23 i 94 jako wartości dla tych argumentów:
Point originOne = new Point(23, 94);
Wynik wykonania tego można zilustrować na następnym rysunku:
Oto kod klasy Rectangle, która zawiera cztery konstruktory:
Każdy konstruktor umożliwia podanie wartości początkowych dla początku, szerokości i wysokości prostokąta, używając zarówno typów pierwotnych, jak i referencyjnych. Jeśli klasa ma wiele konstruktorów, muszą one mieć różne sygnatury. Kompilator języka Java rozróżnia t konstruktory oparte na liczbie i typie argumentów. Gdy kompilator Java napotka następujący kod, wie, że należy wywołać konstruktor w klasie Rectangle, która wymaga argumentu Point, po którym następują dwa argumenty w postaci liczb całkowitych:
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Wywołuje jeden z konstruktorów Rectangle
„, który inicjuje origin
do originOne
. Ponadto konstruktor ustawia width
na 100, a height
na 200.Teraz istnieją dwa odniesienia do tego samego obiektu Point – obiekt może mieć wiele odniesień do niego, jak pokazano na następnym rysunku:
Poniższy wiersz kodu wywołuje konstruktor Rectangle
, który wymaga dwóch argumentów całkowitych, które zapewniają początkowy wartości szerokości i wysokości. Jeśli przyjrzysz się kodowi w konstruktorze, zobaczysz, że tworzy on nowy obiekt Point, którego wartości xiy są zainicjowane na 0:
Rectangle rectTwo = new Rectangle(50, 100);
Konstruktor Rectangle użyty w poniższej instrukcji nie przyjmuje żadnych argumentów, więc nazywa się go konstruktorem bez argumentów:
Rectangle rect = new Rectangle();
Wszystkie klasy mają co najmniej jednego konstruktora. Jeśli klasa nie zadeklaruje jawnie żadnej, kompilator Java automatycznie udostępnia konstruktor bez argumentów, nazywany konstruktorem domyślnym. Ten domyślny konstruktor wywołuje bezargumentowy konstruktor klasy nadrzędnej lub konstruktor Object
, jeśli klasa nie ma innego elementu nadrzędnego. Jeśli element nadrzędny nie ma konstruktora (Object
je ma), kompilator odrzuci program.