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