Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

(c) Krzysztof Barteczko 2014

Podobne prezentacje


Prezentacja na temat: "(c) Krzysztof Barteczko 2014"— Zapis prezentacji:

1 (c) Krzysztof Barteczko 2014
Klasy (c) Krzysztof Barteczko 2014

2 (c) Krzysztof Barteczko 2014
Podstawowe definicje (c) Krzysztof Barteczko 2014

3 (c) Krzysztof Barteczko 2014
Abstrakcja obiektowa Języki obiektowe pozwalają na definiowanie własnych klas – własnych typów danych, co oznacza możliwość programowania w języku problemu. (c) Krzysztof Barteczko 2014

4 Hermetyzacja (enkapsulacja)
Dane (atrybuty) są ukryte i są traktowane jako nierozdzielna całość z metodami (usługami) Sama koncepcja klasy jako zestawu pól i metod już zapewnia określony poziom hermetyzacji. Nie możemy np. do obiektów klasy Vehicle posłać komunikatu sing(), bowiem metoda sing() nie występuje jako składowa w tej klasie. (c) Krzysztof Barteczko 2014

5 Specyfikatory dostępu
(c) Krzysztof Barteczko 2014

6 (c) Krzysztof Barteczko 2014
Prywatność (c) Krzysztof Barteczko 2014

7 (c) Krzysztof Barteczko 2014
Rodzaje klas Mamy też w Javie pojęcie klas publicznych i pakietowych. Klasa pakietowa jest dostępna tylko z klas pakietu. Klasa publiczna jest dostępna zewsząd (z innych pakietów). Klasę publiczną deklarujemy ze specyfikatorem public. Oprócz tego w Javie mamy specjalny rodzaj klas, zwany wyliczeniami (enumeracjami). (c) Krzysztof Barteczko 2014

8 Wyliczenia (enumeracje)
(c) Krzysztof Barteczko 2014

9 Definiowanie enumeracji
Np. enum Pora { ZIMA, WIOSNA, LATO, JESIEŃ }; (c) Krzysztof Barteczko 2014

10 (c) Krzysztof Barteczko 2014
Enumeracje - metody (c) Krzysztof Barteczko 2014

