Podstawowe konstrukcje języka
Transkrypt
Podstawowe konstrukcje języka
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*/ /**kazda klasa ktora • interface Message implementuje ten interfejs bedzie miala metode • { giveReport - jej dzialanie void giveReport(); 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) /**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*/ { this.object=object; } public void execute (int times) { for (int k=0; k<times; k++) object.giveReport(); } •/** 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]; Przekroczenie zakresu tablicy spowoduje wyjątek ArrayIndexOutOfBoundsException tablica.length długość tablicy int tablica [] = {0,1,2,3,4}; 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 ERROR! OK! Zwierz z; Pies p = new Pies(); Rower r = (Rower) z; Zwierz z = p; // błąd, bo Rower nie pochodzi od Zwierza. Pies p1 = (Pies) z; 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 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ć SZCZEGÓŁOWE WYJĄTKÓW. BARDZIEJ TYPY 18 Klauzula finally Był wyjątek? NIE TAK przerwij try uruchom jest klauzulę catch. wykonaj klauzulę finally wykonaj klauzulę finally Przejdź do następnej linii programu 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ącego 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