Programowanie komponentowe wykład 3 Informatyka, IV sem. studia dzienne FTIiMS, PŁ
Programowanie komponentowe wymaga Znajmości składni języka każdy język programowania można poznać posługując się pewnym schematem Jakie są słowa kluczowe, jak buduje się wyrażenia, funkcje, zmienne, jak tworzy się typy danych, struktury danych, tablice, obiekty, itp. Znajomości bibliotek (obiektów, pakietów i komponentów) Czy trzeba samemu tworzyć funkcje i struktury danych, czy może wystarczy skorzystać z gotowych i zoptymalizowanych? Znajomości narzędzi programistycznych szybkość i wygoda tworzenia aplikacji Jak uruchomić kod w danym języku, jak poprawić błędy, jak wygenerować powtarzalne fragmenty kodu, praca krokowa, debugging
Kategorie składniowe Javy (1) 1. Słowa kluczowe nazwy typów, instrukcji sterujących, stałych, operatorów, modyfikatorów dostępu Nie można w ten sposób nazwać zmiennych, funkcji, itp. Słowa zarezerwowane obejmują terminy ''reserved for future use'' przewiduje się, że w przyszłych wersjach Javy wprowadzone będą nowe słowa kluczowe, a wówczas starsze kody mogłyby nie kompilować się w nowych środowiskach, np. w Java 7
Kategorie (2,3) 2. Separatory (9 szt.) ( ) { } ;, [ ] - oddzielają wyrażenia, bloki kodu, klasy - niektóre są także operatorami, np. [ ] operator indeksowania tablicy 3. Komentarze // jednolinijkowy od znaku // do końca linii /* Komentarz blokowy */
Kategorie (4) operatory 4. Operatory a. Priorytet, czyli ''kolejność wykonywania działań'', np. obiekt.tab[2*5] b. Wiązanie (prawe/lewe) wiązanie lewe np. 2+3+4+5 kompilator oblicza kolejno (((2+3)+4)+5) wiazanie prawe, np. x=y=z=2, kompilator oblicza (x=(y=(z=2))) Od prawej wiążą operatory jednoargumentowe i przypisania, pozostałe od lewej
Operatory c.d. c. Ilość argumentów (1, 2 lub 3)!zmiennaLogiczna (1 argument) 3*5, (2 argumenty) x<y? x : y (3 argumenty) d. Wartość (typ rezultatu) następny slajd e. L-wartość (ang. Left-value, L-value) - każde wyrażenie, które może znaleźć się po lewej stronie operatora przypisania, np. X = 2, tab[1] = tab[2] -ale nie: 5+=1 lub 5++, gdyż jest równoznaczne z 5=5+1!!!!
Kategorie (4) operatory cd. Podział przybliżony pod względem typu zwracanej wartości Arytmetyczne + - * % Wynik jest typu jednego z operandów Logiczne! && Wynik true lub false Przypisania = += -= *= ++ -- Wynik jest typu lewego argumentu (czyli L- wartości)
Kategorie (4) operatory (podział przybliżony) Porównania == < >= true lub false Bitowe & ^ << >>> Wynik jest typu jednego z operandów Przydziału pamięci new Wynik jest typu referencyjnego Kontroli typu instanceof Wynik logiczny Zalecane ćwiczenia!
Kategorie (5) Identyfikatory nazwy stałe, czyli literały literały specjalne, np. polskie znaki znakowe (char, String) w, Dziendobry, \xy liczb całkowitych (int, byte) 100, 011, 0xFF00, 55L liczb rzecz. (double, float) 1.5,.6, 0.5f, 0.7D logiczne (boolean) true, false Są to także słowa zarezerwowane zmienne x, i, nazwisko, checkbox1 typy Button, String, int, char
Identyfikatory (nazwy) funkcji np. init(), wyciagnijpierw(25); Występują w trzech kontekstach Deklaracja, int funkcja(double x); Definicja = deklaracja + ciało int funkcja (double x) { // ciało funkcji return rezultat; } Wywołanie: użycie wartości funkcji X = funkcja (3.14);
Sterowanie wykonaniem programu for, while, do..while jak w C/C++ Oprócz np. while(1) Brak konwersji wyrażeń logicznych do int Powinno być while(1==1) if..else,if..else if..else jw. switch..case..default jw. break, continue jw. Przypisanie = (+=, -=,...) Dokładnie jak w C/C++
Sterowanie... cd. bloki instrukcji (obowiązuje przesłanianie nazw zmiennych) int x=2; { int y = 5; System.out.println(""+y); /// Bledem jest np. int x=3; Przeslania zmienna istniejącą } int y=3; // Nie jest to błąd kompilator,,zapomniał'' o y System.out.println(""+y); //EFEKT???
Typy danych w Jawie Typy danych Proste Złożone Tablicowe Obiektowe Biblioteczne Programisty
Typy proste (wbudowane, built-in, primitives) byte 1 bajt, stałoprzec. ze znakiem short 2, int 4, long 8 char 2 kod znaku UNICODE możliwe zapisanie EOF boolean 1 bajt, true/false float 4 bajty, zmiennoprzecinkowa double 8, jw.
Typy tablicowe TYLKO DYNAMICZNE!!! Jednowymiarowa int tab [ ] = new int [6]; Ale nie: int tab[6], bo nie ma tu rezerwacji pamięci operatorem new Dwuwymiarowa double tab [ ] [ ] = new double [10] [10]; Są to przykłady definicji tablic Trójwymiarowa boolean tab[ ][ ][ ]=...
Typy obiektowe Biblioteczne Button java.awt.button Date java.util.date ActionEvent java.awt.event.actionevent String java.lang.string Własne definicja klasy Np. Macierz class Macierz { definicja klasy, czyli pól i funkcji składowych }
Zmienne referencje (de facto: wskaźniki) Zmienna miejsce w pamięci do przechowywania danych to miejsce ma swoją nazwę, jak to w językach imperatywnych 3-ej generacji, nie zaś adres Zmienne (tylko pola klas lub zmienne lokalne/formalne funkcji, brak zmiennych globalnych) automatyczne (tylko typy proste, kompilator sam rezerwuje pamięć i sam ją zwalnia) int x; char znak; dynamiczne (rezerwacja pamięci operatorem new, wszystkie typy obiektowe i tablice) statyczne inicjalizacja wymagana przy deklaracji np. static int x = 5; //nie: static int x;... x=5;
Zmienne deklaracja, przydział pamięci, inicjalizacja Deklaracja int x, y=3; Button b1, b2; Rezerwacja pamięci (nie dotyczy typów prostych) b1 = new Button( Kliknij tu! ); Inicjalizacja x = 25; // typy proste napis = new String( 1.2.3.próba Stringa... ); // typy złożone b2 = b1; // ŹLE - konstruktor kopiujący nie wywoła się, zostaną przypisane ADRESY, nie WARTOŚCI, musi być: b2 = new Button(b1);
Konwencje zapisu kodu w Jawie Klasy wielką literą, bez C lub T z przodu Macierz, Button, String Zmienne małą literą, bez podkreśleń i, nazwiskostudenta, iloscwierszymacierzy zmienna po. jest polem jakiejś innej klasy obiekt.pole zmienna po this jest polem bieżącej klasy this.pole // równoważne: pole, ale z this jest czytelniej zmienna bez poprzedzającego selektora jest argumentem formalnym funkcji lub zm. lokalną/pomocniczą pole
Standardy zapisu kodu... cd. Funkcje czasownik małą literą, dopełnienie wielką getnumber, tostring, add, róbcoś Nazwy pakietów małą literą java.awt; java.mypackage.myclass To klasa MyClass w pakiecie java.mypackage Bloki { // początek bloku // instrukcje } //koniec bloku
Notacja węgierska (Hungarian notation) Źródło: Bates: Poznaj Visual C++ 6.0, Appendix A b boolean bodpowiedz n short, int nwagazawodnika l long lrozmiarpliku fl float flmojapensja d double djegopensja bt Button przycisk ch Checkbox pole wyboru e Event zdarzenie pt Point punkt
Programowanie komponentowe wykład 4 Informatyka, IV sem. studia dzienne FTIiMS, PŁ
Różnice między C/C++ a Javą (1) Typy danych podstawowych niezależne od sprzętu specyficzne dla JVM, a nie dla platformy Nie istnieje pojęcie wskaźnika wszystkie zmienne typów prostych są wartościami int x=0; wszystkie zmienne typów złożonych (tablicowych i agregatów) są referencjami wymagają dynamicznego przydziału pamięci operator * oznacza tylko mnożenie operatory.*, ->, :: nie istnieją this jest referencją
Różnice... (2) Tablice tylko dynamiczne Kurs Tylocha, rozdz. 2.3.17 tablica w Jawie jest obiektem dziedziczy po Object, implementuje interfejs Cloneable deklaracja wymaga przydziału pamięci w zadanej ilości, poprzez podanie liczby elementów... String tab[ ] = new String[5];...lub zbioru inicjalizującego wartości elementów int tablicaint[ ] = {1, 2, 3, 4, 5}; String tab[ ]={new String( pn ),new String( wt )...}; Nazwa tablicy wraz z nawiasami [ ] jest L-wartością tab[0] = niedziela
Różnice... (3) Zwalnianie pamięci Kurs Tylocha, rozdz. 2.3.13 Nie ma operatora delete zwalnianiem pamięci zajmuje się funkcja System.gc() (od ang. garbage collector) funkcja ta wywoływana jest automatycznie co jakiś czas w osobnym wątku, tylko wtedy, gdy nie ma nic innego ważniejszego do zrobienia (wątek ten ma b. niski priorytet) sprawdzane są wszystkie wartości w referencjach; jeśli w żadnej nie ma adresu danego obszaru pamięci, to obszar ten jest zerowany (rysunek)
Różnice... (4) Zwalnianie cd. zwalnianie jawne można wywołać jawnie funkcję System.gc() jeśli obiekt musi przed zniknięciem zwolnić zasoby (np. pozamykać pliki), można nadpisać funkcję finalize(), odziedziczoną po java.lang.object przykład: kurs Tylocha, rozdz. 2.3.12 Wniosek: finalizer działa podobnie jak destruktor dotyczy to także wywołań finalizerów klas-przodków
Różnice... (5) Brak możliwości przeciążania operatorów operacje na niewbudowanych typach danych realizowane są przez funkcje składowe o zwyczajowych nazwach, np. == string1.equals(string2) rez. boolean <=, >... string3.compareto(string4) rez. int = konstruktory klas wszystkie przeciążone operacje przypisania zastąpione są przez konstruktory kopiujące String tekst1 = new String (innystring); String tekst2 = tekst1;//przepisanie ADRESU!! String tekst2 = new String (tekst1); //działa jeśli istnieje konstruktor kopiujący
Konstruktor kopiujący (5') K. kopiujący klasy A w C/C++ - konstruktor, który można wywołać z jedynym parametrem będącym referencją do obiektu klasy A Pozostałe parametry mogą być domyślne W Javie nie ma domyślnych parametrów funkcji K. kopiujący w Javie ma tylko jeden parametr Jeśli konstruktor w Javie odwołuje się do konstruktora klasy bazowej, to robi to poprzez słowo super, koniecznie w pierwszej linii pod nagłówkiem, patrz Różnica (9) Brak list inicjalizacyjnych
Komentarz Różnice 1 5 mają znaczny wpływ na budowę wyrażeń w Javie i, w ogólności, na konstrukcję kodu i działajacych programów. Ich przyswojenie jest istotne z punktu widzenia eliminacji nawyków z C/C++ (nawyków niewłaściwych w Jawie)
Różnice... (6) dostęp do klas, pól i metod Dostęp do klas, pól i metod Kurs Tylocha, rozdz. 2.3.4 w Jawie obowiązuje tzw. dostęp pakietowy Pakiet, podstawowa jednostka, jest katalogiem plików *.class w jednym pliku *.java znajduje się jedna klasa publiczna mogą być inne klasy, ale niepubliczne przykład po kompilacji w jednym pliku *.class znajduje się jedna klasa Przypisanie klasy do pakietu odbywa się instrukcją package nazwa_pakietu ; przykład położenie plików w pakietach określa zm. środ. CLASSPATH przykład dla CLASSPATH = C:\WINNT\java Pakiet może zawierać podpakiety np. java.awt zawiera w sobie java.awt.event zbiór klas odpowiedzialny za zdarzenia w oknach
Różnice... (modyfikatory 1) Modyfikatory dostępu do klasy public pola i składowe są widoczne w pakiecie i poza nim final po klasie nie można dziedziczyć abstract nie można utowrzyć obiektu tej klasy domyślnie: dostęp pakietowy pola i metody widoczne tylko dla klas wewnątrz pakietu Modyfikatory dostępu do pól i funkcji klasy private pole/metoda widoczne tylko w klasie protected pole metoda widoczne w klasie, pakiecie i w klasach dziedziczących public pole metoda widoczne ''wszędzie'' domyślnie ''package'', jw. w tym kontekście,,package'' nie jest słowem kluczowym
Różnice... (modyfikatory 2) Modyfikatory własności funkcji składowych final, static, abstract, synchronized, native dostęp do f-cji st. Nazwaklasy.funkcja() W C/C++ Nazwaklasy::funkcja() Modyfikatory własności pól klas final, static, transient, volatile inicjalizacja pola statycznego tylko w kodzie klasy (nie jak w C) rozdz. Kurs Tylocha 2.3.12 inicjalizator pól statycznych
Różnice... (7) dziedziczenie Brak modyfikatorów dziedziczenia klas (public, private...) Dziedziczenie tylko po jednej klasie jednobazowe Hierarchia klas w pakietach ma postać drzewa każda klasa ma co najwyżej jednego bezpośredniego przodka Upraszcza to graf hierarchii dziedziczenia klas Czasem klasy muszą posiadać pewne funkcje, jeśli chcą aby dla ich obiektów działały metody standardowe Arrays.sort(Object[]) - wymaga aby obiekty miały funkcję compareto(), czyli implementowały interfejs Comparable INTERFEJS klasa abstrakcyjna o zadeklarowanych, ale nie zdefiniowanych funkcjach (jeśli posiada) o polach wyłącznie statycznych (jeśli posiada) zadeklarowana słowem interface
Różnice (7) przykład diagramu schematu dziedziczenia jednobazowego z interfejsami java.lang.object +--java.awt.component +--java.awt.container +--java.awt.panel +--java.applet.applet ActionListener ItemListener class MyApplet
Interfejs jako klasa, klasa interfejsowa Każda klasa implementująca interfejs MUSI zdefiniować jego metody Dzięki temu pewne cechy mają zawsze tę samą nazwę; ułatwia to np. ich wywoływanie przez inne komponenty np. Funkcja Arrays.sort(Object[ ] tab) działa w oparciu o funkcję compareto(...), a więc obiekty w tablicy tab muszą implementować interfejs Comparable Interfejs może dziedziczyć po innych interfejsach (także po kilku), ale nie może dziedziczyć po klasach Interfejs może być deklarowany w jednym pliku *.java z klasami publicznymi mimo tego, że sam jest publiczny Po kompilacji interfejs zostanie umieszczony w osobnym pliku *.class
Interfejs... cd. Kurs Tylocha, 2.3.12, 2.3.15 [public] interface InterfejsPrzykl { static int Pole=3; abstract public void Metoda(); } //domyślnie interfejs jest publiczny // użycie interfejsu przez klasę public class MyApplet extends Applet implements InterfejsPrzykl { public void Metoda() { // co robi ta metoda dla tej klasy } }
Klasy wewnętrzne, anonimowe i lokalne Kurs Tylocha, 2.3.7 Klasa wewnętrzna klasa zdefiniowana wewnątrz definicji innej klasy występowała w C/C++ Klasa lokalna klasa zdefiniowana wewnątrz bloku instrukcji (w definicji funkcji) niedopuszczalne w C/C++ Klasa anonimowa klasa zdefiniowana wewnątrz wyrażenia new NazwaKlasyPrzodka(//lista argumentów//) {...} jest to także sposób na dziedziczenie po interfejsach (!!!) niedopuszczalne w C/C++
Różnice... (9 słowo super) Słowo kluczowe super Kurs Tylocha rozdz. 2.3.13 Konstruktory nie posiadają list inicjalizacyjnych odpada operator : oraz inicjalizacja typu pole(wartość) super() wywołuje konstruktor klasy bazowej lub super.funkcja( ) - wywołuje funkcję o tej samej nazwie, ale w wersji z klasy bazowej Wywołanie super(...) musi być pierwszą linią kodu konstruktora przykład
Różnice... (9 słowo super, c.d.) Zakładamy hierarchię klas: A, B extends A, C extends B Słowa super nie można łączyć kasakadowo; aby odnieść się do nazwy niestatycznej w klasie wyższej należy konwertować referencję this np. w obiekcie klasy C ((A)this).get(); Konwersja this do klasy-przodka jest równoznaczna z super w obiekcie klasy C: ((B)this).get(); = super.get();
Programowanie komponentowe wykład 5 Informatyka, IV sem. studia dzienne FTIiMS, PŁ
Błędy w programach Z punktu widzenia kodu rozróżniamy Bł. kompilacji błąd składni w kodzie programu, Nieznana zmienna/funkcja/klasa/... Brak nawiasu/średnika/... Bł. logiczne program działa wbrew oczekiwaniom, ale DZIAŁA np. niepoprawne wyniki obliczeń Nieprzewidziane zachowanie interfejsu Brak możliwości wykonania jakiejś operacji Bł. czasu wykonania (ang. Runtime) program uruchamia się, ale potem zatrzymuje Dzielenie przez zero, indeks tablicy spoza zakresu Błąd otwarcia pliku (ogólnie: operacji we/wy) Odwołanie do niezainicjalizowanej zmiennej obiektowej String x; System.out.println(x);
Wyjątki i błędy w Javie Java oferuje bardzo rozbudowany, ściśle zorientowany obiektowo mechanizm obsługi sytuacji krytycznych (błędy we/wy, alokacji pamięci, braku zasobów, błędnych operacji itd.) Sytuacje wyjątkowe dzielimy na dwa rodzaje Errors błędy Exceptions wyjątki Błędy sytuacje rzadkie, związane z działaniem JVM, np. brak pakietu lub klasy, opór środowiska, poważny błąd systemowy Błędy nie powinny być obsługiwane w zwykłych programach Javy, ich wyrzucaniem zajmuje się watek JVM uruchamiający ''nasze'' programy np. java.lang.noclassdeffounderror brak klasy z funkcją main w bieżącym/wskazanym katalogu Zadanie na kolokwium: napisz kod wywołujący wyjątek X
Wyjątki i błędy hierarchia klas
Wyjątki... cd Kurs Tylocha, rozdz. 2.4 Wyjątki sytuacje zazwyczaj możliwe do obsłużenia instrukcją if..else, np. nie znaleziono pliku FileNotFoundException indeks poza granicami tablicy ArrayIndexOutOfBoundsExcetion referencja wskazująca na pusty obszar pamięci NullPointerException Błąd operacji arytmetycznej ArithmeticException
Wyjątki RuntimeExceptions Mogą występować bardzo często, nawet po kilka w jednym wyrażeniu for (i=0; i<10; i++); tab[ i ] = i; Ich obsługa nie jest przez kompilator wymagana zbyt duży koszt sprawdzenia w porównaniu do strat spowodowanych przez taki wyjątek NullPointerException ArrayIndexOutOfBoundsException ArithmeticException W momencie wystąpienia RuntimeException program zatrzyma się i pokaże nazwę wyjątku oraz miejsce jego wystąpienia przykład
Wyjątek jako obiekt Każda sytuacja wyjątkowa jest reprezentowana przez obiekt pewnej klasy Każdy pakiet dysponuje odpowiednim zestawem wyjątków obsługującym błędy wywołane przez jego klasy/funkcje przykłady z dokumentacji Można także we własnych pakietach definiować własne wyjątki, pod warunkiem, że dziedziczą one z klasy Throwable
Jak powstaje wyjątek? Słowa kluczowe throw,throws Wyjątek trzeba najpierw zgłosić public void funkcja() throws MyException { //... if (WystapilBlad) throw new MyException(); //... new MyException zwraca referencję do obiektu zawierającego dane o sytuacji wyjątkowej, np. kod błędu, treść komunikatu, itp.
Obsługa wyjątków Metoda try-catch-finally try { // instrukcja generująca wyjątek } catch (NazwaKlasyWyjątku wyj) { // co zrobić z tym wyjątkiem}... finally {//blok wykona się niezależnie od wystąpienia wyjątku}
Kolejność obsługi wyjątków (1) Jeśli wyjątki są w różnych blokach kodu o kolejności decyduje przebieg sterowania, np. try { // instrukcje generujące wyjątki } catch (IOException io) {System.err.println("blad IO");} try { // instrukcje generujące wyjątki } catch (SecurityException se) {System.err.println("blad sec");
Kolejność obsługi wyjątków (2) Jeśli wyjątki występują w tym samym bloku o kolejności decyduje hierarchia dziedziczenia: od najbardziej szczegółowego do najbardziej ogólnego, czyli ''od dołu do góry, poźniej try { //... instrukcje generujące wyjatki } catch (java.io.objectstreamexception) { } catch (java.io.ioexception) { } catch (java.lang.exception){ }...
Porównanie if-else i try-catch int otwórzplik(ścieżka) { if ( plik.otwórz() == false) {błąd otwarcia pliku} else if ( przydzielpamięć(plik.długość) ==false) {brak pamięci} else if (zapiszdopliku(tekst) == false) {błąd wyjścia} else if (zamknijplik() == false) { obsłuż ten błąd} else return OK ; }
Porównanie if-else i try-catch readfile { try { otwórz plik; przydziel dla niego pamięć; wczytaj tekst do pliku ; zamknij plik; } catch (fileopenfailed) { zrób coś z tym; } catch (memoryallocationfailed) { zrób coś z tym; } catch (writefailed) { zrób coś z tym; } catch (fileclosefailed) { zrób coś z tym; }}
Definiowanie własnego wyjątku class MyException extends Exception { String msg; MyException() { msg = new String ( komunikat wyjatku );} } Większość możliwych wyjątków jest już zdefiniowana w pakietach Własne wyjątki służą do zgłoszenia np. sytuacji wyjątkowej we własnej klasie wyjątku odziedziczonego po istniejącym
Programowanie komponentowe wykład 6 Informatyka, IV sem. studia dzienne FTIiMS, PŁ
Standardowe struktury danych Pakiety Javy zawierają b. dużą ilość gotowych do użycia w kodzie klas struktur danych Np. pakiet java.util klasy reprezentujące dynamiczne struktury danych klasy obsługujące kalendarz, datę, walutę, słownik klasy obsługujące struktury kontenerowe, itp. Apel: zanim zaczniesz tworzyć nową klasę PRZEJRZYJ DOKUMENTACJĘ PAKIETÓW!!! 9 przypadków na 10 jest już oprogramowanych
Klasy String i StringBuffer java.lang.string reprezentuje łańcuchy tekstowe w miejsce tablicy char[ ] (lub C/C++: char*) 11 konstruktorów, w tym kopiujące compareto(), comparetoignorecase(), concat(), equals(object), replace(), replaceall, trim(), valueof() String jest klasą final ponadto zapisanego w niej tekstu nie można zmienić! Do modyfikacji tekstu służy klasa java.lang.stringbuffer należy stworzyć jej obiekt zainicjowany Stringiem przetworzyć tekst metodami klasy StringBuffer rezultat zapisać od nowa w obiekcie String
Klasa Vector Klasa reprezentująca tablicę obiektów pochodzących od java.lang.object java.lang.object // sam Vector też pochodzi od Object... +--java.util.abstractcollection +--java.util.abstractlist +--java.util.vector Funkcje obsługujące dane: add(object), add(collection), add(int index, Object) set(), setelementat(object, int), setsize(int) clear(), remove(object), removeall(), trimtosize(int) clone(), tostring(), toarray(), equals(object)
Klasa java.util.stack Klasyczny stos pozwala tylko na kładzenie elementów na górze i ich zdejmowanie z góry Rozszerzone implementacje stosu umożliwiają również podglądanie elementów lub ich sprawdzanie Klasa Stack jest rozszerzoną implementacją stosu Dziedziczy od Vector Funkcje: boolean empty(); pop(object), push(object), boolean search(object), peek()
Klasa Arrays Jeśli nie chce się przekształcać własnych tablic w obiekty z biblioteki Java......można użyć funkcji z klasy Arrays; reprezentuje ona (w postaci funkcji statycznych) najczęstsze operacje na gotowych tablicach sortowanie 20 funkcji sort() porównywanie elementów 9 funkcji equals() wyszukiwanie 9 funkcji binarysearch() wypełnianie funkcje fill() Funkcje te przyjmują daną tablicę jako argument (inaczej niż zazwyczaj jest w Javie) dokumentacja
Obiekt Date Do działania na datach klasa Date Java 1.1, później klasa Calendar Obiekt klasy Date reprezentuje dowolny moment czasowy z dokładnością do milisekund Na 64 bitach (long) zapamiętuje liczbę milisekud, które upłynęły od 1 stycznia 1970 roku, od godz. 0h 00m 00s 000ms (tzw. moment epoch) Daty wcześniejsze zapamiętuje się jako liczby ujemne
Format danych w Date rok liczba c. = y 1900 miesiąc liczba z {0,.., 11}, gdzie 0 = styczeń dzień mies. liczba z {1,.., 31} dzień tyg. liczba z {0,..., 6}, gdzie 0 = niedziela godzina liczba całk. z przedziału <0, 23> minuta liczba całk. z przedziału <0, 59> sekunda liczba całk. z przedziału <0, 61>!!! (sek. przestępne) funkcje getyear(), getmonth(), getdate(), getday(), gethour()...
Konstruktory i funkcje Date Date now = new Date(); alokuje obiekt dokładnie ten moment Date(y, m, d), Date(y, m, d, h, m), Date(y, m, d, h, m, s) Date(long milisecs), Date(String) Brak konstruktora kopiującego Date(Date) dlaczego? now.equals(whenelse), // tendencja do nazw naturalnych now.before(littlebitlater) now.after(littlebitearlier) setdate(), setmonths(), setyear()...
Inne struktury danych Calendar, Currency Dictionary, GregorianCalendar......
Programowanie komponentowe wykład 7 Informatyka, IV sem. studia dzienne FTIiMS, PŁ
Operacje wejścia/wyjścia Operacje we/wy w Javie są reprezentowane przez wyspecjalizowane typy danych w pakiecie java.io Klasa File reprezentacja pliku dyskowego Klasy OutputStream, Writer dokumentacja strumienie wyjściowe abstract Klasy InputStream, Reader strumienie wejściowe abstract Wyjątki i interfejsy
Klasa java.io.file Pola (tylko statyczne) zawierają separatory ścieżek zapisane jako String lub char (są zależne od środowiska) pathseparator, pathseparatorchar Konstruktory tworzą obiekt plik na podstawie Obiektu typu File przykład ścieżki do pliku i/lub katalogu Konstruktory nie generują wyjątków......bo nie działają na dysku, tylko na strukturze w pamięci RAM Do stworzenia pliku na dysku: createnewfile() throws IOException, SecurityException
Klasa java.io.file(2) Funkcje składowe tworzenie i usuwanie plików i katalogów createtempfile, exists, delete, mkdir, mkdirs sprawdzanie istnienia i właściwości plików canread, canwrite, ishidden, isfile, isdirectory, length ustawienia własności plików setreadonly, setlastmodified, renameto porównywanie z innymi obiektami tego typu compareto(file), compareto(object), equals Wyjątki generowane przez metody klasy File SecurityException, IOException, NullPointerException, IllegalArgumentException
Strumień: medium transmisji danych (Podział strumieni ze względu na miejsce w hierarchii dziedziczą po java.lang.object) do programu, wejściowe InputStream z programu, wyjściowe OutputStream tekst do programu Reader tekst z programu Writer Są to klasy abstrakcyjne przeznaczone do dziedziczenia przez strumienie wyspecjalizowane
Strumienie wejściowe Strumienie dziedziczące po InputStream mogą pobierać dane z: Tablica obiektów Obiekt String Plik Pipe potok Sekwencja innych strumieni połączonych w jeden Inne źródła (np. połączenie internetowe)
Strumienie wejściowe InputStream
Strumienie wyjściowe Program w RAM może formatować dane wyjściowe w postaci Tablicy bajtów (oprócz String) Pliku Potoku (pipe)
Strumienie wyjściowe OutputStream
Strumienie podział (typ) Podział strumieni ze względu na przesyłane dane Bajtowe służą do zapisu/odczytu ciągów bajtów niefiltrowane ciągi bajtów nie mają interpretacji np. pliki *.class, pliki z obrazkami filtrowane bajty są interpretowane jako dane pewnych typów prostych, np. long, int, short w tym strumienie buforowane Obiektowe zapis/odczyt obiektów typów złożonych Znakowe szczególny przypadek strumieni obiektowych/filtrowanych, ale reprezentowane przez klasy Reader i Writer służą do pracy z tekstem reprezentowanym jako String lub char[ ]
Strumienie bajtowe niefiltrowane ByteArrayInputStream,ByteArrayOutputStreamFileInp utstream, FileOutputStream Podstawowe metody: close zamyka strumień finalize do zamykania w przypadku destrukcji obiektu write/read(byte[ ] b) write/read(byte[ ] b, int off, int len) write/read(int b)
Strumienie bajtowe filtrowane Są to strumienie FilterInputStream i FilterOutputStream i/lub ich pochodne DataInputStream oraz DataOutputStream filtrowane strumienie bajtowe (strumienie danych) odczytywanie typów int, float itp. mają jedno pole (in, out) zapisana nazwa aktualnego strumienia tworzy się je na podstawie strumienia typu Input lub Output podanego jako argument w jedynym konstruktorze readdouble, readint, readchar, readfloat writedouble, writeint, writechar, writefloat także metody read/write ze strumieni niefiltrowanych
Strumienie bajtowe buforowane Są szczególnym przypadkiem strumieni Filter BufferedInputStream, BufferedOutputStream Pola protected byte[ ] buf bufor protected int count liczba bajtów w buforze BufferedInputStream(InputStream) tworzy buforowany strumień wejściowy dla strumienia InputStream (analogicznie: Output) BufferedInputStream(InputStream, int) jw. z buforem o rozmiarze int (analogicznie: Output) Metody tylko read/write Brak możliwości zapisu zinterpretowanych bajtów do bufora!
Strumienie obiektowe ObjectOutputStream serializacja obiektów Javy jako serii typów prostych ObjectInputStream odczytywanie ciągów danych typów prostych jako obiektów defaultwriteobject, defaultreadobject, writeobject, readobject, replaceobject, readtyp Każdy typ wbudowany ma swój odpowiednik w postaci klasy o podobnej nazwie (int - Int) w pakiecie java.lang
Strumienie znakowe FileReader (FileWriter) strumień do odczytywania (zapisywania) znaków zapisanych w pliku konstruktory jako argument przyjmują parametr klasy File Strumień ten dziedziczy po InputStreamReader (InputStreamWriter), w którym dostępna jest jeszcze funkcja read (write) do pracy na pojedynczych bajtach lub ich tablicach. konstruktor InputStreamReader (OutputStreamReader) przyjmuje jako parametr obiekt typu InputStream (OutputStream) PrintWriter strumień do współpracy z konsolą i/lb drukarką szereg funkcji wyspecjalizowanych w wydruku
Strumienie znakowe wejściowe Reader
Strumienie znakowe wyjściowe Writer