Java
Klasy Javy
Deklaracja klasy
Deklaracja
public
Klasa publiczna
abstract
Klasa abstrakcyjna
finall
Końcowa – nie można z niej
dziedziczyć
class NazwaKlasy
Deklaracja nazwy klasy
extends
NazwaPrzodka
Nazwa klasy przodka (klasy, z
której dziedziczy nasza klasa)
implements
NazwaInterfejsu
W Javie klasa może dziedziczyć
tylko z jednej klasy przodka, a
może implementować wiele
interfejsów
Deklaracja zmiennych (pól)
Modyfikator dostępu
public, private, protcted, package
static
składowa statyczna - wspólna dla klasy, a
nie egzemplarza klasy (obiektu)
finall
stała - nie może być modyfikowana
NazwaTypu
NazwaZmiennej
deklaracja zmiennej - typ + nazwa
Metody
Funkcje definiowane w obrębie klasy
Modyfikator dostępu – public, private,
protected
static – metoda klasy. Wywołanie nie
wymaga instancji obiektu klasy
abstract – metoda abstrakcyjna; nie
wymaga implementacji w ramach klasy
(metoda w ramach klasy abstrakcyjnej)
finall – metoda końcowa; nie może być
pokryta w klasach potomnych
Przekazywanie parametrów do
metod
W Javie parametry przekazywane są przez
wartość. Oznacza to, że:
Jeżeli parametr jest typu prymitywnego, to
przekazana jest kopia wartości parametru.
Zmiany dokonywane są na tej kopii.
Jeżeli parametr jest typu referencyjnego (np.
obiekt), to przekazana jest referencja, za
pomocą której dokonujemy modyfikacji
oryginalnego obiektu.
Ciało metody
Wewnątrz metody możemy zdefiniować zmienne
lokalne. Mogą się one nazywać tak jak pola w
klasie w ramach której definiujemy metodę.
Aby odróżnić pole klasy od zmiennej lokalnej
możemy użyć słowa this
int bok;
bok = 5; //odwołanie do zmiennej lokalnej
this.bok = 10; // odwołanie do pola (własności)
// bok
W analogiczny sposób można odwoływać się do
pól i metod klasy przodka przez słowo super.
super.bok = 5;
Dziedziczenie
W Javie każda klasa może dziedziczyć tylko z
jednej klasy (dziedziczenie jednobazowe).
A dziedziczy z B zapisujemy
class A extends B
W drzewie dziedziczenia istnieje korzeń – klasa
Object zdefiniowana w java.lang, z której
dziedziczą wszystkie inne klasy.
W klasie Object zostały zaimplementowane
wszystkie funkcjonalności niezbędne do
operowania obiektami.
Co jest dziedziczone ?
Jako zasada – klasa potomna dziedziczy wszystkie
składniki klasy przodka, które są dostępne dla klasy
potomnej, o ile nie zostały pokryte w klasie potomnej.
Nie dziedziczy się konstruktorów.
W klasie potomnej można pokryć składowe klasy
przodka. Nadal można odwoływać się do składowej
przodka przez super.
class A { int liczba; … }
class B extends A { float liczba; … }
Wewnątrz klasy B można odwołać się do składowej liczba
typu int
super.liczba //oczywiście typu int
Można nadpisać metodę przodka w klasie potomnej
(adnotacja @override).
Jeżeli klasa potomna nie jest klasą abstrakcyjną, to musi
nadpisać metody abstrakcyjne przodka.
Metody klasy Object
clone() – tworzy kopię obiektu i zwraca do niego referencję
equals()/hashCode() – w konkretnej klasie nadpisujemy te
metody, aby zwrócić wartość logiczną stwierdzającą czy nasz
obiekt jest identyczny z innym
finallize() – pokrywamy metodę aby „posprzątać” w chwili,
gdy odśmiecacz zwalnia obiekt.
toString() – zwraca reprezentację obiektu w postaci
łańcucha znaków.
getClass() – zwraca obiekt reprezentujący klasę obiektu –
wartość jest typu Class. Wykorzystując metody klasy Class
można odczytać nazwę klasy obiektu, klasę przidka itd.
Polimorfizm
W obiektowych językach programowania
występuje zjawisko polimorfizmu polegające na
tym, że do zmiennej typu przodka może przypisać
obiekt klasy potomnej (nic w tym dziwnego –
zgodność typów), ale jednocześnie wywoływanie
metod odbywa się na podstawie aktualnego typu
obiektu, a nie formalnie zadeklarowanego typu
zmiennej.
Uzyskuje się to dzięki tzw. późnemu wiązaniu
metod. O tym z jakiej klasy zostanie wywołana
metoda (potomka czy przodka) decyduje aktualny
typ zmiennej. Decyzja zapada na etapie
uruchomienia programu i określenia typu obiektu,
a nie w czasie kompilacji po zbadaniu formalnego
typu zmiennej.
Późne
wiązanie
Klasy zagnieżdżone
W Javie można wewnątrz definicja jednej klasy
zdefiniować inną klasę (klasę wewnętrzną)
class Zewnetrzna {
class Wewnetrzna1 {
…..
}
class Wewnetrzna2 {
…..
}
….
}
INTERFESY
Interfejs jest protokołem (opisem) zachowania się obiektów podanym
poprzez wskazanie zestawu metod i definicji stałych które
powinny być zaimplementowane w klasie która implementuje
interfejs.
Interfejs nie określa jak działają metody przez niego opisane (nie ma
implementacji).
Klasa nie dziedziczy z interfejsu, lecz może implementować jeden lub
kilka interfejsów (choć może dziedziczyć tylko z jednej klasy).
Wiele różnych klas nie pozostających względem siebie w żadnych
związkach dziedziczenia może implementować ten sam interfejs.
Interfejsy mogą pozostawać między sobą w relacji dziedziczenia, tzn.
jeden interfejs może dziedziczyć z drugiego.
Postać interfejsu
Interfejs może dziedziczyć z innego
interfejsu
public interface A extends B { … }
Implementacja interfejsu