11 Enumeracje – program przykładowy
public class PoryRoku { enum Pora { ZIMA, WIOSNA, LATO, JESIEŃ }; public static String opisz(Pora p) { int nr = p.ordinal() + 1; String txt = p + " (ma numer " + nr + ")"; if (p == Pora.ZIMA) return txt + " - pada śnieg."; if (p == Pora.WIOSNA) return txt + " - kwitnie bez."; if (p == Pora.LATO) return txt + " - jest ciepło."; if (p == Pora.JESIEŃ) return txt + " - pada deszcz."; return "To niemożliwe"; } public static void main(String[] args) { String nazwa = JOptionPane.showInputDialog("Podaj porę roku:"); Pora p = Pora.valueOf(nazwa); JOptionPane.showMessageDialog(null, opisz(p) ); (c) Krzysztof Barteczko 2014

12 Definiowanie klas zgodnie z regułami (1)
public class Person { private String name; private String pesel; Person(String aname, String id) { name = aname; pesel = id; } public String getName() { return name; public String getPesel() { return pesel; Atrybuty obiektów klasy Person przedstawiono jako pola prywatne. Spoza klasy nie ma do nich dostępu. Przy tworzeniu obiektu jego elementy odpowiadające tym polom są inicjowane za pomocą wywołania konstruktora. Później zmiany tych elementów danych nie są już możliwe, możemy tylko uzyskać dane za pomocą publicznych metod getName() i getPesel(). (c) Krzysztof Barteczko 2014

13 Definiowanie klas zgodnie z regułami (2)
(c) Krzysztof Barteczko 2014

14 (c) Krzysztof Barteczko 2014
Klasa Vehicle package hermet; import static hermet.VehState.*; public class Vehicle { private int width, height, length, weight; private Person owner; private VehState state; public Vehicle(int w, int h, int l, int ww) { this(null, w, h, l, ww); } public Vehicle(Person p, int w, int h, int l, int ww) { owner = p; width = w; height = h; length = l; weight = ww; state = STOPPED; public Vehicle() { state = STOPPED; } public void start() { setState(MOVING); public void stop() { setState(STOPPED); public void repair() { if (state != BROKEN) error("Nie można reperować sprawnego pojazdu"); else state = STOPPED; public VehState getState() { return state; } public void sellTo(Person p) { owner = p; public void crash(Vehicle v) { if (this.state != MOVING && v.state != MOVING) error("Dwa stojące samochody nie mogą się zderzyć"); this.state = BROKEN; v.state = BROKEN; public String toString() { String s = (owner == null ? "sklep" : owner.getName()); return "Pojazd, właścicielem którego jest " + s + " jest w stanie " + state; private void setState(VehState newState) { if (state == BROKEN) error("Nie jest mozliwe przejście ze stanu " + state + " do stanu " + newState); else state = newState; private void error(String msg) { throw new IllegalArgumentException(msg); (c) Krzysztof Barteczko 2014

15 Vehicle - podsumowanie
(c) Krzysztof Barteczko 2014

16 (c) Krzysztof Barteczko 2014
Składowe statyczne (c) Krzysztof Barteczko 2014

17 Wykorzystanie składowych statycznych
Skorzystamy z koncepcji składowych statycznych po to, by każdemu pojazdowi tworzonemu w naszym programie nadawać unikalny numer (powiedzmy od jednego), a także zawsze mieć rozeznanie ile obiektów typu Vehicle dotąd utworzyliśmy: public class Vehicle { private static int count; // ile obiektów dotąd utworzyliśmy private int currNr; // bieżący numer pojazdu //... public Vehicle(Person p, int w, int h, int l, int ww) { // .... // Każde utworzenie nowego obiektu zwiększa licznik o 1 // bieżąca wartość licznika nadawana jest jako numer pojazdu // numer pojazdu jest niestatycznym polem klasy, a więc elementem obiektu currNr = ++count; } //..... // zwraca unikalny numer pojazdu public int getNr() { return currNr; } // zwraca liczbę dotąd utworzonych obiektów // metoda jest statyczna, by móc zwrócić 0 // gdy nie ma jeszcze żadnego obiektu public static int getCount() { return count; } // ... (c) Krzysztof Barteczko 2014

18 (c) Krzysztof Barteczko 2014
Przeciążanie metod W klasie (i/lub jej klasach pochodnych) możemy zdefiniować metody o tej samej nazwie, ale różniące się liczbą i/lub typami parametrów. Nazywa się to przeciążaniem metod. Przeciążanie "rozciąga się" na różne rodzaje metod. Dwie metody – statyczna i niestatyczna - o tej samej nazwie, ale o różnych typach/liczbie argumentów są przeciążone. (c) Krzysztof Barteczko 2014

19 Przeciążanie konstruktorów
(c) Krzysztof Barteczko 2014

20 Klasy i obiekty niezmienne
(c) Krzysztof Barteczko 2014

21 (c) Krzysztof Barteczko 2014
Inicjacje (c) Krzysztof Barteczko 2014

22 Niestatyczny blok inicjacyjny
Niestatyczny blok inicjacyjny wprowadzamy ujmując kod wykonywalny w nawiasy klamrowe i umieszczając taką konstrukcję w definicji klasy poza ciałem jakiejkolwiek metody (czy konstruktora). Kod bloku zostanie wykonany zaraz po utworzeniu i domyślnym zainicjowaniu obiektu,  przed wywołaniem jakiegokolwiek konstruktora. Taka  możliwość może okazać się przydatna, gdy mamy kilka konstruktorów i chcemy wyróżnić pewien kod, który będzie inicjował obiekt niezależnie od użytego konstruktora i przed użyciem jakiegokolwiek z nich. { int dayOfWeek = Calendar.getInstance() .get(Calendar.DAY_OF_WEEK); switch (dayOfWeek) { case Calendar.SUNDAY : state = STOPPED; break; case Calendar.MONDAY : state = (currNr % 2 == 0 ? MOVING : STOPPED); break; default : state = (currNr == 1 ? STOPPED : MOVING); } W anonimowej klasie wewnętrznej niestatyczny blok inicjacyjny zastępuje konstruktor, którego przecież nie można zdefiniować, bo klasa nie ma nazwy - zob. dalej o anonimowych klasach wewnętrznych. (c) Krzysztof Barteczko 2014

23 Statyczny blok inicjacyjny
Statyczny blok inicjacyjny wprowadzamy  słowem kluczowym static z następującym po nim kodem ujętym w nawiasy klamrowe. Kod ten będzie wykonywany jeden raz przy pierwszym odwołaniu do klasy (np. użyciu metody statycznej lub stworzeniu pierwszego obiektu). Oczywiście, z takiego bloku możemy odwoływać się wyłącznie do zmiennych statycznych (obiekt jeszcze nie istnieje). class Vehicle { private static int initNr; // ... static { Locale[] loc = { Locale.UK, Locale.US, Locale.JAPAN, Locale.ITALY, }; int[] begNr = { 1, 100, 1000, 10000, }; initNr = 200; // jeżeli aplikacja dzia?a w innej od wymienionych // w tablicy lokalizacji, zaczynamy numery od 200 Locale defLoc = Locale.getDefault(); // domyślna lokalizacja? for (int i=0; i < loc.length; i++) if (defLoc.equals(loc[i])) { initNr = begNr[i]; break; } (c) Krzysztof Barteczko 2014

24 (c) Krzysztof Barteczko 2014
Reguły inicjacji (c) Krzysztof Barteczko 2014

25 Jak działają inicjacje?
public class InitOrder { private static int s = 100; private static final int C; private int a = 1; InitOrder() { report("Konstruktor: s, C, a, b mają wartości :", s, C, a, b); } private int b = 2; { report("Blok inicjacyjny: s, C, a, b =", s, C, a, b); static { report("Statyczny blok inicjacyjny, s = ", s); C = 101; // opóźniona inicjacja stałej! private static void report(String msg, int ... args ) { System.out.print(msg + " "); for (int i : args) { System.out.print(i + " "); System.out.println(); public static void main(String[] args) { report("Wywołanie metody main"); new InitOrder(); Statyczny blok inicjacyjny, s = 100 Wywołanie metody main Blok inicjacyjny: s, C, a, b = Konstruktor: s, C, a, b mają wartości : (c) Krzysztof Barteczko 2014

26 (c) Krzysztof Barteczko 2014
Niuanse inicjacji (1) Mimo, że w tym przypadku niestatyczny blok inicjacyjny oraz konstruktor są wywoływane przed blokiem statycznym nie przeczy to podanym regułom inicjacji. Dlaczego? (c) Krzysztof Barteczko 2014

27 (c) Krzysztof Barteczko 2014
Niuanse inicjacji (2) (c) Krzysztof Barteczko 2014

28 (c) Krzysztof Barteczko 2014
Singletony (c) Krzysztof Barteczko 2014

29 Implementacja cennika jako singletonu
(c) Krzysztof Barteczko 2014

30 Pojęcie o typach sparametryzowanych (generics)
(c) Krzysztof Barteczko 2014

31 (c) Krzysztof Barteczko 2014
Generics (2) Przy tworzeniu instancji takiej klasy konkretny typ (argument typu) podajemy w nawiasach kątowych. Na przykład: A<String> a1 = new A<String>("ala"); W wersji Java 7 wprowadzono tzw. diamond operator (puste nawiasy kątowe <>), dzięki czemu możemy pisac krócej: A<String> a1 = new A<>("ala"); (c) Krzysztof Barteczko 2014

32 (c) Krzysztof Barteczko 2014
Zalety generics (c) Krzysztof Barteczko 2014

33 (c) Krzysztof Barteczko 2014
Generics i kolekcje Generics mają szczególnie ważne zastosowania dla klas kolekcyjnych. Użycie kolekcji sparametryzowanych polega na podaniu typu jej elementów w nawiasach kątowych np.     ArrayList<String> list = new ArrayList<String>(); lub:     ArrayList<String> list = new ArrayList<>(); Taki zapis zapewni, że do kolekcji list nie będzie można dodać elementu innego typu niż String. Co więcej, skoro kompilator wie jakiego typu mogą być elementy kolekcji, to dostarczy go w odpowiednich miejscach (np. list.get(i) będzie zwracać wynik typu String) i odciąży programistę od zapisywania konwersji zawężających. Dodać trzeba, że paramtry typu mają zastosowanie nie tylko dla klas, ale również dla metod i interfejsów. O interfejsach dowiemy się już za chwilę. (c) Krzysztof Barteczko 2014


Pobierz ppt "(c) Krzysztof Barteczko 2014"

Podobne prezentacje


Reklamy Google