(c) Krzysztof Barteczko 2014

Slides:



Advertisements
Podobne prezentacje
Java – coś na temat Klas Piotr Rosik
Advertisements

Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Typy i metody sparametryzowane (generics) (c) Krzysztof Barteczko 2014.
PRACA Z APLIKACJAMI SYSTEM PRZEMIESZCZANIA oraz NADZORU WYROBÓW AKCYZOWYCH EMCS PL 1.
Wyszukiwanie informacji w Internecie. Czym jest wyszukiwarka? INTERNET ZASOBY ZAINDEKSOWANE PRZEZ WYSZUKIWARKI Wyszukiwarka to mechanizm, który za pomocą.
Excel 2007 dla średniozaawansowanych zajęcia z dnia
Wyrażenia Algebraiczne Bibliografia Znak 1Znak 2 Znak 3 Znak 4 Znak 5 Znak 6 Znak 7 Znak 8 Znak 9 Znak 10 Znak 11.
 Czasem pracy jest czas, w którym pracownik pozostaje w dyspozycji pracodawcy w zakładzie pracy lub w innym miejscu wyznaczonym do wykonywania pracy.
Wprowadzenie do języka Java Kolekcje w języku Java Bartosz Walter.
Wypadkowa sił.. Bardzo często się zdarza, że na ciało działa kilka sił. Okazuje się, że można działanie tych sił zastąpić jedną, o odpowiedniej wartości.
Wprowadzenie Celem naszej prezentacji jest przypomnienie podstawowych informacji na temat bezpiecznego powrotu do domu i nie tylko. A więc zaczynamy…;)
OBSŁUGA KARTY DILO. Karta diagnostyki i leczenia onkologicznego zawiera: - oznaczenie pacjenta, pozwalające na ustalenie jego tożsamości, - oznaczenie.
Karolina Supera Michał Krajewski. Struktura w formie drzewa Funktor jest węzłem Składniki struktur są gałęziami W strukturze możemy zagnieżdżać inne struktury.
ENERGIA to podstawowa wielkość fizyczna, opisująca zdolność danego ciała do wykonania jakiejś pracy, ruchu.fizyczna Energię w równaniach fizycznych zapisuje.
Organizacja, przepisy i procedury Na przykładzie Śląskiego OW NFZ Dr n. med. Z Klosa.
„Książki nie mają właściwości róż, dlatego nie szukajmy wciąż najświeższych”
„Jak zwiększyć bezpieczeństwo uczestników ruchu drogowego?” Co nam dała realizacja projektu?
Instalacja nienadzorowana windows xp Jakub klafta.
Python. Języki Programistyczne Microcode Machine code Assembly Language (symboliczna reprezentacja machine code) Low-level Programming Language (FORTRAN,
Optymalna wielkość produkcji przedsiębiorstwa działającego w doskonałej konkurencji (analiza krótkookresowa) Przypomnijmy założenia modelu doskonałej.
Metody sztucznej inteligencji - Technologie rozmyte i neuronowe 2015/2016 Perceptrony proste nieliniowe i wielowarstwowe © Kazimierz Duzinkiewicz, dr hab.
Usługa ePodatki (MF) Michał Dobrzyński, Departament Informatyki MRPiPS tel
Definiowanie i planowanie zadań typu P 1.  Planowanie zadań typu P  Zadania typu P to zadania unikalne służące zwykle dokonaniu jednorazowej, konkretnej.
Mówię NIE używkom – wybieram ZDROWIE Alkohol: Nie ma żadnej korzyści z picia alkoholu w kontekście zdrowia człowieka i społeczeństwa. Każda jego ilość.
MODUŁ 1 TEMAT 1 POZIOM 1 Rozumienie innych. W tym temacie Uczestnicy: Będą umieli zdefiniować pojęcie rozumienie innych Dowiedzą się, w jaki sposób rozumienie.
O PARADOKSIE BRAESSA Zbigniew Świtalski Paweł Skałecki Wydział Matematyki, Informatyki i Ekonometrii Uniwersytet Zielonogórski Zakopane 2016.
Język Java Paweł Rajba
Dziedziczenie, polimorfizm, Interfejsy
Programowanie Obiektowe – Wykład 1
Przeglądarka stron WWW
Schematy blokowe.
Kurs języka C++ – wykład 2 ( )
DEFINICJA I ZASTOSOWANIE W JĘZYKU HASKELL
(według:
Rachunki zdań Tautologiczność funkcji
Akademia C# - Lab2 Zmienne, instrukcje warunkowe, pętle, debugger,
Ponowne wykorzystanie klas
ALGORYTMY I STRUKTURY DANYCH
Akademia C# lab. 9 Zdarzenia i delegaty.
Funkcja – definicja i przykłady
Programowanie obiektowe Wykład 10
Programowanie obiektowe
Budowa, typologia, funkcjonalność
Lekcja 1 – Hello World! Visual Studio, coś łatwego na początek 
Klasy wewnętrzne. Praktyka użycia interfejsów i klas wewnętrznych
kilka powodów dlaczego warto uczyĆ się matematyki
Programowanie obiektowe
Materiały pochodzą z Platformy Edukacyjnej Portalu
Materiały pochodzą z Platformy Edukacyjnej Portalu
Kurs języka C++ – wykład 13 ( )
Programowanie obiektowe
Bezpieczeństwo dostępu do danych w systemie Windows
Języki programowania.
Programowanie obiektowe
Tensor naprężeń Cauchyego
Instrukcje wyboru.
Podstawy informatyki Zygfryd Głowacz.
Programowanie obiektowe Wykład 11
Strukturalne wzorce projektowe
Zmienne i typy danych w C#
PGO Kolekcje Michail Mokkas.
Proste obliczenia w arkuszu kalkulacyjnym
Zdarzenia (eventy) Zdarzenia służą do powiadomienia użytkownika, gdy w używanej klasie dojdzie do pewnych wydarzeń zdefiniowanych przez twórcę klasy.
Implementacja rekurencji w języku Haskell
BYDGOSKI FESTIWAL NAUKI
Język C++ Preprocesor Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła.
Język C++ Operatory Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła.
Modelowanie obiektowe - system zarządzania projektami
Autor: Magdalena Linowiecka
Projektowanie systemów informatycznych Wykład 3 – Obiekt a klasa
Zapis prezentacji:

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

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

(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

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

Specyfikatory dostępu (c) Krzysztof Barteczko 2014

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

(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

Wyliczenia (enumeracje) (c) Krzysztof Barteczko 2014

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

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

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

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

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

(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

Vehicle - podsumowanie (c) Krzysztof Barteczko 2014

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

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

(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

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

Klasy i obiekty niezmienne (c) Krzysztof Barteczko 2014

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

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

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

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

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 = 100 101 1 2 Konstruktor: s, C, a, b mają wartości : 100 101 1 2 (c) Krzysztof Barteczko 2014

(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

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

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

Implementacja cennika jako singletonu (c) Krzysztof Barteczko 2014

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

(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

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

(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