Klasy anonimowe

Klasy anonimowe są spotykane dużo częściej niż klasy wewnętrzne (i ich pochodne). Nie posiadają one swojej nazwy, mogą się one odwoływać do pół klasy opakowującej, a także do zmiennych lokalnych w metodach o ile zmienne te są finalne lub efektywnie finalne. Mają dokładnie jedną instancję(pomijamy mechanizm refleksji). Klasy anonimowe mają jeszcze jedną unikalną właściwość – […]

Klasy wewnętrzne i wewnętrzne lokalne i zagnieżdżone

Klasy wewnętrzne w przeciwieństwie do „zwykłych” klas javy mogą być prywatne i niewodoczne dla użytkownika(modyfikator dostępu private), protected ale również final, abstractczy public. Wykorzystywane są głównie wtedy, gdy chcemy w niej mieć dostęp do klasy otaczającej bez konieczności tworzenia i przekazywania jej instancji lub gdy chcemy ją wykorzystać tylko w celach pomocniczych i nie ma […]

Metoda equals() i hashCode()

Metoda equals (dziedziczona z klasy object) służy do porównywania obiektów(zwraca wartość true lub false), jako argument przyjmuje obiekt klasy object (czyli w praktyce dowolny obiekt). W podstawowej implementacji sprawdzana jest wyłącznie równość referencji (czy zmienne wskazują na ten sam obszar w pamięci). Jest to zachowanie analogiczne do użycia operatora ==. Wynikiem będzie dwa razy false […]

Klasy abstrakcyjne

Oznacza się je jako abstract, nie można ich zainicjalizować (utworzyć obiektu) oraz posiadają metody abstrakcyjne które podobnie jak w przypadku interfejsów nie posiadają ciała i wymuszona jest ich implementacja (w klasach dziedziczących po takiej klasie abstrakcyjnej). Jednak w odróżnieniu od interfejsów klasy abstrakcyjne mogą mieć swoje pola i metody nieabstrakcyjne(z implementacją) których możemy używać analogicznie jak w przypadku zwykłego […]

Interfejsy

Interfejs to swego rodzaju warstwa abstrakcji która narzuca programiście implementację, w klasach potomnych, metod które ma w sobie zdefiniowane. Owe metody są tylko sygnaturą, nie ma ciała metody, nie ma implementacji (to wszystko należy umieścić w klasie implementującej dany interfejs). W odróżnieniu od klasycznego diedziczenia (klasa po klasie) gdzie nie występuje wielodziedziczenie (jedna klasa może […]

Polimorfizm

Polimorfizm (kolejny fundamentalny element OOP) to możliwość przypisania typu bardziej precyzyjnego do typu nadrzędnego. Jest to przydatne gdy np. chcemy w kolekcji przechowywać różnego rodzaju obiekty posiadające wspólną nadklasę co może ułatwić np. iterację po nich. Warto zwrócić uwagę że mimo zadeklarowania zmiennych typem bardziej ogólnym (z nadklasy) to w przypadku metod wywoływane są implementacje […]

Dziedziczenie

Dziedziczenie – jeden z fundamentów programowania obiektowego (OOP). Jest to możliwość dziedziczenia cech klasy nadrzędnej takich jak pola, metody przez przez klasy potomne które rozszerzają klasę nadrzędną. Do dziedziczenia wykorzystuje się słówko kluczowe extends. Istotną rolę w temacie dziedziczenia odgrywają specyfikatory dostępu. Warto zaznaczyć że w javie nie istnieje wielodziedziczenie! Wadą wykorzystywania (nadużywania?) dziedziczenia jest tworzenie silnych powiązań pomiędzy […]

Modyfikatory static i final

Static Słowo kluczowe static służy do oznaczania pół lub metod jako statyczne. Umożliwia to odwoływanie się do nich bez potrzeby tworzenia instancji klasy. Przykładowy kod: By odwołać się do elementu statycznego należy poprzedzić jego nazwę klasą w której się znajduje. Zmienne static zachowują się jak zmienne globalne – zmiana ich wartości nie powoduje utworzenia  kopii zmiennej. […]

Specyfikatory dostępu w javie

Specyfikatory dostępu są słowami kluczowymi określającymi „widoczność” elementu który poprzedzają (klasy, metody, pola itp). W javie mamy do dyspozycji cztery specyfikatory: public – element jest widocznej z każdej klasy niezależnie od pakietu. private – element jest widoczny wyłącznie w klasie, w której został zdefiniowany. Nie można nim oznaczać klas (poza wewnętrznymi). protected – ogranicza widoczność […]

Strategia

Strategia – wzorzec projektowy polegający na hermetyzacji zmieniających się fragmentów kodu do postaci osobnych klas (implementujących odpowiedni interfejs) które są później wykorzystywane przez inne obiekty. Najważniejsze Założenia: Zidentyfikuj fragmenty aplikacji które się zmieniają i oddziel je od tych, które pozostają stałe. Skoncentruj się na tworzeniu interfejsów a nie implementacji. Przedkładaj kompozycję nad dziedziczenie.