Programowanie w środowiskach graficznych Wykład 2. 1
PLAN Interfejsy Wątki Tablice Pakiety 2
super, this class Parent { private int i = 10; void fp() { System.out.print("fp of Parent class\n"+"i= "+i); //end fp //end Parent class Descendant extends Parent { public void fp() { System.out.println("fp of Descendant class"); //end fp public void fd() { super.fp(); //call to Parent's fp // end fd // end Descendant public class klasa1 { public static void main(string args[]) { Descendant ds = new Descendant(); ds.fp(); ds.fd(); //end main //end Inherit2 3
Interfejsy Interfejs klasy wersja klasy pozbawiona pól, oznacza zestaw metod i zastępuje wielodziedziczenie. Interfejs (słowo kluczowe interface) to: zestaw publicznych abstrakcyjnych metod, (domyślnie nie trzeba pisać abstract) oraz ewentualnie statycznych stałych, (domyślnie nie trzeba pisać final static) 4
Przykład /**Interfejs Message, kazda klasa ktora go zaimplementuje musi posiadac metode givereport*/ interface Message { void givereport(); /**kazda klasa ktora implementuje ten interfejs bedzie miala metode givereport - jej dzialanie bedzie zalezec od danej klasy*/ class Client implements Message { int counter=0; /**zeruje licznik i wyswietla komunikat poczatkowy*/ public void startingreport() { counter=0; System.out.println ("To jest raport poczatkowy klienta"); System.out.println ("Counter="+counter); 5
public void givereport() { counter++; System.out.println ("Counter="+counter); class Server { Message object; Server (Message object) { this.object=object; public void execute (int times) { for (int k=0; k<times; k++) object.givereport(); /**Zwieksza licznik i wyswietla jego wartosc - podajac, ze klasa implementuje interfejs Message; zobowiazalismy sie, ze metoda o nazwie givereport bedzie istniala*/ /*typem obiektu jest nazwa interfejsu*/ /**Konstuktor. Jako parametr podajemy dowolny obiekt majacy zaimplementowany interfejs Message; np.: Client*/ /** Wywolujemy metode givereport obiektu z interfejsem Message times razy */ 6
Funkcja main public class Heritage { public static void main (String[] args) { Client our_client = new Client(); our_client.startingreport(); Server our_server= new Server (our_client); our_server.execute(5); 7
8
9
Dziedziczenie wielokrotne C++ Chcemy napisać klasę SeaPlane, która umożliwia przechowywać pojazdy wodne oraz pojazdy powietrzne. 10
java 11
metody 12
Tablice Deklaracja: int tablica []; lub int[] tablica; Przed użyciem należy zaalokować pamięć: tablica[0] = 1; // error tablica = new int[10]; tablicaint[0] =1 ; Można i tak: int tablica[]=new int[5]; int tablica [] = {0,1,2,3,4; Przekroczenie zakresu tablicy spowoduje wyjątek ArrayIndexOutOfBoundsException tablica.length długość tablicy Tablice wielowymiarowe: int tab[][]; tab=new int [5][5]; 13
Konwersje obiektów wymagają jawnego użycia operatora konwersji, w trakcie wykonania programu wykryty zostaje błąd polegający na konwersji do niewłaściwego typu; Konwersję możemy stosować zarówno do klas jak i do interfejsów OK! Pies p = new Pies(); Zwierz z = p; Pies p1 = (Pies) z; ERROR! Zwierz z; Rower r = (Rower) z; // błąd, bo Rower nie pochodzi od Zwierza. 14
Wyjątki Wyjątki pozwalają zachować kontrolę nad przebiegiem wykonania funkcji (metod), a także pojedynczych instrukcji zawartych w funkcjach. Wyjątek jest zdarzeniem, które pojawia się podczas wykonania i przerywa normalną kolejność wykonania instrukcji. W języku Java istnieje bardzo rozbudowana hierarchia (drzewo) predefiniowanych klas wyjątków, których superklasą jest klasa Throwable, a głównymi gałęziami drzewa są klasy Error i Exception. - Wyjątki weryfikowalne - Wyjątki nieweryfikowalne 15
Wyjątki - throw Dla obsługi wyjątków weryfikowalnych wprowadzono pięć słów kluczowych: throw, throws, try, catch i finally. Słowo kluczowe throw służy do jawnego zgłaszania wyjątków nieweryfikowalnych i występuje w instrukcji throw (throw wyrażenie; typu referencyjnego do klasy Throwable lub jej podklas). Zgłoszenie wyjątku w instrukcji throw spowoduje natychmiastowe opuszczenie bloku zawierającego instrukcję throw i znalezienie instrukcji try, której fraza catch przechwyci zgłoszony wyjątek. Jeżeli nie ma takiej instrukcji try, zostanie wywołana metoda UncaughtException i wykonanie programu (lub wątku) zostanie zakończone. 16
Fraza: throws klasa_wyjątków public staic void main(string args[]) throws Exception {/*...*/ void printnumber(int number) throws WrongNumberException {/*...*/ 17
try catch Jeżeli wykonanie pewnej instrukcji programu może spowodować powstanie wyjątkowego zdarzenia, to musi ona być ujęta w blok instrukcji try, po którym muszą wystąpić procedury obsługi wyjątku mające postać frazy catch i bezpośrednio po catch (opcjonalnie) frazy finally. try {I catch(arg1 e1) {I catch(arg2 e2) {I... catch(argn en) {I... finally {I Sterowanie przekazywane jest do pierwszej w kolejności klauzuli catch, której argument" (typ wyjątku) pasuje do typu powstałego wyjątku najpierw podawać BARDZIEJ SZCZEGÓŁOWE TYPY WYJĄTKÓW. 18
Klauzula finally Był wyjątek? NIE wykonaj klauzulę finally Przejdź do następnej linii programu TAK przerwij try uruchom jest klauzulę catch. wykonaj klauzulę finally boolean metoda(...) { try { /*instrukcje,które mogą spowodować wyjątek*/ catch(exception e) { return false; finally { /* uporządkowanie, np. zamknięcie pliku*/ return true; 19
Schemat obsługi wyjątków int a, b, c; String s; try { // wyjątek ArithmeticException s = Integer.toString(a); catch(arithmeticexception ex) { // wyjątek jest obsługiwany w bloku catch s = "*" ; 20
Własne wyjątki Wyjątki są obiektami klas pochodnych od Throwable. Aby stworzyć własny wyjątek, należy zdefiniować odpowiednią klasę. Zgodnie z konwencją dziedziczymy podklasę Throwable - klasę Exception. class NaszWyj extends Exception {...... void naszametoda() throws NaszWyj {..... if(błąd) throw new NaszWyj(ew_param_konstruktora_z_info_o_błędzie); 21
22
Standardowe klasy Javy java.applet, java.awt, java.beans, java.io, java.lang, java.math, java.net, java.rmi, java.security, java.sql, java.text, java.util, javax.accessibility, javax.swing, org.omg. 23
Pakiety java.util.date data = new java.util.date(); import java.util.*; 24
java.lang W pakiecie java.lang zdefiniowana jest klasa Object, która jest klasą nadrzędną wobec wszystkich innych klas Javy. Boolean, Byte, Integer, Long, Double, Character itd., Klasa Math Klasa Thread 25
java.lang 2 klasy obsługujące łańcuchy znaków: String i StringBuffer. Klasa String używana jest do przechowywania i wykonywania operacji na stałych łańcuchach; po utworzeniu obiektu tej klasy nie można zmienić jego wartości. Klasa ta zawiera metody: do sprawdzania poszczególnych znaków, porównywania łańcuchów, wyodrębniania podłańcuchów, tworzenia kopii z zamianą na małe albo duże litery. Klasa StringBuffer implementuje łańcuchy znaków, które mogą być zmieniane. Podstawowe metody tej klasy to append dodająca znaki na końcu bufora i insert wstawiająca znaki w określonym miejscu. Każdy obiekt przydziela bufor na przechowywany łańcuch znaków. Jeżeli całkowita długość łańcucha wzrośnie powyżej rozmiaru bufora, automatycznie przydzielany jest większy. 26
Pakiet java.io definiuje klasy implementujące operacje wejścia-wyjścia. Reader wraz z podklasami: BufferedReader, CharArrayReader, InputStreamReader, FileReader, StringReader Writer wraz z podklasami: BufferedWriter, CharArrayWriter, OutputStreamWriter, FileWriter, PrintWriter, StringWriter. 27
import java.io.*; import java.util.*; public class czytam { public static void main (String args[]){ EasyIn easy = new EasyIn(); System.out.print("enter float: "); System.out.flush(); System.out.println("You entered: " + easy.readfloat() ); float a=easy.readfloat(); System.out.println("You entered: " + a); class EasyIn { static InputStreamReader is = new InputStreamReader( System.in ); static BufferedReader br = new BufferedReader( is ); StringTokenizer st; StringTokenizer gettoken() throws IOException { String s = br.readline(); return new StringTokenizer(s); float readfloat() { try { st = gettoken(); return new Float(st.nextToken()).floatValue(); catch (IOException ioe) { System.err.println("IO Exception in EasyIn.readFloat"); return 0.0F; 28
pakiet java.util szereg klas definiujących różne struktury danych przechowujące inne obiekty. Klasa Vector implementuje tablicę obiektów, która może rosnąć lub zmniejszać się w miarę jak obiekty są dodawane lub usuwane. Wszystkie elementy wektora najwygodniej jest przeglądać wykorzystując interfejs Enumeration 29
Gdy wektor zajmuje całą przydzieloną pamięć, przed dodaniem kolejnego elementu jego rozmiar jest automatycznie zwiększany o wartość capacityincrement. Program może jednak sam zwiększyć rozmiar wektora przed wstawieniem dużej porcji danych, aby uniknąć wielu realokacji. Podklasą klasy Vector jest Stack realizujący kolejkę LIFO obiektów z metodami push i pop. 30
java.util.zip W pakiecie java.util.zip znajdują się klasy pozwalające tworzyć i czytać pliki skompresowane w formatach ZIP i GZIP. 31
Pakiet java.net Pakiet java.net zawiera klasy realizujące połączenia sieciowe zarówno na poziomie gniazd, jak i adresów URL wskazujących zasoby w WWW. Podstawowe klasy to: Socket, URL, URLConection. Pakiet java.sql Jednolity standard dostępu do dowolnych relacyjnych baz danych. Klasy z tego pakietu implementują połączenia z bazą danych, zapytania SQL, wyniki tych zapytań itp. Driver JDBC (Java DataBase Conectivity) 32
java.rmi RMI (Remote Method Invocation) zawarty w java.rmi umożliwia tworzenie rozproszonych aplikacji w Javie. RMI zapewnia mechanizm, poprzez który odbywa się komunikacja pomiędzy serwerem i klientem oraz przesyłane są dane w obie strony. org.omg Wspiera powszechnie przyjęty standard modelu rozproszonych obiektów CORBA (Common Object Request Brokerage Architecture). Pozwala on na komunikację pomiędzy obiektami bez względu na platformę systemu operacyjnego, ani użyty języka programowania. 33
pakiet java.awt Aplety i aplikacje Javy komunikują się z użytkownikiem wykorzystując klasy z pakietu java.awt składające się na graficzny interfejs użytkownika AWT (Abstract Window Toolkit). AWT dostarcza typowe komponenty graficzne takie, jak klawisze, pola do wprowadzania tekstu, listy wyboru itd. poprzez klasy: Button, Checkbox, Choice, Label, List, Menu, Scrollbar, TextArea, TextField będące pochodnymi klasy Component. Wykorzystując klasę Canvas, można rysować dowolne obrazy graficzne na ekranie; Po dodaniu odpowiedniej obsługi zdarzeń można zdefiniować dowolny własny komponent. 34
model obsługi zdarzeń W modelu 1.1 AWT zdarzenia są generowane przez źródła, którymi mogą być komponenty interfejsu użytkownika, myszka, klawiatura itd. Może być wydelegowany jeden lub więcej odbiorców zdarzenia pochodzącegocego od określonego źródła, który jest obiektem dowolnej klasy implementującej przynajmniej jeden z interfejsów obsługi zdarzeń takich, jak: ActionListener, KeyListener, MouseListener. 35
pakiet javax.swing W skład JDK 1.2 został włączony pakiet javax.swing nazywany również Java Foundation Classes (JFC), znacznie rozszerzający możliwości funkcjonalne interfejsu graficznego użytkownika. Pakiet ten zawiera znacznie więcej komponentów graficznych, pozwala dynamicznie imitować znane środowiska graficzne (np. Windows, CDE/Motif), umożliwia korzystanie z urządzeń pomocniczych w odczytywaniu informacji (jak np. czytniki ekranu, wyświetlacze Braille a), zawiera bogatą bibliotekę do tworzenia dwuwymiarowej grafiki, wspomaga technikę przeciągnij i upuść pomiędzy aplikacjami Javy i aplikacjami w danym systemie operacyjnym. 36
import java.awt.*; import java.awt.event.*; public class HelloApp extends Frame implements WindowListener { public HelloApp () { super(); addwindowlistener(this); setsize(320, 200); setvisible(true); public void paint(graphics gdc) { gdc.drawstring ("To jest aplikacja", 120, 100); public static void main(string args[]) { new HelloApp(); public void windowclosing(windowevent e){ System.exit(0); public void windowclosed(windowevent e){ public void windowopened(windowevent e){ public void windowiconified(windowevent e){ public void windowdeiconified(windowevent e){ public void windowactivated(windowevent e){ public void windowdeactivated(windowevent e){ 37
import java.awt.*; import java.awt.event.*; public class HelloApp extends Frame implements WindowListener { public HelloApp () { super(); addwindowlistener(this); setsize(320, 200); settitle("moja aplikacja w Javie"); MenuBar menubar = new MenuBar(); setmenubar(menubar); Menu menu = new Menu("Plik"); menu.add(new MenuItem("Zamknij")); menubar.add(menu); setvisible(true); public void paint(graphics gdc) { gdc.drawstring ("To jest aplikacja", 120, 100); public static void main(string args[]) { new HelloApp(); public void windowclosing(windowevent e){ System.exit(0); public void windowclosed(windowevent e){ public void windowopened(windowevent e){ public void windowiconified(windowevent e){ public void windowdeiconified(windowevent e){ public void windowactivated(windowevent e){ public void windowdeactivated(windowevent e){ 38