Podstawowe aspekty programowania w Javie

Slides:



Advertisements
Podobne prezentacje
Wstęp do strumieni danych
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
Programowanie obiektowe
Mgr inż.Marcin Borkowski Podstawy Java Część II
Mgr inż.Marcin Borkowski Podstawy Java Krótkie wprowadzenie dla studentów Wyższej Szkoły Ekologii i Zarządzania
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Programowanie obiektowe
Wzorce.
Domy Na Wodzie - metoda na wlasne M
PROGRAMOWANIE STRUKTURALNE
Nguyen Hung Son Uniwersytet Warszawski
Programowanie obiektowe w Javie
Inżynieria oprogramowania Lecture XXX JavaTM – część IV: IO
Podstawy informatyki Rekurencja i rekurencja Grupa: 1A
Struktury.
Tablice.
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Gniazda komunikacji sieciowej w języku Java
Pakiety i ATD 1 Definicja. Pakietem albo jednostką programową nazywamy grupę logicznie powiązanych elementów, które mogą być typami, podtypami, obiektami.
Język ANSI C Operacje we/wy
Czytanie, pisanie i rysowanie (czyli klasa I szkoły podstawowej)
1 Języki i techniki programowania prowadzący dr Grzegorz Filipczyk.
Wstęp do programowania obiektowego
Techniki i języki programowania
Ogólnopolski Konkurs Wiedzy Biblijnej Analiza wyników IV i V edycji Michał M. Stępień
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
TABLICE C++.
W większości języków programowania biblioteki wejścia/wyjścia ukrywają szczegóły obsługi poszczególnych mediów pod abstrakcją strumienia (ang. stream).
Obsługa systemu wejścia-wyjścia
Programowanie obiektowe – zastosowanie języka Java SE
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Maciek Mięczakowski
Inicjalizacja i sprzątanie
Seminarium problemowe
Systemy wejścia i wyjścia Michał Wrona. Co to jest system wejścia i wyjścia? Pobierania informacji ze źródeł danych, zdolnych przesyłać sekwencje bajtów,
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
1. Pomyśl sobie liczbę dwucyfrową (Na przykład: 62)
Programowanie obiektowe – język C++
Programowanie obiektowe 2013/2014
ZWIĄZKI MIĘDZY KLASAMI KLASY ABSTRAKCYJNE OGRANICZENIA INTERFEJSY SZABLONY safa Michał Telus.
1 Strumienie Hierarchie klas strumieniowych, strumienie bajtowe - klasy InputStream i OutputStream i ich metody, klasa File, strumienie plikowe, strumienie.
Programowanie sieciowe w Javie
EcoCondens Kompakt BBK 7-22 E.
EcoCondens BBS 2,9-28 E.
Programowanie w języku C++
Projektowanie stron WWW
User experience studio Użyteczna biblioteka Teraźniejszość i przyszłość informacji naukowej.
WYNIKI EGZAMINU MATURALNEGO W ZESPOLE SZKÓŁ TECHNICZNYCH
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Testogranie TESTOGRANIE Bogdana Berezy.
Jak Jaś parował skarpetki Andrzej Majkowski 1 informatyka +
Programowanie strukturalne i obiektowe C++
Elementy geometryczne i relacje
Programowanie Zaawansowane
Wykład 2 Programowanie obiektowe. Programowanie obiektowe wymaga dobrego zrozumienia działania funkcji definiowanych przez użytkownika, w ten sposób będziemy.
Strumienie w języku Java Bartosz Walter InMoST Wielkopolska sieć współpracy w zakresie innowacyjnych metod wytwarzania oprogramowania Termin realizacji:
Programowanie Obiektowe – Wykład 6
Strumienie, Wczytywanie, Zapisywanie, Operacje na plikach
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
(według:
Programowanie Obiektowe – Wykład 2
Programowanie obiektowe – zastosowanie języka Java SE
PGO - Projektowanie i implementacja pierwszych klas
Zapis prezentacji:

Podstawowe aspekty programowania w Javie Michał Kuciapski m.kuciapski@univ.gda.pl

Cel przedmiotu Celem przedmiotu jest ukazanie podstawowych elementów składni języka programowania Java wraz z wykazaniem praktycznego ich zastosowania w tworzeniu aplikacji konsolowych, na podstawie rozbudowanego przykładu przy wsparciu ze strony technik analizy i projektowania obiektowego.

Programowanie obiektowe

Programowanie obiektowe Koncepcja, korzyści i podstawowe pojęcia

Koncepcja programowania obiektowego Programowanie obiektowe zakłada tworzenie oprogramowania składającego się ze społeczności obiektów, ułożonych w hierarchiczne struktury i potrafiących komunikować się ze sobą poprzez przesyłanie wiadomości, dla realizowania celów systemu. Programowanie obiektowe czerpie swoją koncepcję z rzeczywistego świata otaczającego nas składającego się z olbrzymiej ilości obiektów, jak np.: ludzie, budynki i struktur, jak np. organizacje.

Koncepcja programowania obiektowego Rzeczywiste obiekty Model problemu Algorytm Model problemu Program Obiekty oprogramowania Tradycyjny, uproszczony proces rozwiązywania problemu Podejście obiektowe proces rozwiązywania problemu Na podstawie „Object-Oriented Programming: From Problem Solving to Java”, Charles River Media 2003

Korzyści programowania obiektowego – dlaczego? Jednolitość – jedna reprezentacja problemu Zrozumiałość – organizacja kodu (klas) zgodnie z dziedziną zastosowania Rozszerzalność – jednolitość reprezentacji dziedziny problemu ułatwia równoległe rozwijanie oprogramowania Stabilność – przejrzystość organizacji kodu i jego modularność minimalizują konieczność zmian Wielokrotny użytek – decentralizacja kodu na komponenty

Podstawowe pojęcia obiektowości Pojęcie Interpretacja obiekt (ang. object) Każdy byt – pojęcie lub rzecz – mający znaczenie w kontekście rozwiązywania problemu w danej dziedzinie przedmiotowej. klasa (ang. class) Uogólnienie zbioru obiektów, które mają takie same atrybuty, operacje, związki i znaczenie. abstrakcja (ang. abstraction) Ignorowanie tych aspektów (cech, właściwości) przedmiotu, które nie są istotne z punktu widzenia bieżącego celu, a koncentrowanie się na aspektach właściwych. polimorfizm (ang. polymorphism) Możliwość nadawania tej samej nazwy różnym atrybutom i operacjom oraz wykonywania różnych procedur i akcji przez operacje o tych samych nazwach; pozwala na redukcję liczby nazw atrybutów i operacji.

Podstawowe pojęcia obiektowości Pojęcie Interpretacja hermetyzacja (ang. encapsulation) Różnicowanie dostępu do obiektu poprzez ujawnienie otoczeniu tylko tych informacji o jego atrybutach/operacjach, które są niezbędne do efektywnego odwoływania się do tego obiektu w systemie za pośrednictwem komunikatów. dziedziczenie (ang. inheritance) Przyporządkowanie atrybutów i operacji klasom obiektów na podstawie hierarchicznej zależności między nimi. Możliwe jest wielokrotne dziedziczenie, co oznacza, że dana klasa dziedziczy atrybuty i operacje z dowolnej liczby klas nadrzędnych. komunikat (ang. message) Specyfikacja wymiany informacji między obiektami, zawierająca zlecenia wykonania określonej operacji.

Paradygmat obiektowy Opanowywanie złożoności (dziedziny) problemu opiera się na powszechnie stosowanych zasadach: rozróżnianie poszczególnych obiektów tworzenie pojęć - łączenie obiektów w klasy znajdowanie zależności między pojęciami - klasami, wyprowadzanie nowych określanie relacji między obiektami

Programowanie obiektowe Klasy i obiekty

Klasa – definicja i koncepcja Klasa – opis obiektu lub obiektów z jednolitym zbiorem atrybutów i usług, zawierający opis tworzenia nowych obiektów w klasie. Klasa = wspólne własności + wspólne zachowania Klasy dla umożliwienia pisania programów tak, jak rozważany problem są zoorganizowane w struktury, co zapewnia: stabilność , przejrzystość, zrozumiałość i wielokrotną wykorzystywalność kodu.

Klasa – przykład struktury Component Button Container Canvas Checkbox Window Panel Label List Frame Dialog Scrollbar TextArea FileDialog TextField Hierarchia głównych klas pakietu AWT Okno dialogowe, które umożliwia wybranie konkretnego pliku z systemu plików. Okno, które nie posiada obramowania Okno posiadające obramowanie i może posiadać skojarzony z nim obiekt MenuBar Umożliwia tworzenie bardziej zawiłych form i dostosowywanie kontenerów do potrzeb. Reprezentacja czegoś co ma określoną pozycję i rozmiar oraz może być przedstawione na ekranie i odbierać zdarzenia Nadklasa klas zawierających komponenty. Kontener, który może zawierać obiekty innych klas i zarządzać ich rozmieszczeniem. Okno dialogowe, które może być modalne – odbierać komunikaty od użytkownika.

Definiowanie klasy – wersja uproszczona class NazwaKlasy { //pola typ_zmiennej zmienna; … // konstruktor - metoda o tej samej nazwie co klasa – wywoływana automatycznie // przy tworzeniu obiektu danej klasy NazwaKlasy (typ_argumentu nazwaAgrumentu){ treść konstruktora } // metody typ_zwracanej_wartości nazwaMetody (typ_argumentu nazwaAgrumentu [,…]){ treść metody } //koniec definicji klasy

Definiowanie klasy – wersja kompletna [modyfikatory] class NazwaKlasy [extends NazwaNadklasy] [implements NazwyInterfejsów] { //pola [modyfikatory] typ_zmiennej zmienna; … // konstruktor - metoda o tej samej nazwie co klasa – wywoływana automatycznie // przy tworzeniu obiektu danej klasy NazwaKlasy (typ_argumentu nazwaAgrumentu [,…]){ treść konstruktora } // metody [modyfikatory] typ_zwracanej_wartości nazwaMetody (typ_argumentu nazwaAgrumentu [,…]){ treść metody } //koniec definicji klasy

Definiowanie klasy – modyfikatory Modyfikatory dostępu (widoczności) Nazwa Opis public Klasa jest ogólnodostępna. brak Dostęp do klasy mają klasy jedynie z tego samego pliku definicji klas. Modyfikatory właściwości Nazwa Opis abstract Reprezentuje abstrakcyjną koncepcję, opisującą pewne własności wspólne dla grupy klas z niej dziedziczących, stanowiąc dla nich niejako szablon. Dla samej klasy abstrakcyjnej nie są tworzone obiekty. final Definicja klasy jest ostateczna i przesłanianie nie jest możliwe poprzez dziedziczenie

Definiowanie klasy – abstract i final jeśli final X X

Definiowanie klasy – przykłady deklaracji Public: public class Nauczyciel {definicja} public class Nauczyciel extends Osoba {definicja} Bez modyfikatora dostępu: class Nauczyciel {definicja} Abstract: abstract class FiguraPłaska {definicja} public abstract class Osoba {definicja} Final: public final class Math extends Object {definicja}

Definiowanie klasy – przykłady definicji

Definiowanie klasy – przykłady definicji

Definiowanie klasy – przykłady definicji public class Klient { public static int wiek; public static byte ilośćLat = 26; public static miesiąceŻycia(byte lata) { return lata * 12; } public static void main(String[] args) { wiek = miesiąceŻycia(ilośćLat); System.out.writeln(wiek);

Klasy – dziedziczenie - definicja i koncepcja Dziedziczenie - jest operacją polegającą na utworzeniu nowej klasy na bazie klasy już istniejącej. Nowa klasa nosi podklasy (ang. subclass), a klasa z której dziedziczy nazwę nadklasy (ang. superclass). Podklasa jest uszczegółowieniem nadklasy. Dziedziczenie polega na „przejęciu” pól i metod z jednej klasy (nadklasy) przez drugą klasę (podklasę). Związek dziedziczenia można opisać słowem „jest” – np. student jest osobą. Stosowanie dziedziczenia pomaga w praktyce wykorzystywać zasadę ponownego użycia.

Klasy – dziedziczenie - założenia Dziedziczenie w języku Java: Jest możliwe wyłącznie jednokrotne – wyłącznie jedna nadklasa; Podczas dziedziczenia są uwzględnione modyfikatory dostępu i właściwości: Niemożliwe jest dziedziczenie z klas o modyfikatorach: private, final Pola i metody o modyfikatorze dostępu private nie są dziedziczone; Podczas dziedziczenia są uwzględnione typy klas – niemożliwe jest dziedziczenie z klas lokalnych czy wewnętrznych

Klasy – dziedziczenie - deklaracja [modyfikatory] class NazwaKlasy [extends NazwaNadklasy] extends – słowo kluczowe wskazujące, że klasa dziedziczy pola i metody innej klasy NazwaNadklasy – nazwa klasy, z której klasa dziedziczy pola i metody Przykłady: public class Student extends Osoba class Analiza extends Applet

Klasy – dziedziczenie - przykłady

Klasy – dziedziczenie - przykłady

Klasy – dziedziczenie - przykłady Pola i obwody figur płaskich Gra RPG

Typy klas Nazwa Opis wewnętrzna Klasa zdefiniowana w miejscu, w którym może wystąpić definicja pola danych lub metody. Klasy wewnętrzne, w odróżnieniu od zewnętrznych, mogą mieć modyfikator static, wskazujący że, klasa wewnętrzna ma takie same właściwości jak klasa zewnętrzna. lokalna Zdefiniowana w bloku programu Javy. Klasa taka może odwoływać się do wszystkich zmiennych widocznych w miejscu wystąpienia jej definicji. Klasa lokalna jest widoczna, i może zostać użyta, tylko w bloku w którym została zdefiniowana. anonimowa Klasa bez nazwy i konstruktora, definiowana za pomocą wyrażenia w klamrach znajdującego się w konstruktorze nadklasy.

Typy klas – przykłady – klasa wewnętrzna public class Test { private int m_nLiczba = 0; private Licznik licznik; public static void main(String args[]) Test test = new Test(); test.licznik = test.new Licznik(); test.licznik.dodaj(); System.out.println("Licznik = " + test.licznik.wez()); } class Licznik public int wez() return m_nLiczba; public void dodaj() m_nLiczba++; }// koniec definicji klasy wewnętrznej Licznik }// koniec definicji klasy zewnętrznej Test

Typy klas – przykłady – klasa lokalna public class Test { private int m_nLiczba = 0; public static void main(String args[]) final Test test = new Test(); class Licznik int wez() {return test.m_nLiczba; } void dodaj() {test.m_nLiczba++; } }; Licznik licznik = new Licznik(); licznik.dodaj(); System.out.println("Licznik = " + licznik.wez()); }

Typy klas – przykłady – klasa anonimowa public class Test { private int m_nLiczba = 0; private Licznik licznik; public static void main(String args[]) Test test = new Test(); test.licznik.dodaj(); PrintWriter stdout = new PrintWriter(System.out, true); stdout.println("Licznik = "+test.licznik.wez()); } Test() this.licznik = new Licznik() public int wez() {return m_nLiczba; } public void dodaj() {m_nLiczba++; } };

Klasy – pakiety – definicja i koncepcja Pakiety są zbiorem klas wydzielonych ze względu na wspólną tematykę i ułożonych hierarchicznie. Organizacja klas w ten sposób umożliwia lepsze ich zarządzanie i jest odpowiednikiem bibliotek w językach proceduralnych. Organizacja klas w pakiety ułatwia znacząco ich wykorzystanie przy definiowaniu nowych. Możliwe jest tworzenie własnych pakietów jak i dodawanie definiowanych klas do już istniejących. Umieszczenie klas w pakiecie jest analogiczne do umieszczenia klas w strukturze katalogów.

Klasy – pakiety – przykłady Opis java.lang Zawiera podstawowe klasy Java automatycznie importowane do każdej klasy. java.applet  Klasy związane z tworzeniem appletów. java.awt (AWT - Abstract Window Toolkit) zawiera klasy dla tworzenia interfejsu graficznego użytkownika oraz grafiki. java.io Zawiera klasy zarządzające wejściowym i wyjściowym strumieniem danych. java.util Zawiera szereg dodatkowych klas narzędziowych. java.net  Zawiera klasy sieciowe dla podstawowych protokołów stosowanych w Internecie: FTP, HTTP, SMTP, NNTP oraz TCP/IP.

Klasy – pakiety – wykorzystanie i definiowanie Wykorzystanie poprzez wyrażenie: import ścieżka_do_pakietu(ów); import java.io.*; import java.util.*; Definiowanie poprzez wyrażenie: package ścieżka_umieszczenia_pakietu; package figury; package figury.płaskie; Instrukcje związane z pakietami są umieszczane na początku definicji klasy. Przykład Przykład

Klasy – pola – definicja i nazewnictwo Pola danych są atrybutami klasy, pełniącymi rolę analogiczną do zmiennych lub stałych, z tą różnicą, że są widoczne co najmniej w obrębie całej klasy. Pola danych są one deklarowane na tych samych zasadach, co zmienne lokalne, ale bezpośrednio po deklaracji klasy. Dla rozróżnienia nazw pól od pozostałych zmiennych należy stosować podczas deklaracji nazwy zgodnie z przyjętą konwencją. Najczęściej używa się przedrosków, jak pol czy atr, np.: polImie, atrImie.

Klasy – pola - deklaracja [modyfikatoryPola] TypPola NazwaPola; Nazwa Opis modyfikatoryPola Określają tryb dostępu (np. private) i właściwości pola (np. static) TypPola Specyfikuje typ pola danych; NazwaPola Określa nazwę deklarowanego pola. Przykłady: private boolean atrPracuje = true; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static double atrPI = 3,14; protected String polNazwisko; double oceny[] = new double[10];

Klasy – pola - przykłady public class WyswietlInformacje { private int iloscZnalezien = 0; // dalsze instrukcje public int[] wyszukiwanieOsoby(ArrayList parOsoba, String parSzukania[], String parTyp) int[] pozycjeWyszukane = new int[10]; if (parTyp.equals("nauczyciel")) if (nauczyciel.imie.equals(parSzukania[0]) && nauczyciel.nazwisko.equals(parSzukania[1])) iloscZnalezien++; } Pole Zmienna Wykorzystanie atrybutu

Klasy – pola - modyfikatory dostępu Są wspólne dla pól danych i metod Nazwa Opis public Wszystkie klasy mają dostęp do pól danych i metod public. private Dostęp do metod i pól danych posiadają jedynie inne metody tej samej klasy. protected Metoda lub pole danych protected lub może być używana jedynie przez metody swojej klasy oraz metody wszystkich jej klas pochodnych. package Jest to modyfikator domyślny, wszystkie metody i pola danych bez modyfikatora dostępu traktowane są jako typu package. Metody (lub pola danych) typu package mogą być używane przez inne klasy danego pakietu.

Klasy - pola i metody – modyfikatory dostępu

Klasy – pola - modyfikatory właściwości Nazwa Opis final Oznacza, że wartość może dla tego pola zostać zainicjonowana wyłącznie podczas tworzenia obiektu i nie może być później modyfikowana. Pole danych jest stałą. static Pole danych odnosi się klasy a nie obiektu, co oznacza, że dla wszystkich obiektów danej klasy pole statyczne ma tę samą wartość. transient Nie jest trwałą częścią obiektu i nie zostanie zachowane przy archiwizacji obiektu. volatile Może modyfikowane asynchronicznie, przez konkurencyjne wątki w programach wielowątkowych.

Klasy – pola - przykłady public class Test { int poleFinal; Pole pole1 = new Pole(); void testujPola() { pole1.prywatne = 1; pole1.chronione = 1; pole1.publiczne = 1; poleFinal = pole1.finalne; pole1.finalne = 1; pole1.statyczne = 1; pole1.pakietowe = 1; } class Pole { private int prywatne; protected int chronione; public int publiczne; final int finalne = 0; static int statyczne; int pakietowe; }

Klasy – pola - przykłady class Pole { static int statyczne = 0; } public class Test Pole pole1 = new Pole(); Pole pole2 = new Pole(); void testujPola() { System.out.println("Wywołanie poprzez klasę:" + Pole.statyczne); System.out.println("Wywołanie poprzez obiekt:" + pole1.statyczne); pole2.statyczne = 2; Pole.statyczne = 100; System.out.println("Wywołanie poprzez obiekt:" + pole2.statyczne);

Klasy – metody – definicja i nazewnictwo Metoda jest zbiorem instrukcji (blokiem kodu) przypisanych do jednej przestrzeni nazw mającej właściwość wielokrotnego wykorzystania. Celem metod jest umożliwienie wielokrotnego wywołania tego samego fragmentu kodu poprzez podanie jego nazwy. Metody mogą być definiowane w dowolnym miejscu klasy. Metody nie zwracające wartości noszą nazwę procedur, a metody zwracające wartości noszą nazwę funkcji. Metodą od której rozpoczynane jest wykonywanie aplikacji jest: public static void main (String args[]) { }

Klasy – metoda - deklaracja [modyfikatory] TypZwracanejWartości nazwaMetody([Parametry]) { //treść metody } Nazwa Opis modyfikatoryPola Określa tryb dostępu (np. private) i właściwości metody (np. static) TypZwracanejWartości Specyfikuje typ zwracanej wartości przez metodę – void jeśli metoda nie zwraca wartości. NazwaMetody Określa nazwę deklarowanej metody. Parametry Są zmiennymi przekazywanymi do metody wykorzystywanymi przez jej instrukcję

Klasy – metody - modyfikatory dostępu Są wspólne dla pól danych i metod Nazwa Opis public Wszystkie klasy mają dostęp do pól danych i metod public. private Dostęp do metod i pól danych posiadają jedynie inne metody tej samej klasy. protected Metoda lub pole danych protected lub może być używana jedynie przez metody swojej klasy oraz metody wszystkich jej klas pochodnych. package Jest to modyfikator domyślny, wszystkie metody i pola danych bez modyfikatora dostępu traktowane są jako typu package. Metody (lub pola danych) typu package mogą być używane przez inne klasy danego pakietu.

Klasy - pola i metody – modyfikatory dostępu

Klasy – pola - modyfikatory właściwości Nazwa Opis final Oznacza, że definicja metody jest ostateczna i nie jest możliwe jej przesłanianie podczas dziedziczenia. static Metoda odnosi się klasy a nie obiektu, co oznacza, że metodę można wywoływać dla klasy bez konieczności tworzenia obiektów tej klasy. abstract Definicja metody zawiera jedynie deklarację, wskazując, że każda dziedzicząca klasa musi posiadać jej implementację. synchronized Wykorzystywany w programach wielowątkowych, zapewniający wykonanie wszystkich metod dla jednego wątka oznaczonych tym modyfikatorem przed dostępem do nich kolejnego wątka. native Metoda jest napisana w innym języku niż Java.

Klasy – metody - przykłady public Nauczyciel dodaj() throws IOException { PobieranieDanych tym = new PobieranieDanych(); tym.dodajNauczyciel(); if (tym.czyPracuje.equals("")) return new Nauczyciel(tym.imie, tym.nazwisko, tym.wiek); else tym.wiek, tym.pracuje, tym.pensja); } Słowo kluczowe po którym podajemy zwracaną przez funkcje wartość

Klasy – metody - przykłady public static void zapiszDaneNauczycieli(ArrayList daneNauczycieli) throws IOException { FileWriter plikNauczyciele = new FileWriter("nauczyciele.txt"); Object zapiszDane[] = daneNauczycieli.toArray(); String dane; for (int i = 0; i < zapiszDane.length; i++) Nauczyciel nauczyciel = (Nauczyciel) zapiszDane[i]; dane = nauczyciel.przygotujInformacje(); plikNauczyciele.write(dane); } plikNauczyciele.close();

Klasy – metody - przykłady public void usuwanieOsoby(ArrayList parOsoba, int parPozycjeWyszukane[]) throws IOException { PobieranieDanych tym = new PobieranieDanych(); if (tym.czyUsunac() == true) for (int i = 0, wielkoscZmniejszenia = 0; i < this.iloscZnalezien; i++, wielkoscZmniejszenia++) parOsoba.remove(parPozycjeWyszukane[i] - wielkoscZmniejszenia); } System.out.println("Pozycje skasowane");

Klasy – metody - przeciążenie Przeciążanie metod polega na definiowaniu metod o tych samych nazwach, rozróżnianych na podstawie ilości lub typów parametrów. Umożliwia to wywołanie odpowiedniej metody w zależności od parametrów wywołania. Nie możliwe jest rozróżnianie metod na podstawie zwracanych przez nie typów wartości. Przeciążanie umożliwia posiadanie definicji szeregu metod wykonujących różne instrukcje, ale posiadające tą samą nazwę. Znacząco ułatwia to programowanie i poprawia przejrzystość kodu.

Klasy – metody – przeciążenie Przykład public Prostokąt(double parBok1) { atrNazwa = "Kwadrat"; atrBokLubPromień = parBok1; } public Prostokąt(double parBok1, double parBok2) { atrNazwa = "Prostokąt"; atrBok2 = parBok2;

Klasa – konstruktor – definicja Konstruktor jest metodą wywoływaną w trakcie tworzenia obiektu, służącą głównie inicjalizacji wartości pól obiektu. Konstruktor posiada identyczną nazwę z nazwą klasy i podobnie jak pozostałe metody może być przeciążany.

Klasa – konstruktor – definicja Konstruktor jest metodą wywoływaną w trakcie tworzenia obiektu, służącą głównie inicjalizacji wartości pól obiektu. Konstruktor posiada identyczną nazwę z nazwą klasy i podobnie jak pozostałe metody może być przeciążany.

Klasa – konstruktor – założenia Gdy klasa nie posiada zdefiniowanego konstruktora wykonywany jest domyślny konstruktor nadklasy. Za pomocą słowa kluczowego super możliwe jest wywołanie konstruktora nadklasy. Słowo kluczowe this oznacza odwołanie do aktualnego obiektu.

Klasa – konstruktor – przykład public class Student extends Osoba { public Student (String parImie, String parNazwisko, int parWiek, int parNrIndeksu, double parSrednia) super(parImie, parNazwisko, parWiek); this.nrIndeksu = parNrIndeksu; this.srednia = parSrednia; }

Klasa – konstruktor – przykład public abstract class Osoba { protected String imie; protected String nazwisko; protected int wiek; public Osoba () } public Osoba (String parImie, String parNazwisko, int parWiek) this.imie = parImie; this.nazwisko = parNazwisko; this.wiek = parWiek;

Obiekt – definicja i koncepcja Obiekt jest abstrakcją czegoś w dziedzinie problemu, odzwierciedlającą zdolności systemu do przechowywania informacji o tym, interakcji z tym czymś, lub obie te rzeczy. Obiekt programistyczny jest modelem rzeczywistego obiektu, np.: student czy nauczyciel. Jest swego rodzaju nowym typem danych. Obiekt jest generowany na podstawie wzorca klasy, będącej abstrakcją grupy obiektów o podobnej charakterystyce. Obiekt = (identyfikakacja) - nazwa + stan (pola) + zachowanie (metody)

Obiekt - klasyfikacja Obiekty interfejsu użytkownika Użytkownik programu kontaktuje się bezpośrednio z nimi Nazywane są czasami widgets (window gadgets) Przykłady: przyciski, listy wyboru, listy przewijane Obiekty środowiska operacyjnego Są kontrolowane przez system operacyjny Udostępniają usługi innym obiektom Obiekty zadaniowe Dokumenty Multimedia Obiekty dziedziny przedmiotowej – np.: faktura, konto, pracownik

Obiekt – deklaracja, inicjalizacja, definicja TypObiektu NazwaObiektu; Przykład: Nauczyciel nauczyciel1; Inicjalizacja NazwaObiektu = new NazwaObiektu(ParametryKonstruktora); Przykład: nauczyciel1 = new Nauczyciel(” Jan”, ”Adamski”, 29); Definicja TypObiektu NazwaObiektu = new NazwaObiektu(ParametryKonstruktora); Przykład Student student1 = new Student(tym.imie, tym.nazwisko, tym.wiek, tym.nrIndeksu, tym.srednia);

Obiekt – odwołanie do pól i metod Odwoływanie do pól i metod obiekty następuje za pomocą operatora „.” Przykłady: imie = parImie; this.imie = noweDane.imie; tym.czyPracuje.equals(""); UzupełnijAtrybuty(); System.out.println(wyswietlanyTekst); tym.wiek = Integer.parseInt(dane); OperacjePlikowe.wczytajDaneNauczycieli(nauczyciele); nauczyciele.add(dodawany.dodaj()); daneNauczycieli.add(new Nauczyciel(tym.imie, tym.nazwisko, tym.wiek, tym.pracuje, tym.pensja));

Związki pomiędzy obiektami i klasami Bardzo rzadkie są przypadki, aby obiekty funkcjonowały zupełnie niezależnie od siebie Można wyróżnić 2 rodzaje związków pomiędzy nimi. Asocjacja Związek o charakterze strukturalnym Wskazuje, które obiekty wzajemnie się „znają” Przykład: OperacjePlikowe.wczytajDaneNauczycieli(nauczyciele);

Związki pomiędzy obiektami i klasami Kompozycja Związek o charakterze całość-część Ma mocniejszy charakter – jeden z obiektów nie może istnieć bez drugiego Obiekty wzajemnie wiedzą o swoim istnieniu Można opisać ten związek słowem „ma” class Samochód { Podwozie podwozie = new Podwozie(); Koło[] koło = new Koło[4]; Karoserja karoserja = new Karoserja(); void złóż() //instrukcje }

Obiekty i klasy - polimorfizm Polimorfizm to możliwość nadawania tej samej nazwy różnym atrybutom i operacjom oraz wykonywania różnych procedur i akcji przez operacje o tych samych nazwach; pozwala na redukcję liczby nazw atrybutów i operacji. Polimorfizm umożliwia rozróżnianie operacji dla poszczególnych obiektów klas będących specyfikacjami nadklasy, gdy są wykonywane jako obiekt nadklasy. Polimorfizm umożliwia podstawianie pod obiekt nadklasy obiektów podklas.

Obiekty i klasy – polimorfizm - przykład public class Koło extends FiguraPłaska { public double obwód() return 12.8; } public abstract class FiguraPłaska { protected String atrNazwa; FiguraPłaska() this.atrNazwa = "Nieznana"; } public double obwód() return 0.0; public class Kwadrat extends FiguraPłaska { public double obwód() return 4.9; }

Obiekty i klasy – polimorfizm – przykład c.d public class Wyświetl { public static void wyświetlInf(FiguraPłaska parFigura) System.out.println(parFigura.atrNazwa); System.out.println(parFigura.obwód()); } public class Program { public static void main (String args[]) Koło koło = new Koło(); Kwadrat kwadrat = new Kwadrat(); Wyświetl.wyświetlInf(koło); Wyświetl.wyświetlInf(kwadrat); }

Obiekt - usuwanie Java nie wymaga definiowania destruktorów. Jest tak dlatego, że istnieje mechanizm automatycznego zarządzania pamięcią (ang. garbage collection). Obiekt istnieje w pamięci tak długo, jak długo istnieje do niego jakakolwiek referencja w programie, w tym sensie, że gdy referencja do obiektu nie jest już przechowywana przez żadną zmienną obiekt jest automatycznie usuwany a zajmowana przez niego pamięć zwalniana. W Javie zautomatyzowane istnieje możliwość deklaracji specjalnej metody finalize, która będzie wykonywana przed usunięciem obiektu z pamięci. Deklaracja takiej metody ma zastosowanie, gdy nasz obiekt np.: ma referencje do urządzeń wejścia-wyjścia.

Obiekt – usuwanie - przykład protected void finalize () throws Throwable { if (m_plik != null) m_plik.close(); m_plik = null; }

Obiekty – rzutowanie – definicja i składnia Rzutowanie (ang. casting) polega na skonwertowaniu zmiennej do pożądanego typu. Możliwe jest jedynie rzutowanie określonych typów na inne np.: double na int i odwrotnie. W przypadku tworzonych obiektów możliwe jest jedynie rzutowanie nadklasy na podklasę (najczęstszy przypadek) i na odwrót. W drugim przypadku następuje utrata pól i metod niezdefiniowanych w nadklasie.

Obiekty – rzutowanie – przykład public class Koło extends FiguraPłaska { // wcześniejsze instrukcje double pole() return 34.1; } public class Wyświetl public static void wyświetlInf(FiguraPłaska parFigura) Koło koło = new Koło(); //wcześniejsze instrukcje koło = (Koło)parFigura; System.out.println(koło.pole());

Obiekty – podstawowe typy Nazwa Opis Object Klasa znajdująca się na szczycie hierarchii, obiektowi typu Object może być przypisany dowolny obiekt. String String imię = new String(”Antoni”); Imie.equals("Koło"); Integer, Double Integer dniUrlopu = new Integer(17); iRok.toString() ; Integer.parseInt(br.readLine()); Date Date data = new Date(2006, 1, 14); Date dziś = new Date(); dziś.getYear();

Obiekty – podstawowe typy – String - metody Nazwa Opis equals (Object object) Porównuje napis do obiektu. indexOf(String str, int fromIndex) Zwraca pozycję pierwszego znalezionego napisu rozpoczynając szukanie od podanego indeksu. length() Zwraca długość napisu. replace(char oldChar, char newChar) Zwraca nowy tekst z zamienionymi wszystkimi wystąpieniami oldChar na newChar. substring (int beginIndex, int endIndex) Zwraca nowy napis który jest fragmentem wcześniejszego od indeksu początkowego do końcowego. toLowerCase() toUpperCase() Konwertuje wszystkie znaki napisu na małe/duże. trim() Kopiuje napis z pominięciem początkowych i końcowych spacji. http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html

Obiekty – podstawowe typy – String - przykład public class StringTest { public static void main(String[] args){ String dane = " Arkadiusz Radomski "; System.out.println("Dane: " + dane); System.out.println("Dane z małej litery: " + dane.toLowerCase()); System.out.println("Nazwisko na pozycji:" + dane.indexOf("Radomski")); System.out.println("Znaki od 5 do 12:" + dane.substring(5,12)); System.out.println("Długość napisu" + dane.length()); System.out.println("Napis bez początkowych i końcowych spacji: " + dane.trim() + "****"); }

Obiekty – podstawowe typy – Date - metody Nazwa Opis after(Date when) before(Date when) Sprawdza czy data znajduje się po/przed wyspecyfikowanej dacie. compareTo(Date anotherDate) Sprawdza dwie daty pod kątem sortowania. equals(Object obj) Sprawdza daty pod kątem identyczności. getDate() getDay() getHours() getMinutes() getMonth() getSeconds() getTime() getYear() Zwraca odpowiednio: datę / dzień / godzinę / minuty / miesiąc / sekundy / czas / rok. Metody te oprócz getTime() są zamienione przez metodę get klasy Calendar – np. Calendar.get(Calendar.DAY_OF_MONTH) setDate(int date) , …, setTime(long time) Umożliwiają ustawienie odpowiedniego parametru daty. Analogicznie jak wcześniej są one zamienione przez metodę klasy Calendar – np. Calendar.set(Calendar.SECOND, int seconds) toString() Przekształca datę na napis. http://http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html

Obiekty – podstawowe typy – Date - format Za format daty jest odpowiedzialna klasa DateFormat. Podstawowe style w zależności od długości prezentacji daty: SHORT - np. 12.13.52 or 3:30pm MEDIUM - np. Jan 12, 1952 LONG – np. January 12, 1952 or 3:30:32pm FULL – np. Tuesday, April 12, 1952 AD or 3:30:42pm PST. Metoda getInstance() umożliwia pobranie lokalnego profilu wyświetlania daty. Metoda format(Date date) umożliwia przeformatowanie daty zgodnie z przyjętym profilem. http://http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html

Obiekty – podstawowe typy – Date - przykład import java.util.*; import java.text.DateFormat; public class TestData { static Date data = new Date(1997,12,05,14,45,32); public static void main(String args[]) System.out.println("Wprowadzona data: " + data.toString()); System.out.println("Rok: " + data.getYear()); System.out.println("Czas: " + data.getTime()); data.setYear(27); System.out.println("Nowa data: " + data.toString() ); DateFormat formatDaty = DateFormat.getInstance(); System.out.println("Data pokazana zgodnie z profilem lokalnym:\n" + formatDaty.format(data)) ; formatDaty = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); System.out.println("Data pokazana zgodnie z profilem \"najdłuższym\":\n" + formatDaty.format(data)); }

Obiekty – podstawowe typy – Date - pozostałe klasy Pakiet java.util zawiera dwie klasy związane z datą i czasem systemowym: Calendar GregorianCalendar Obiekt reprezentujący kalendarz z aktualną datą i czasem można więc utworzyć na dwa sposoby: Calendar calendar = Calendar.getInstance(); GregorianCalendar calendar = new GregorianCalendar (); Pobranie daty i czasu umożliwia metoda get(): int dzien = calendar.get(Calendar.DAY_OF_MONTH); int miesiac = calendar.get(Calendar.MONTH)+1; int rok = calendar.get(Calendar.YEAR); int godz = calendar.get(Calendar.HOUR_OF_DAY); int min = calendar.get(Calendar.MINUTE); int sek = calendar.get(Calendar.SECOND);

Interfejsy - definicja Interfejsy są szablonami klas wyrażającymi jedynie, że klasa która je implementuje musi zaimplementować wszystkie metody wyrażone w interfejsie. Dzięki temu wymuszają ich określoną składnię - zawieranie określonych procedur i funkcji przez klasę. Każdy interfejs i klasa może implementować dowolną ilość interfejsów. Interfejsy definiuje się podobnie do klas.

Interfejsy – definiowanie i wykorzystanie Deklaracja: [modyfikatory] interface NazwaInterfejsu { //deklaracje metod } Przykład: public interface Uruchamianie int przykładowaMetoda(int y); Wykorzystanie: Deklaracja_klasy implements nazwa interfejsu Przykład: class Animacja extends Applet implements Uruchamianie

Programowanie obiektowe Kolekcje

Kolekcje - definicja Kolekcje umożliwiają przechowywanie i zarządzanie w pamięci obiektami dowolnego typu. Są one kontenerami – elementami umożliwiającymi przechowywanie wielu obiektów. Kolekcję są elementem zbliżonym funkcjonalnie do tablic z dwoma zasadniczymi różnicami: Mogą przechowywać obiekty różnego typu Automatycznie zarządzają wielkością kolekcji Celem kolekcji jest umożliwienie dynamicznego dodawania i usuwania obiektów bez konieczności „zarządzania pamięcią im przydzielaną” – są „automatycznie dopasowującą się do zawartości tablicą”.

Kolekcje – struktura - interfejsy Collection Map Set List Queue SortedMap SortedSet Kolekcja, która nie może zawierać duplikatów elementów. Przykłady użyć: poker, plan studentów, procesy uruchomione na komputerze. Interfejs Collection reprezentuje grupę obiektów nazywanych elementami. Wszystkie kolekcje implementują ten interfejs określający sposób przekazywania kolekcji i manipulowania nimi. Analogicznie jak SortedSet jest to kolekcja utrzymująca posortowane rosnąco pary klucze/wartości. Przykład – książka telefoniczna, lista pracowników. Kolekcja utrzymująca posortowane rosnąco elementy. Przykład: lista słów w słowniku. Ułożona kolekcja (nazywana sekwencją), mogąca zawierać duplikaty elementów. Przykłady: kolekcja palet produktów przychodzących do magazynu, rejestracja wejść osób do kabiny z bankomatem. Kolekcja wykorzystywana do przechowywania wielu elementów przed ich przetworzeniem. Posiada dodatkowe operacje: dodawania, wyciągania i inspecji. Przykład - kolejka zadań do wykonania. Kolekcja mapująca klucze (identyfikatory) do wartości. Każdy klucz musi być unikalny i może mapować jedynie do jednej wartości. Koncepcja zbliżona do Hashtable.

Kolekcje – przykładowe implementacje List Vector ArrayList Implementuje kolekcję (listę) podobnie jak klasa wektora (Vector), z tą różnicą, że dostęp do kolekcji jest asynchroniczy (czyt. nie ma wsparcia dla dostępu synchronicznego). Dostęp do kolekcji typu ArrayList przez kilka wątków nie jest bezpieczny. Implementuje kolekcję (listę) jako tablicę automatycznie dopasowującą swoją wielkość do zawartości. Obiekty mogą być pobierane analogicznie jak w tablicach za pomocą indeksu. Vektor jest klasą kontenera, która umożliwia dostęp synchroniczny – wielowątkowy.

Kolekcje – przykładowe implementacje c.d Map HashTable TreeMap Implementuje TreeMap(K,V) kolekcję (mapę) przechowującą klucze typu K i wartości(obekty) typu V ułożone w rosnącej kolejności. HashTable<K,V> implementuje mapę z kluczami typu k i wartościami typu V. Klasa definiująca klucz musi wspierać metody hashcode() oraz equals(). Ten typ kolekcji jest typem wspierającym synchroniczność – możliwy dostęp przez wiele wątków.

Kolekcje – zdefiniowanie Aby móc zdefiniować zmienną typu kolekcji należy najpierw zaimportować odpowiednie klasy: wszystkie - import java.util.*; konkretną - import java.util.Vector; Deklaracja: TypKolekcji [<TypWartości>] NazwaKolekcji = new TypKolekcji [<TypWartości>](); Przykłady: ArrayList nauczyciele = new ArrayList(); Vector<String>names =new Vector<String>(); Map<String, Integer> m = new HashMap<String, Integer>();

Kolekcje – podstawowe metody Nazwa Opis containsAll Zwraca true jeśli docelowa kolekcja zawiera wszystkie elementy wyspecyfikowanej kolekcji. addAll Dodaje wszystkie elementy do kolekcji docelowej kolekcji wyspecyfikowanej. removeAll Usuwa wszystkie elementy kolekcji, które znajdują w wyspecyfikowanej kolekcji. retainAll Usuwa kolekcji wszystkie elementy, które nie są zawarte w wyspecyfikowanej kolekcji. clear Usuwa wszystkie elementy z kolekcji

Kolekcje – podstawowe metody c. d. Nazwa Opis toArray Powoduje utworzenie z kolekcji tablicy. add Powoduje dodanie elementu do kolekcji. remove Powoduje usunięcie elementu z kolekcji. set Umożliwia zmodyfikowanie elementu kolekcji. get Powoduje pobranie elementu kolekcji. next Powoduje przejście do kolejnego elementu kolekcji. search Umożliwia wyszukanie elementu w kolekcji poprzez zwrócenie jego pozycji. sort Powoduje posortowanie kolekcji. reverse Powoduje odwrócenie kolejności elementów kolekcji.

Kolekcje – przykłady wykorzystania metod s1.containsAll(s2) ; names.add(firstname); nauczyciele.add(dodawany.dodaj()); nauczyciele.clear(); studenci.next(); parOsoba.remove(parPozycjeWyszukane[i] - wielkoscZmniejszenia); Object listaStudentow[] = parStudenci.toArray(); parOsoba.get(parPozycjeWyszukane[numerOsoby - 1]); a.set(i, a.get(j));

Kolekcje - przechodzenie Przy wykorzystaniu pętli for-each możliwe jest przejście przez wszystkie elementy kolekcji oraz tablicy. Składnia: for (TypWartości zmienna : nazwaKolekcji) { //instrukcje } Przykład: for (Object o : collection) System.out.println(o);

Kolekcje – przykłady - Vector import java.util.Vector; public class PrzykładVector{ public static void main(String[]args){ Vector<String> imiona = new Vector<String>(); String[] imionaL = {„Adam", „Jan", „Gosia", „Patryk" }; for(String imie : imionaL){ imiona.add(imie); } for(String imie : imiona){ System.out.println(imie);

Kolekcje – przykłady - ArrayList public void wyswietlListaNauczycieli(ArrayList parNauczyciele) { Object listaNauczycieli[] = parNauczyciele.toArray(); int licznikNauczyciele; System.out.println("\nL i s t a n a u c z y c i e l i :\n"); for (licznikNauczyciele = 0; licznikNauczyciele < listaNauczycieli.length; licznikNauczyciele++) String wyswietlanyTekst, parPracuje; Nauczyciel nauczyciel = (Nauczyciel) listaNauczycieli[licznikNauczyciele]; wyswietlanyTekst = licznikNauczyciele + 1 + "."; System.out.println(wyswietlanyTekst); nauczyciel.wyswietlInformacje(); }

Kolekcje – przykłady - Map import java.util.*; public class Freq { public static void main(String args[]) { Map<String, Integer> m = new HashMap<String, Integer>(); for (String a : args) { Integer freq = m.get(a); m.put(a, (freq == null ? 1 : freq + 1)); } System.out.println(m.size() + " różnych słów:"); System.out.println(m);

Kolekcje - definicja Kolekcje umożliwiają przechowywanie i zarządzanie w pamięci obiektami dowolnego typu. Kolekcję są elementem zbliżonym funkcjonalnie do tablic z dwoma zasadniczymi różnicami: Mogą przechowywać obiekty różnego typu Automatycznie zarządzają wielkością kolekcji Celem kolekcji jest umożliwienie dynamicznego dodawania i usuwania obiektów bez konieczności „zarządzania pamięcią im przydzielaną” – są „automatycznie dopasowującą się do zawartości tablicą”.

Programowanie obiektowe Wyjątki

Definicja i koncepcja Wyjątki (ang. exceptions) są sytuacją niestandardową (specjalną) związaną z działaniem programu, powodującą zawieszenie się lub niepoprawne wykonanie programu. Java posiada mechanizm obsługi wyjątków umożliwiający odpowiednie zareagowanie w takiej sytuacji i uniknięcie zawieszenia lub niepoprawnego wykonania programu. Przechwycenie wyjątku umożliwia przerwanie normalnego wykonywania programu i wykonanie instrukcji związanych z jego obsługą.

Przykłady sytuacji krytycznych Istnieje szereg sytuacji krytycznych głównie związanych z: Operacjami na plikach: Próba otwarcia pliku który nie istnieje, Próba zapisania danych do pliku, do którego nie mamy uprawnień. Niekompatybilne konwersje typów (np. ClassCastException, NumberFormatException ) Próba dostępu do elementu tablicy dalszym niż ostatni indeks (ArrayOutOfBoundsException) Brak obiektu odwołania (NullPointerException)

Struktura klas

Generowanie sytuacji wyjątkowych Generowanie (zgłoszenie) wyjątku dokonujemy poprzez throw new Exception("..."), jako utworzenie obiektu typu Exception i przerywanie wykonania bieżącej metody. Aby wskazać i poinformować JVM, że metoda może generować wyjątek typu Exception należy na jej końcu dodać słowa kluczowe throws Exception. Użycie tej frazy jest obowiązkowe, jeśli nasza metoda może generować wyjątek, np. dla metod posiadających instrukcję związane z I/O.

Generowanie sytuacji wyjątkowych - przykład public class WywolajWyjatek { static public void main(String args[]) throws Exception Liczba liczba = new Liczba(); liczba.dziel(1); } class Liczba int m_i = 10; int dziel(float i) throws Exception if (i/2 != 0) throw new Exception("Liczba nieparzysta!"); if (i == 0) throw new Exception("Dzielenie przez zero!"); return (int)(m_i/i);

Obsługa wyjątków - składnia try { //blok instrukcji gdzie może wystąpić wyjątek } catch (ObiektImplementujacyInterfejsThrowable nazwaZmiennej) //blok instrukcji obsługujących wystąpienia sytuacji wyjątkowej jest wykonywany tylko, gdy wystąpi wyjątek typu takiego jak typ zmiennej będącej parametrem bloku catch … finally //opcjonalnie // ten blok instrukcji jest wykonywany przed opuszczeniem sterowania, //nawet jeśli blok try zawiera instrukcję return lub spowodował //wystąpienie wyjątku

Obsługa wyjątków - przykład public class WywolajWyjatek { static public void main(String args[]) throws Exception Liczba liczba = new Liczba(); try { liczba.dziel(1); } catch (Exception e) { e.printStackTrace(); } System.out.println("obsługa wyjątków działa"); }

Obsługa wyjątków - przykład public static void zapiszDaneNauczycieli(ArrayList daneNauczycieli) throws IOException { FileWriter plikNauczyciele = new FileWriter("nauczyciele.txt"); Object zapiszDane[] = daneNauczycieli.toArray(); String dane; for (int i = 0; i < zapiszDane.length; i++) Nauczyciel nauczyciel = (Nauczyciel) zapiszDane[i]; dane = nauczyciel.przygotujInformacje(); plikNauczyciele.write(dane); } plikNauczyciele.close();

Obsługa wyjątków - przykład import java.io.*; class WyjątekZapisz { public static void zapisz(String ścieżka) throws IOException FileWriter plik = new FileWriter(ścieżka); String dane = "Przykładowe Dane"; plik.write(dane); plik.close(); }

Obsługa wyjątków – przykład c. d. public class Test { public static void main(String args[]) throws IOException try{ WyjątekZapisz wyjątek = new WyjątekZapisz(); wyjątek.zapisz("c:\\aaa1\\dane.txt");} catch (IOException ioe){ System.out.println(ioe.toString()); } System.out.println("Program jest wyonywany dalej");

Obsługa wyjątków - przykład import java.io.*; public class WyjątekWczytaj { static File plik = new File("nieistniejacy.txt"); public static void main(String args[]) throws IOException try { FileInputStream wczytanie = new FileInputStream(plik); int dane; dane = wczytanie.read(); wczytanie.close(); } catch (IOException ioe){ ioe.printStackTrace(); System.out.println("Blad przy otwarciu pliku " + plik.getName());}

Obsługa wyjątków – ważne metody Ważne metody dla obiektów klasy Exception: Nazwa Opis getClass() ; Zwraca nazwę klasy wyjątku. getMessage()); Zwraca opis wyjątku. printStackTrace(); Powoduje wypisanie na ekranie ścieżki wywołań do metody, w której wystąpił wyjątek. Przykład: System.out.println("Przy operacji typu \"" + wyjątki[i] + "\" wystąpił wyjątek: \n" + e.getClass() + "\n z następującą informacją: " + e.getMessage());

Definiowanie własnych klas wyjątków - koncepcja W Javie możliwe jest definiowanie własnych klas wyjątków dla obsługi sytuacji, uznawanych przez programistę za wyjątkowe. Klasa, która ma być odpowiedzialna za obsługę wyjątków w swojej definicji musi być podklasą (dziedziczyć) z klasy Exception. Aby wyjątki dla danej metody były obsługiwane przez naszą klasę wyjątków należy na końcu jej deklaracji dodać słowo kluczow throws oraz nazwę klasy obsługującej wyjątki – throws NazwaKlasyWyjątku.

Definiowanie własnych klas wyjątków - składnia class NazwaKlasyWyjątku extends Exception { NazwaKlasyWyjątku() } NazwaKlasyWyjątku(String s) super("\Tekst wyświetlany przez wyjątek: " + s);

Definiowanie własnych klas wyjątków - przykład class WyjątekŚrednia extends Exception { WyjątekŚrednia() } WyjątekŚrednia(String s) super(s);

Definiowanie własnych klas wyjątków – przykład c. d. class Student{ double sumaOcen = 0; int ilośćOcen = 0; double średnia = 0; void operacjeŚrednia() throws WyjątekŚrednia { try { średnia = sumaOcen / ilośćOcen; if (średnia < 2) throw new WyjątekŚrednia("Średnia nie może być niższa niż 2"); if (średnia > 5) throw new WyjątekŚrednia("Średnia nie może być wyższa niż 5"); System.out.println("Średnia ocen wynosi:" + this.średnia);} catch(Exception e) { System.out.println("Wyjątek: " + e.getClass() + " z następującym komentarzem - " + e.getMessage());} }

Definiowanie własnych klas wyjątków – przykład c. d. public class TestWyjątki { public static void main(String[] args) throws Exception Student student = new Student(); student.sumaOcen = Double.parseDouble(args[0]); student.ilośćOcen = Integer.parseInt(args[1]); student.operacjeŚrednia(); }

Obsługa wielu wyjątków - koncepcja Istnieje możliwość obsługi wielu wyjątków odnośnie jednego fragmentu kodu try w podzieleniu na konkretne ich typy – np. zarówno błędu braku pliku (obiekt typu IOException) do otwarcia oraz jego końca podczas wczytywania (obiekt typu EOFException). W celu obsługi wielu wyjątków należy dla bloku try zdefiniować odpowiednie bloki catch z paramerami jako obiekty odpowiadające klasom wyjątków.

Obsługa wielu wyjątków - składnia try { //blok instrukcji gdzie może wystąpić wyjątek } catch (ObiektImplementujacyInterfejsThrowable nazwaZmiennej) //blok instrukcji obsługujących wystąpienia sytuacji wyjątkowej …

Obsługa wielu wyjątków - przykład class NieprawidłowościŚrednia extends WyjątekŚrednia { NieprawidłowościŚrednia() } NieprawidłowościŚrednia(int ilośćOcen, double średnia) super(„\nNieprawidłowości średniej\n" + "Średnia wynosi zaledwie:" + średnia + "\n przy ilości zaliczonych przedmiotów poniżej minimum równemu:" + ilośćOcen);

Obsługa wielu wyjątków – przykład c. d. class Student{ … void operacjeŚrednia() throws Exception { try if ((ilośćOcen < 8) && (średnia < 3.5)) throw new NieprawidłowościŚrednia(ilośćOcen, średnia); System.out.println("Średnia ocen wynosi:" + this.średnia);

Obsługa wielu wyjątków – inna wersja public class TestWyjątki { public static void main(String[] args) throws Exception { Student student = new Student(); student.sumaOcen = Double.parseDouble(args[0]); student.ilośćOcen = Integer.parseInt(args[1]); try{ student.operacjeŚrednia(); } catch(NieprawidłowościŚrednia nś) { nś.printStackTrace(); } catch(WyjątekŚrednia wś) { wś.printStackTrace(); } }

Programowanie obiektowe Operacje wejścia - wyjścia

Koncepcja Operacje wejścia wyjścia (ang. Input / Output, I/O) w Javie zrealizowane są za pomocą klas zawartych w pakiecie java.io. Programy Javy używają strumieni (ang. streams) do wykonywania operacji wejścia /wyjścia, z tym, że zarówno źródłem wejściowym (ang. input source) jak i źródłem wyjściowym (ang. output source) może być wszystko, co zawiera dane: pliki, łańcuchy znakowe – również pobierane z klawiatury, pamięć.

Koncepcja Począwszy od wersji Javy 1.1 zdefiniowano nowe, przeznaczone do poprawnego czytania strumienie znaków w standardzie Unicode. Klasy obsługujące operacje I/O w Javie mają model warstwowy, co oznacza, że poszczególne klasy posiadają stosunkowo ograniczone możliwości, ale możliwe jest uzyskanie ich odpowiednich właściwości poprzez dodanie wyspecjalizowanych klas. Przykładowo, klasa wejściowa InputStream nie jest buforowana (co oznacza, że jednocześnie może być pobierany wyłącznie jeden znak), ale dzięki klasie BufferedInputStream możliwe jest dodanie buforowania do klasy InputStream.

Obsługa wielu wyjątków - koncepcja Jest abstrakcyjną nadklasą dla szeregu klas (np.: FileInputStream, SequenceInputStream) dostarczającą podstawowy interfejs programistyczny wraz z częściową implementacją strumieni wejściowych. Klasa InputStream definiuje metody przeznaczone do: czytania bajtów lub tablic bajtów zaznaczenia pozycji w strumieniu opuszczenia części bajtów z wejścia znajdowania liczby dostępnych bajtów do czytania i resetowania bieżącej pozycji w strumieniu

Przegląd klas strumieni - InputStream Podczas tworzenia nowego strumienia wejściowego, następuje jego automatyczne otworzenie. Strumień wejściowy zostaje zamknięty: poprzez użycie metody close gdy do obiektu InputSteam nie ma już żadnych referencji i jest usuwany z pamięci

Przegląd klas strumieni - OutputStream Klasa OutputStream podobnie jak klasa InputStream jest abstrakcyjną nadklasą dla wielu klas (np.: FileOutputStream, PrintStream). Dostarcza ona minimalny interfejs programistyczny wraz z częściową implementacją strumieni wyjściowych. Klasa ta definiuje metody zapisywania bajtów lub tablic bajtów. Strumień wyjściowy jest automatycznie otwierany gdy jest tworzony. Jego zamknięcie następuje: poprzez użycie metody close, gdy do obiektu OutputSteam nie ma już żadnych referencji i jest usuwany z pamięci (ang. garbage collected).

Przegląd klas strumieni – strumienie znakowe W wersji Java 1.1 do pakietu java.io dodano nowe klasy do czytania strumieni zawierających znaki (ang. character streams). Klasy te działają podobnie, jednak zamiast czytać i zapisywać bajty czytają i zapisują 2 bajtowe znaki Unicode. Ułatwia to pisanie programów niezależnych od standardu kodowania znaków. Strumienie znakowe nie są użyteczne tam gdzie dane są zapisywane binarnie, np.: odczytywanie plików dźwiękowych czy implementacja protokołów sieciowych.

Przegląd klas strumieni – strumienie znakowe Klasy: Do odczytu – Reader, np.: BufferedReader FileReader Do zapisu – Writer, np.: BuffereWritter FileWritter

Strumienie wejściowe – klawiatura InputStreamReader – umożliwia odczytanie pojedynczych znaków. Deklaracja: InputStreamReader nazwaStrumienia = new InputStreamReader(InputStream in); Przykład: InputStreamReader is = InputStreamReader(System.in); Metody: close() – zamyka strumień getEncoding() – zwraca nazwę systemu kodowania read() – umożliwia wczytanie pojedynczego znaku http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStreamReader.html

Strumienie wejściowe – klawiatura BufferedReader – umożliwia odczytanie znaków, które są buforowane co daje możliwość odczytywania również tablic i całych linii. Deklaracja: BufferedReader nazwaStrumienia = new BufferedReader(Reader in); Przykład: BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Metody: close() – zamyka strumień getEncoding() – zwraca nazwę systemu kodowania read() / readLine() – umożliwia wczytanie pojedynczego znaku / całej linii http://java.sun.com/j2se/1.4.2/docs/api/java/io/BufferedReader.html

Strumienie wejściowe – klawiatura - przykład BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public void dodajOsoba () throws IOException { System.out.println(""); System.out.print("Podaj imie "); imie = br.readLine(); System.out.print("Podaj nazwisko "); nazwisko = br.readLine(); System.out.print("Podaj wiek "); wiek = Integer.parseInt(br.readLine()); }

Strumienie wyjściowe – ekran System.out.print() / System.out.println() / – umożliwiają wypisanie na ekranie znaków. Ponadto instrukcja printline powoduje przejście do nowego wiersza. Przykład: System.out.println("Jaką operację chcesz wykonać (wpisz numer):");

Strumienie wyjściowe – ekran PrintWriter – klasa umożliwiająca wypisanie na ekranie znaków. Zastępuje metody klasy System.out. Deklaracja: PrintWriter nazwaStrumienia = new PrintWriter(OutputStream out, boolean autoFlush) ; Przykład: PrintWriter pw = PrintWriter(System.out, true) ; Metody: close() getEncoding() print() / println() http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileWriter.html

Strumienie wyjściowe – ekran - przykład import java.io.*; public class WypisanieDanych { public static void main(String args[]) char[] wybór = {'1','2','3','4'}; PrintWriter pw = new PrintWriter(System.out, true); pw.print("Jaką operację chcesz wykonać (wpisz numer):"); pw.println(wybór); }

Strumienie wejściowe – plik FileReader – umożliwia odczytanie pojedynczych znaków z pliku. Deklaracja: FileReader nazwaStrumienia = new FileReader(String fileName); Przykład: FileReader fr = new FileReader(”c:\studenci.txt”); Metody: close() – zamyka plik getEncoding() – zwraca nazwę systemu kodowania pliku read() – umożliwia wczytanie pojedynczego znaku http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileReader.html

Strumienie wejściowe – plik - przykład public static void wczytajDaneStudentow(ArrayList daneStudentow) throws IOException { Object zapiszDane[] = daneStudentow.toArray(); BufferedReader wczytanie = new BufferedReader(new FileReader("studenci.txt")); PobieranieDanych tym = new PobieranieDanych(); String dane = new String(); try while (true) { dane = wczytanie.readLine(); if (dane == null) break; tym.imie = dane; …

Strumienie wejściowe – plik – przykład c. d. dane = wczytanie.readLine(); tym.nazwisko = dane; tym.wiek = Integer.parseInt(dane); tym.nrIndeksu = Integer.parseInt(dane); tym.srednia = Double.parseDouble(dane); daneStudentow.add(new Student(tym.imie, tym.nazwisko, tym.wiek, tym.nrIndeksu, tym.srednia)); } wczytanie.close(); } catch(EOFException e) {

Strumienie wyjściowe – plik FileWriter – umożliwia zapisywanie danych do pliku. Deklaracja: FileWriter nazwaStrumienia = new FileWriter(String fileName, boolean append); Przykład: FileWriter plikNauczyciele = new FileWriter("nauczyciele.txt"); Metody: close() – zamyka plik getEncoding() – zwraca nazwę systemu kodowania pliku write() – zapisuje dane do pliku http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileReader.html

Strumienie wyjściowe – plik – przykład public static void zapiszDaneNauczycieli(ArrayList daneNauczycieli) throws IOException { FileWriter plikNauczyciele = new FileWriter("nauczyciele.txt"); Object zapiszDane[] = daneNauczycieli.toArray(); String dane; for (int i = 0; i < zapiszDane.length; i++) Nauczyciel nauczyciel = (Nauczyciel) zapiszDane[i]; dane = nauczyciel.przygotujInformacje(); plikNauczyciele.write(dane); } plikNauczyciele.close();

Strumienie wejściowe/wyjściowe – plik RandomAccessFile – jest klasą umożliwiająca odczyt/zapis danych do pliku, począwszy od dowolnego miejsca. Miejsce dostępu określa kursor o nazwie file pointer, do którego możliwy jest odczyt/zapis danych. Służą do tego dwie metody: getFilePointer – zwraca aktualną pozycję kursora seek(long pos) – umożliwia ustawienie pozycji kursora Tryby dostępu: ”r” – dostęp w trybie odczytu ”rw” – dostęp w trybie zapisu ”rws” – dostęp w trybie zapisu i odczytu z wymaganiem synchronicznego zapisu danych i metadanych pliku ”rwd” - dostęp w trybie zapisu i odczytu z wymaganiem synchronicznego zapisu danych http://java.sun.com/j2se/1.4.2/docs/api/java/io/RandomAccessFile.html

Strumienie wejściowe/wyjściowe – plik c. d. Deklaracja: RandomAccessFile nazwaStrumienia = new RandomAccessFile(String name, String mode); Przykład: RandomAccessFile raf = new RandomAccessFile ("nauczyciele.txt”,”rw”); Metody: close() – zamyka plik read() / readLine() – wczytują dane z pliku write(typ) / writeChars(String s) – zapisują dane do pliku http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileReader.html

Proszę o ewentualne pytania Michał Kuciapski