Java - Terminologia obiektowa
Obiekt to element (materialny lub abstrakcyjny) wyróżniony z otoczenia, będący konkretyzacją
(instancją, wystąpieniem, egzemplarzem, egzemplifikacją) pewnej klasy.
Każdy obiekt posiada nazwę, strukturę, właściwości (pola) i metody (zachowanie). W środowisku programowania obiektowego nazwa obiektu oznacza unikalny odnośnik (referencję) do obiektu, dzięki której można się jednoznacznie do niego odwoływać. Odnośnik do obiektu może być implementowany na różne sposoby, np. jako jego wskaźnik (adres). Strukturę obiektu określają jego pola, a stan określają wartości tych pól. Atrybuty odpowiadają danym przechowywanym przez zmienne skojarzone z obiektem (zmienne wewnętrzne), które nazywane są polami. Zachowanie obiektu zdefiniowane jest poprzez skojarzone z nim metody czyli usługi. Usługi obiektu realizowane są przez podprogramy (funkcje i procedury), które są ściśle skojarzone z danymi (polami, atrybutami, własnościami) wewnątrz obiektu. Pola i metody nazywane są składowymi obiektu. Ukryte (niewidoczne) składowe tj. takie, do których inne obiekty nie mogą się odwoływać bezpośrednio, nazywane są prywatnymi i służą do utrzymywania wewnętrznej spójności obiektu. Składowe obiektu ogólnie dostępne nazywane są publicznymi. Obiekty współdziałają ze sobą wykorzystując składowe publiczne. Mechanizm języka obiektowego pozwalający:
Obiekty, których pewne pola są również obiektami (lub referencjami do obiektów) nazywamy obiektami kompozytowymi. Tworzenie obiektów kompozytowych nazywa się agregacją (grupowaniem). Klasa jest abstrakcją zbioru obiektów posiadających identyczne pola i metody. Klasa reprezentuje pojęcie, którego obiekt jest konkretnym. Klasa stanowi definicję obiektowego typu danych i zawiera specyfikację pól (właściwości) oraz implementację metod (usług, wykonania operacji, a więc zachowania obiektu). Tworzenie instancji tj. egzemplarza obiektu określonej klasy nazywamy konkretyzacją. Klasa jest zatem prototypem, wzorcem tworzenia nowych wystąpień obiektów. Poszczególne egzemplarze obiektów danej klasy są zawsze rozróżnialne (posiadają nazwę: tożsamość). Mogą ponadto - ale nie muszą - różnić się wartościami atrybutów. Definicja klasy zawiera na ogół specjalne metody nazywane konstruktorami, których zadaniem jest utworzenie egzemplarza obiektu i zainicjowanie jego pól. W niektórych obiektowych językach programowania wywołanie konstruktora jest obowiązkowe, w innych może być wykonane w sposób niejawny. Pewne języki obiektowe wymagają definiowania i jawnego wywoływania metod zwanych destruktorami, których zadaniem jest niszczenie obiektu i odzyskiwanie zajmowanych przez niego zasobów systemowych. Związek pomiędzy klasami, w którym klasa przejmuje strukturę albo zachowanie zdefiniowane w innej klasie nazywamy dziedziczeniem. Klasa dziedzicząca nazywana jest klasą potomną (subklasą, podklasą). Klasa (rodzic) po której dziedziczy dana klasa nazywana jest klasą bazową (superklasą, klasą nadrzędną, rodzicielską). Relacja dziedziczenia umożliwia tworzenie wielopoziomowej hierarchii klas. W hierarchii tej jedna klasa może mieć wiele klas potomnych bezpośrednich i pośrednich. Jeśli w hierarchii dziedziczenia dana klasa ma zawsze tylko jedną klasę bazową, to mówimy o dziedziczeniu jednokrotnym (prostym, jednobazowym). Jeśli klasa ma kilka niezależnych klas bazowych, to mamy do czynienia z dziedziczeniem wielokrotnym (mnogim, wielobazowym). Nie wszystkie obiektowe języki programowania wspierają dziedziczenie wielokrotne. W takich przypadkach dowolna klasa może mieć co najwyżej jedną klasę rodzicielską. Klasę, która stanowi bazę dla pewnej podhierarchii nazywamy klasą główną. Jeśli cała hierarchia klas posiada klasę główną to nazywamy ją klasą podstawową (pierwotną). Jest to najbardziej ogólna klasa w hierarchii klas. Mechanizm dziedziczenia wprowadza pewne zależności:
Klasa, która nie może posiadać podklas nazywana jest klasą finalną. Klasy finalne definiuje się w celu zapewnienia bezpieczeństwa. Definicja klasy nie może ulegać dalszym zmianom poprzez specjalizację gwarantując takie jej zachowanie jak w pierwotnej postaci. Cecha finalności może przysługiwać nie całej klasie, ale niektórym jej składowym. W przypadku pól znaczy to, że pole jest stałą. Metoda finalna to taka, która nie może być przesłonięta w klasach potomnych. Pewne składowe klasy tj. pola lub metody mogą być związane z klasą jako całością, a nie z konkretnymi jej egzemplarzami (obiektami). Składowe takie nazywamy statycznymi. Można się do nich odwoływać poprzez nazwę klasy (nie musi istnieć żaden obiekt klasy). Składowe niestatyczne są nazywane instancyjnymi. Składowe statyczne mogą się odwoływać tylko do innych składowych statycznych. Składowe instancyjne mogą odwoływać się zarówno do innych składowych instancyjnych jak i statycznych. Klasy, których zadaniem jest realizowanie agregacji poprzez grupowanie innych obiektów w postaci list, kolekcji itd. nazywane są klasami kontenerowymi, a obiekty tych klas - kontenerami. Klasy kontenerowe dostarczają metod służących do operowania na kolekcjach obiektów składowych (dodawanie, usuwanie, zmiana kolejności itp.). Obiekty składowe nazywane są komponentami. Oprócz agregacji i dziedziczenia relację między klasami i ich wystąpieniami mogą być tworzone poprzez mechanizm zagnieżdżania polegający na definiowaniu jednej klasy, nazywanej klasą zagnieżdżoną, w obrębie innej nazywanej klasą zawierającą (zagnieżdżającą). Zagnieżdżona klasa niestatyczna (instancyjna) nazywana jest klasą wewnętrzną. Każde wystąpienie klasy zewnętrznej tworzy wystąpienia klas wewnętrznych. Do klasy zagnieżdżonej można odwoływać się w obrębie klasy zagnieżdżającej oraz poza nią za pomocą odwołania kwalifikowanego postaci: NazwaKlasyZagnieżdżającej.NazwaKlasyZagnieżdżonejKlasa zdefiniowana w ciele metody nazywana jest klasą lokalną. Klasy lokalne nie są dostępne poza metodami w których zostały zdefiniowane. Obiekty mogą na siebie oddziaływać wpływając bezpośrednio na wartości (stan) pól lub żądając realizacji udostępnianych metod (usług). Żądanie usługi nazywane jest komunikatem. Komunikat składa się z następujących części (ostatnia jest opcjonalna):
Przetworzenie komunikatu może zmienić stan obiektu-odbiornika, a do obiektu-nadajnika może być przesłana wartość powrotna (odpowiedź) - wynik wykonania metody odbiornika. Metodę, która zmusza wywołującego do czekania na jej zakończenie, aby móc realizować kolejne instrukcje, nazywamy blokującą. W tym przypadku wywołujący czeka po prostu na rezultat działania metody. Metodę, która zwraca sterowanie natychmiast po jej wywołaniu nazywamy nieblokującą. Metody nieblokujące realizowane są często jako metody typu callback (zwrotne). Metody typu callback jako jeden z parametrów otrzymują referencję (adres) wywołującego, aby po wykonaniu zadania lub w trakcie jego realizacji mieć możliwość komunikowania się z wywołującym.
|