JP SS 6 Klasy i obiekty


Języki Programowania
Klasy i obiekty.
Plan wykładu
żð Klasy i ich sygnatury
żð Tworzenie obiektów
żð konstruktor
żð konstruktor z parametrami
żð Metody i ich rodzaje
żð zwracanie wyników
żð przekazywanie parametrów
żð ochrona danych
żð Komentarze
żð automatyczna generacja dokumentacji
żð Dziedziczenie
żð podklasy
żð biblioteki klas, klasy wbudowane, klasa String
żð pakiety klas
żð Aplety jÄ™zyka Java
R. Pełka: Języki Programowania, 2008 2
Obiekty i klasy
żð Obiekty
żð Obiekty sÄ… maÅ‚ymi programami (lub fragmentami programów)
żð Obiekty współpracujÄ… ze sobÄ… w celu wykonania okreÅ›lonego
zadania
żð Obiekty zawierajÄ… dane (pola  fields)
żð Obiekty zawierajÄ… procedury przetwarzania danych, czyli
metody (methods)
żð Klasy
żð Klasy sÄ…  fabrykami obiektów
żð Każda klasa produkuje Å›ciÅ›le okreÅ›lony rodzaj (typ) obiektów
żð Każdy obiekt należy do jednej, okreÅ›lonej klasy
żð Klasa obejmuje obiekty tego samego rodzaju, utworzone
według tego samego pierwowzoru klasy
żð Klasa jest wzorcem budowy obiektów
R. Pełka: Języki Programowania, 2008 3
Obiekty i klasy
żð Każda klasa może być opisana
Malarz
przez podanie
żð konstruktora
Konstruktor:
żð zbiór metod zdefiniowanych
wewnÄ…trz klasy
Malarz()
żð Konstruktor tworzy nowy obiekt
Metody:
danej klasy
void rysujDom()
żð Metody powodujÄ… wykonanie
void rysujPortret(string)
określonej czynności
void kasujPiksel()
void zmienKolor()
R. Pełka: Języki Programowania, 2008 4
Konto bankowe jako obiekt
żð Tworzymy obiekt, którego
zadaniem jest modelowanie konta
bankowego
żð Co to jest konto bankowe?
żð ma swój numer
żð zawiera nazwisko wÅ‚aÅ›ciciela
żð zawiera informacjÄ™ o stanie
środków na koncie
żð Jakie operacje (metody) można
określić dla konta bankowego?
żð podaj stan konta
żð dokonaj wypÅ‚aty z konta
żð dokonaj wpÅ‚atÄ™ na konto
żð dokonaj przelewu na inne konto
bankowe
R. Pełka: Języki Programowania, 2008 5
Konto bankowe jako klasa
żð Klasa Konto zawiera trzy pola (fields)
class Konto
określające numer konta, właściciela i
stan konta {
int numer;
żð Każdy obiekt utworzony przez tÄ™ klasÄ™
ma swoje własne pola odpowiadające String wlasciciel;
polom klasy, w których obiekty
int stanKonta;
przechowują swoje wartości pól
}
żð PrzykÅ‚ady trzech obiektów klasy
Konto:
Ćwiczenie: zdefiniuj klasę Konto w BlueJ i utwórz trzy obiekty tej klasy o nazwach:
konto1, konto2 i moje_konto. Wykonaj inspekcję obiektu moje_konto i sprawdz, że:
int numer = 0, String wlasciciel = , int stanKonta = 0
R. Pełka: Języki Programowania, 2008 6
Typy pól w języku Java
żð int jest typem prymitywnym (primitive type) jÄ™zyka Java
żð wartoÅ›ci zmiennych (pól) typu prymitywnego sÄ… pamiÄ™tane bezpoÅ›rednio w
obszarze pola
żð inne typy prymitywne jÄ™zyka Java:
żð boolean
żð char
żð byte
żð short
żð long
żð float
żð double
żð String jest typem obiektu, a wiÄ™c klasÄ… jÄ™zyka Java, tak samo jak
wcześniej zdefiniowane klasy Malarz czy Konto
żð W polu typu obiektowego nie przechowuje siÄ™ wartoÅ›ci, ale link (referencjÄ™, czyli
adres) do miejsca w pamięci, gdzie ta wartość się znajduje
żð Pola typu obiektowego przed inicjalizacjÄ… zawierajÄ…
R. Pełka: Języki Programowania, 2008 7
Odwołanie przez adres
żð Zmienne typów prymitywnych zawierajÄ… wprost podanÄ… wartość
zmiennej, natomiast obiekty zawierają adres miejsca pamięci, gdzie
ulokowane sÄ… pola danych obiektu (!!!)
żð Nazwa obiektu jest zatem tylko adresem (wskaznikiem) poÅ‚ożenia
obiektu. Do obiektów odwołujemy się więc przez adres (reference), a
do zmiennych typów prymitywnych przez wartość (value)
żð JeÅ›li num1 jest zmiennÄ… typu int, a name1 obiektem klasy String,
to wówczas możemy narysować diagram:
52
num1
 Steve Jobs
name1
R. Pełka: Języki Programowania, 2008 8
Przypisanie =
żð Operacja przypisania kopiuje wartość podanÄ… z prawej
strony przypisania do miejsca wskazanego z lewej
strony
żð Dla typów prymitywnych
38
num1
przed
96
num2
num2 = num1;
38
num1
po
38
num2
R. Pełka: Języki Programowania, 2008 9
Przypisanie dla obiektów
żð JeÅ›li name1 i name2 sÄ… nazwami obiektów (np. klasy
String), to przypisanie dotyczy adresów, a nie wartości
(!!!)
"Steve Jobs"
name1
przed:
"Steve Wozniak"
name2
name2 = name1;
"Steve Jobs"
name1
po:
name2
R. Pełka: Języki Programowania, 2008 10
Aliasy (aliases)
żð Dwie lub wiÄ™cej referencji do tego samego obiektu sÄ…
nazywane aliasami (aliases)
żð Oznacza to, że ten sam obiekt może być wskazany
przez wiele nazw
żð Aliasy mogÄ… być użyteczne, ale należy je stosować z
dużą ostrożnością, bo często prowadzi to do błędów w
programach
żð PamiÄ™taj: zmiana obiektu przez jednÄ… z referencji
zmienia obiekt dla wszystkich referencji, ponieważ w
pamięci jest to realnie jeden i ten sam obiekt
R. Pełka: Języki Programowania, 2008 11
Zwalnianie pamięci (garbage collection)
żð JeÅ›li obiekt nie ma żadnej ważnej referencji oznacza to,
że jest niewykorzystywany (program nie może mieć do
niego dostępu)
żð Taki obiekt jest bezużyteczny i nosi nazwÄ™ garbage
żð Java wykonuje automatycznÄ… inspekcjÄ™ obiektów i
wykrywa obiekty bezużyteczne, po czym likwiduje je w
pamięci automatycznie zwracając pamięć do innych
potrzeb. Proces ten nosi nazwÄ™ garbage collection
żð W innych jÄ™zykach programista sam odpowiada za
zwalnianie pamięci po bezużytecznych obiektach
R. Pełka: Języki Programowania, 2008 12
Metody
żð We wczeÅ›niejszym przykÅ‚adzie klasy i obiektów
dotyczących kont bankowych zdefiniowaliśmy
na razie pola
żð Pozostaje zdefiniować jeszcze metody
żð podajStanKonta (observer zwracany typ int)
żð wplata (mutator  void)
żð wyplata (mutator  void)
żð przelew (mutator  void)
żð Metody dzielÄ… siÄ™ na dwa rodzaje:
żð observer  metody, które zwracajÄ… wartość
wyprodukowaną przez obiekt. Wartość może być
typu int, String itp. Metody tego typu nie zmieniajÄ… stanu obiektu
żð mutator  metody, które zmieniajÄ… stan obiektu, nie dostarczajÄ… informacji o
obiekcie
żð W wyjÄ…tkowych sytuacjach metoda może być jednoczeÅ›nie observerem i
mutatorem (należy tego jednak unikać)
żð Inne terminy: observer - getter, mutator - setter
R. Pełka: Języki Programowania, 2008 13
Metody zwracajÄ…ce wynik
żð Metoda podajStanKonta zwraca wynik typu int bÄ™dÄ…cy
wartością pola stanKonta
Typ zwracanego
Nazwa metody Lista parametrów
wyniku
(tutaj pusta)
int podajStanKonta( )
{
return stanKonta;
}
Zwróć jako wynik Wartość pola
stanKonta
(rezultat) ...
R. Pełka: Języki Programowania, 2008 14
Metody z parametrem
żð Metoda wplata wymaga podania argumentu (parametru) typu int
będącego wartością kwoty wpłaty
Typ zwracanego
Nazwa metody Parametr typu
wyniku (brak) int
void wplata(int kwota)
{
stanKonta += kwota;
}
zwiększ o ... kwotę
Stan konta
R. Pełka: Języki Programowania, 2008 15
Sygnatura metody
żð Nagłówek metody nazywany jest również sygnaturÄ…. Dla sygnatury
istotny jest tylko typ zwracanej wartości i typy parametrów
int podajStanKonta( )
{
void (int)
return stanKonta;
}
void wplata(int kwota)
{
int ( )
stanKonta += kwota;
}
void przelew(Konto odbiorca, int kwota)
{
void (Konto, int)
// ... Zajmiemy sie tym pózniej;
}
R. Pełka: Języki Programowania, 2008 16
Klasa Konto
żð Należy zwrócić uwagÄ™ na sposób
formatowania nawiasów
klamrowych w ciele metody
żð Istnieje wiele konwencji, ale ta jest
powszechna i wygodna
żð JeÅ›li kursor znajdzie siÄ™ za klamrÄ…
edytor pokazuje w szarej obwódce
jej partnera co ułatwia sprawdzanie
poprawności struktury nawiasów
R. Pełka: Języki Programowania, 2008 17
Uruchamiamy metodÄ™
Kompilujemy klasÄ™ Konto i konstruuje-
my obiekt tej klasy nadajÄ…c mu nazwÄ™
np. konto1
Wywołujemy metodę wplata
Pojawia się okno, w którym należy
podać wartość parametru metody
(kwotę wpłaty)
Następnie możemy uruchomić metodę
podajStanKonta, aby sprawdzić, czy
wpłata została dokonana
Ćwiczenie: uzupełnij klasę Konto o
metodÄ™ wyplata (podobna do wplata,
ale zamiast += należy użyć operacji -=)
WÅ‚Ä…cz inspektora obiektu i dokonuj
wpłat oraz wypłat obserwując  na żywo
stan konta.
R. Pełka: Języki Programowania, 2008 18
Przelewy
Aby dokonać przelewu metoda przelew musi otrzymać dwa parametry:
" konto odbiorcy
" kwotÄ™ przelewu
void przelew(Konto odbiorca, int kwota)
{
wyplata(kwota);
odbiorca.wplata(kwota);
}
Podczas wywołania metody parametry formalne metody otrzymują wartości
parametrów aktualnych
przelew(konto7,325)
Wywołanie:
wyplata(325);
Powoduje wywołanie
konto7.wplata(325);
metody innego
obiektu
Obiekty komunikują się ze sobą. W tym przykładzie obiekt konto7
otrzymuje komunikat aby wywołać metodę wplata z parametrem
o wartości 325. Sprawdz jak to działa w BlueJ
R. Pełka: Języki Programowania, 2008 19
Konstruktor
żð Konstruktor sÅ‚uży do generowania nowych obiektów danej klasy
żð DotÄ…d wszystkie nowe obiekty klasy Konto byÅ‚y tworzone w taki
sposób, że
żð numer = 0
żð wlasciciel =
żð Za metodÄ™ Konstruktor odpowiada klasa
Domyślny konstruktor
żð Konstruktor obiektów danej klasy (np. Konto) ma takÄ… samÄ…
klasy Konto
nazwę (czyli Konto). Należy pamiętać o rozróżnieniu małych i
dużych liter
żð Konstruktor nie zwraca żadnej wartoÅ›ci; wynikiem jego dziaÅ‚ania
Konto( )
jest nowy obiekt danej klasy. Konstruktor nie zawiera zatem
{
słowa return
żð Dla każdej klasy istnieje domyÅ›lny konstruktor, który inicjalizuje
}
pola tworzonego obiektu tak, że pola typu int otrzymują
wartość 0, natomiast pola typu obiektowego (np. String)
wartość
R. Pełka: Języki Programowania, 2008 20
Ulepszony konstruktor
Konto(int nowyNumer, String nazwisko){
numer = nowyNumer;
Definicja konstruktora
wlasciciel = nazwisko;
stanKonta = 0;
}
new Konto(569123666,  Kowalski )
Wywołanie konstruktora
Efekt
Nowy obiekt ma
numer i właściciela
zgodnie z
parametrami
aktualnymi wywołania
konstruktora
R. Pełka: Języki Programowania, 2008 21
Więcej konstruktorów
żð Klasa może mieć wiÄ™kszÄ… liczbÄ™ konstruktorów
żð PrzykÅ‚ady
żð Bank oferuje nowym klientom poczÄ…tkowÄ… kwotÄ™ (saldo) na koncie w prezencie (znany
chwyt)
żð JeÅ›li klient banku zwerbuje nowego klienta otrzymuje premiÄ™
żð Konstruktory wewnÄ…trz klasy muszÄ… mieć różne typy listy parametrów, czyli
różne sygnatury
żð WewnÄ…trz klasy Konto możliwe sÄ… na przykÅ‚ad konstruktory
żð Konto() Konto()
żð Konto(int numer, String nazwisko) Konto(int,String)
żð Konto(String nazwisko, int numer) Konto(String,int)
żð Konto(int numer, String nazwisko, int prezent) Konto(int,String,int)
żð Konto(int numer, String nazwisko, Konto werbujacy) Konto(int,String,Konto)
żð Nie sÄ… natomiast dozwolone jednoczeÅ›nie konstruktory
żð Konto(int numer, String nazwisko) Konto(int,String)
żð Konto(int kwota, String odbiorca) Konto(int,String)
żð Należy pamiÄ™tać, że nie wszystko co dozwolone ma sens
sygnatury
R. Pełka: Języki Programowania, 2008 22
Ochrona danych
Konto
Pole:
int numer
String wlasciciel
Użytkownik klasy Konto powinien mieć
int stanKonta
dostęp do danych obiektu tej klasy tylko
Konstruktor:
przez metody
Konto()
Konto(int,String)
Można ochronić wybrane pola przed
dostępem z zewnątrz za pomocą słowa
Metoda:
kluczowego
int podajStanKonta()
void wplata(int)
private
void wyplata(int)
void przelew(Konto,int)
....
R. Pełka: Języki Programowania, 2008 23
Ochrona danych cd.
żð Chronimy pola wlasciciel i
// pola obiektu
stanKonta
int numer;
żð Użytkownik obiektu nie może
private String wlasciciel;
odczytać lub zmienić tych pól
private int stanKonta;
inaczej jak tylko przez dostępne
metody
// metody obiektu
żð int podajStanKonta()
public int podajStanKonta(){ żð String podajWlasciciela()
żð wplata()
return stanKonta;
żð wyplata()
}
żð przelew()
żð zauważmy, że można odczytać
public String podajWlasciciela(){
pole wlasciciel, ale nie można go
zmienić
return wlasciciel;
żð JeÅ›li bank chce pózniej np.:
}
żð wprowadzić opÅ‚aty od operacji
żð drukować protokoÅ‚y i wyciÄ…gi
public void wplata(int kwota){
Musi zmodyfikować potrzebne
stanKonta += kwota;
metody i ma pewność
bezpieczeństwa transakcji
}
dostępne z
zewnÄ…trz obiektu
R. Pełka: Języki Programowania, 2008 24
getters & setters
żð ProjektujÄ…c klasÄ™ zaleca siÄ™
Date
deklarować wszystkie dane w
polach private
Fields:
private int day
żð DostÄ™p do danych z zewnÄ…trz
private int month
powinien odbywać się tylko przez
metody public
private int year
Constructors:
żð Przejrzystość zapewnia podziaÅ‚
Date()
metod na dwie grupy:
Date(int,int,int)
Methods:
żð setter  do ustawiania wartoÅ›ci pól
getter
żð getter  do odczytu wartoÅ›ci pól
public int getDay()
żð zaleca siÄ™ by nazwy metod
public int getMonth()
zaczynały się odpowiednio od get
public int getYear()
lub set (wcześniej tego nie
setter
przestrzegaliśmy pisząc np.
public void setDay()
podajStanKonta)
public void setMonth()
public void setYear()
R. Pełka: Języki Programowania, 2008 25
Komentarze
żð Java stosuje trzy rodzaje komentarzy programu zródÅ‚owego
żð // komentarz do koÅ„ca linii
// krótkie wyjaśnienie znaczenia operacji, metody itp..
żð /* tekst zawarty w tych ogranicznikach */
żð podkreÅ›la najtrudniejsze fragmenty kodu
żð uÅ‚atwia pózniejsze ich zrozumienie
żð uÅ‚atwia czytanie kodu przez innych
żð /** z teksu zawartego w tych klamrach */
żð aplikacja javadoc.exe wydobywa automatycznie dane na temat aplikacji
żð stosuje siÄ™ specjalne znaczniki dla okreÅ›lonych danych:
żð @author
żð @date
żð @param
żð @return ....
żð na tej podstawie tworzy siÄ™ automatycznie dokumentacjÄ™ oprogramowania
żð generowanie dokumentacji w BlueJ: menu Tools opcja Project
Documentation, dokumentację można obejrzeć w przeglądarce HTML
R. Pełka: Języki Programowania, 2008 26
Pola statyczne
Dotąd opis klasy zawierał jedynie pola, które były zawsze powielane dla
każdego tworzonego obiektu tej klasy. Obiekty dysponowały własnymi
egzemplarzami takich pól.
Niekiedy chcemy, by pole było związane z klasą, a nie z obiektem, to znaczy by
miało jedną wspólną wartość (i jeden egzemplarz w obrębie klasy). Takie pola
deklaruje się jako statyczne słowem kluczowym static
żð pola klasy sÄ…
class Konto{
oznaczone słowem
// pola klasy
static int stopaProcentowa = 4; kluczowym static
static int licznikKont;
żð pola klasy i obiektu
// pola obiektu
będą wstępnie
int numer;
inicjowane
String wlasciciel =  Pan Dyrektor ;
int stanKonta = 0;
R. Pełka: Języki Programowania, 2008 27
Autoinkrementacja x++
Każde pole xyz typu int może
class Konto{
być autoinkrementowane
// pola klasy
xyz++ ;
static int stopaProcentowa = 4;
co powoduje zwiększenie
static int licznikKont;
wartości pola o 1
// konstruktor
Konto(String nowyKlient){
wlasciciel = nowyKlient;
stanKonta = 0;
numer = licznikKont;
Zwiększ aktualny numer konta
licznikKont++;
(który będzie przydzielony
}
następnemu klientowi) o 1
// pola obiektu
int numer;
String wlasciciel;
int stanKonta;
// metody obiektu
...
R. Pełka: Języki Programowania, 2008 28
Metody statyczne
class Konto{
static stopaProcentowa = 3;
static int getStopaProcentowa(){
return stopaProcentowa();
}
}
żð Podobnie jak pola statyczne, można w obrÄ™bie klasy definiować statyczne
metody. Są one używane do:
żð manipulacji na polach statycznych
żð np. do zmiany obowiÄ…zujÄ…cej w banku stopy procentowej
żð implementacji obserwatorów (observers) niezależnych od wywoÅ‚ywanego
obiektu
żð np. getStopaProcentowa()
żð zapisu konstruktorów  w tym przypadku sÅ‚owo static pomija siÄ™ (tak
robiliśmy wcześniej), ponieważ konstruktor nie zwraca wyniku, tylko
tworzy nowy obiekt
R. Pełka: Języki Programowania, 2008 29
Wywoływanie metod
żð JeÅ›li chcemy wywoÅ‚ać metodÄ™ obiektu, musimy najpierw utworzyć obiekt
określonej klasy, a następnie wywołać metodę:
Square sciana = new Square();
Circle slonce = new Circle()
obiekty ...
slonce
slonce.changeColor( yellow );
sciana
sciana.moveHorizontal(50);
żð JeÅ›li chcemy wywoÅ‚ać metodÄ™ klasy (metodÄ™ statycznÄ…), przy wywoÅ‚aniu
zamiast nazwy obiektu podajemy nazwÄ™ klasy
Konto.getStopaProcentowa();
klasa Konto
R. Pełka: Języki Programowania, 2008 30
Wywoływanie metod cd.
żð class Liczba_metoda
żð {
żð int x;
żð public static void main(String[] args)
żð {
żð Liczba_metoda wartosc=new Liczba_metoda();
żð wartosc.x=5;
żð wartosc.pokazLiczbe();
żð }
żð void pokazLiczbe()
żð {
żð System.out.println("Liczba x= "+x);
żð }
żð }
A. Poniecki: Języki Programowania, 2012 31
Wywoływanie metod cd.
class Liczba_metoda2
{
int x;
public static void main(String[ ] args)
{
Liczba_metoda2 wartosc = new Liczba_metoda2();
wartosc.x = 5;
System.out.println("Liczba x= "+wartosc.pobierzLiczbe());
}
int pobierzLiczbe()
{
return x;
}
}
A. Poniecki: Języki Programowania, 2012 32
Używanie predefiniowanych klas
żð Klasa Malarz używaÅ‚a zdefiniowanych wczeÅ›niej (w częściowo
gotowym projekcie BlueJ o nazwie shapes) klas Circle, Square i
Triangle
żð Z kolei klasy te używajÄ… klasy Canvas, która definiuje obszar rysowania
na ekranie
żð Z predefiniowanych klas można korzystać, nawet nie znajÄ…c
szczegółów ich budowy,
jeśli znamy tylko informacje
na temat sygnatury klasy
i jej metod udostępnianych
na zewnÄ…trz
żð BlueJ podaje relacje wzajem-
nego korzystania z klas
przez inne klasy w postaci
graficznej
R. Pełka: Języki Programowania, 2008 33
Wbudowane klasy
żð Aby uÅ‚atwić tworzenie programów Java dostarcza programiÅ›cie wiele predefiniowanych
klas zebranych w bibliotekach klas dołączanych do środowiska JDK
żð Niektóre z predefiniowanych klas sÄ… wbudowane w jÄ™zyk Java, inne zaÅ› wymagajÄ…
dołączania bibliotek nazywanych pakietami (packages)
żð System
żð Klasa wbudowana, sÅ‚uży do operacji zwiÄ…zanych z systemem komputerowym
żð Szczególnie przydatne jest statyczne pole out
żð Zawiera ono obiekt umożliwiajÄ…cy wyprowadzanie danych (tzw.  PrintStream )
żð PrintStreams udostÄ™pniajÄ… metodÄ™ println() , do wyprowadzania danych (wyÅ›wietlania) w oknie
terminala
System.out.println( Hej ludzie, co siÄ™ dzieje );
System.out.println(17+4);
System.out.println(mojeKonto); //co to spowoduje  sprawdz!
Można też skorzystać z pakietu java.io i zlecać wyprowadzanie danych jak podano
poniżej
PrintStream wydruk = System.out;
Wydruk.println( komunikat numer 25 );
Wydruk.println( 17 + 4 =  + (17+4)); //co siÄ™ wydrukuje?
R. Pełka: Języki Programowania, 2008 34
Wbudowana klasa Math
żð Math
żð Klasa ze zbiorem
żð funkcji matematycznych
żð np. max, min, abs, random, sin, log, &
żð i staÅ‚ych matematycznych
żð PI, E
żð klasa Math ma wyÅ‚Ä…cznie statyczne pola i metody
żð nie trzeba samemu tworzyć obiektów do realizacji operacji
matematycznych
System.out.println(Math.max(3,5));
System.out.println(Math.abs(x*x-10*x+1));
System.out.println(Math.sqrt(Math.PI + Math.E));
System.out.println(Math.random());
R. Pełka: Języki Programowania, 2008 35
Klasa String
żð String
żð Obiekty sÄ… ciÄ…gami (Å‚aÅ„cuchami) znaków (Å›ciÅ›lej 
listą znaków)
żð Stringi można
żð Sklejać ze sobÄ… (konkatenować)
żð Wyprowadzać na ekran
żð np. z pomocÄ… System.out.println();
żð DostÄ™pne sÄ… metody do
żð OkreÅ›lania dÅ‚ugoÅ›ci stringu: length( )
żð  Hello .length()
żð Porównywania dwóch stringów: equals( )
żð  Hello .equals( Hello )
żð Wydzielenia i-tego znaku: charAt( )
żð &
R. Pełka: Języki Programowania, 2008 36
Klasa String (cd.)
żð tworzenie stringów
żð przez podanie treÅ›ci ujÄ™tej w cudzysÅ‚owy
żð  Hello World ,  Sincerely yours \n James Bond
żð w programie, z użyciem konstruktora
żð String pozdro = new String( Hi guys );
żð lub bezpoÅ›rednio
żð String pozdro =  Hi guys ;
żð operator konkatenacji  +
żð  Hello +  world daje  Hello world
żð  bez +  spacji daje  bezspacji
żð wszystkie typy jÄ™zyka Java majÄ… swojÄ… reprezentacjÄ™ jako stringi:
żð konwersja odbywa siÄ™ automatycznie od lewej do prawej
żð System.out.println( 1 plus 1 daje  +(1+1)); // 1 plus 1 daje 2
żð System.out.println( 1 plus 1 daje  +1+1); // 1 plus 1 daje 11
żð można dokonać konwersji każdego obiektu na string
żð toString()
R. Pełka: Języki Programowania, 2008 37
Klasa String (cd.)
R. Pełka: Języki Programowania, 2008 38
Aplikacje Java
żð Aplikacja w jÄ™zyku Java jest kompletnym, samodzielnym programem (stand-alone)
żð Aplikacja skÅ‚ada siÄ™ z co najmniej jednej głównej klasy public (w podanym
przykładzie MojaAplikacja) i ewentualnie ze współpracujących z nią klas
pomocniczych (w tym przykładzie taką klasą jest AlgorytmAplikacji)
Główna klasa aplikacji musi
public class MojaAplikacja
zawierać metodę main o
{
public static void main(String[] args){
sygnaturze podanej w
AlgorytmAplikacji.zrobSwoje();
przykładzie
System.out.println("Podane argumenty");
for (int k=0; kargs oznacza tablicÄ™
System.out.print(args[k]+" ");
stringów, do której trafią
}
argumenty aplikacji podane
}
przy jej uruchomieniu
public class AlgorytmAplikacji
{
public static void zrobSwoje(){
System.out.println("Pozdrowienia od algorytmu");
}
// zapis właściwej treści algorytmu aplikacji
}
R. Pełka: Języki Programowania, 2008 39
Aplikacje w JDK
żð Tworzenie i uruchamianie aplikacji w Å›rodowisku JDK przebiega w
następujących etapach:
żð Utworzenie kodów zródÅ‚owych klas i zapisanie ich w plikach z
rozszerzeniem .java, w tym przykładzie
żð MojaAplikacja.java
żð AlgorytmAplikacji.java
żð Skompilowanie klas kompilatorem javac
żð javac MojaAplikacja.java
żð javac AlgorytmAplikacji.java
żð Na dysku pojawiajÄ… siÄ™ pliki bytecode:
żð MojaAplikacja.class
żð AlgorytmAplikacji.class
żð Uruchomienie aplikacji:
żð java MojaAplikacja lista_parametrów
żð Lista parametrów P1, P2, P3 ... jest opcjonalna, stosujemy jÄ… jeÅ›li chcemy
wprowadzić z linii poleceń argumenty do uruchamianej aplikacji. W podanym
dalej przykładzie zastosowano 4 argumenty typu String:
żð java MojaAplikacja jeden 2 trzy 4
R. Pełka: Języki Programowania, 2008 40
Uruchomienie aplikacji w JDK
żð Uwaga: należy sprawdzić, czy jest zdefiniowana Å›cieżka dostÄ™pu do katalogu
zawierajÄ…cego kompilator javac i JVM java
żð sÅ‚uży do tego polecenie PATH systemu operacyjnego
żð w podanym przykÅ‚adzie, aby nie komplikować sprawy umieszczono pliki aplikacji
w tym samym katalogu co kompilator i JVM
żð Jako parametry podano cztery wartoÅ›ci: jeden 2 trzy 4
żð zgodnie z sygnaturÄ… metody main wszystkie parametry sÄ… traktowane jako
stringi, zatem np. 2 oznacza jednoznakowy string  2 , a nie liczbę całkowitą 2 !!!
R. Pełka: Języki Programowania, 2008 41
Aplikacja w BlueJ
żð Wykonać edycjÄ™ klas MojaAplikacja
i AlgorytmAplikacji
żð W oknie graficznych zależnoÅ›ci miedzy
klasami dodać przerywaną strzałkę
wskazującą, że klasa MojaAplikacja
korzysta z klasy AlgorytmAplikacji
żð Skompilować klasy i przetestować
metodÄ™ main
żð Wybrać opcjÄ™ Project/Create Jar File
żð W rozwijanym menu wybrać jako klasÄ™
główną MojaAplikacja
żð Zapisać aplikacjÄ™ jako wykonywalny
plik, np. o nazwie aplikacja_testowa
żð BlueJ utworzy w podanym katalogu
tzw. wykonywalny plik jar, który
można wykonać w JDK jak poprzednio
R. Pełka: Języki Programowania, 2008 42
Aplikacje spakowane .jar
żð Wyprodukowana w ten sposób aplikacja zostaÅ‚a zapisana przez BlueJ w
tzw. formacie spakowanym .jar (java archive)
żð PowstaÅ‚ plik aplikacja_testowa.jar
żð Aplikacje jar można uruchomić w JDK korzystajÄ…c z opcji java  jar jak
pokazuje poniższy obraz konsoli poleceń DOS
żð Pliki .jar można też rozpakować programem WinZip i uruchamiać w zwykÅ‚y
sposób, bez korzystania z opcji -jar
żð W plikach .jar oprócz kodu skompilowanych klas można również zawrzeć dla
celów dokumentacyjnych inne elementy, np. kody zródłowe. W tym celu podczas
tworzenia plików .jar należy zaznaczyć odpowiednie opcje w oknie BlueJ
żð Pliki .jar można również tworzyć w SDK firmy Sun Microsystems
R. Pełka: Języki Programowania, 2008 43
Dziedziczenie - inheritance
żð W jÄ™zyku Java można tworzyć klasy potomne  podklasy
dziedziczÄ…ce cechy klasy podstawowej  nadklasy
żð Załóżmy, że chcemy utworzyć specjalne rodzaje kont bankowych
żð Konta debetowe
żð można siÄ™ na nich zapożyczyć ponad saldo konta, ale trzeba pÅ‚acić odsetki
żð konto jest nieoprocentowane
żð Konta oszczÄ™dnoÅ›ciowe
żð konto jest oprocentowane
żð nie można siÄ™ zadÅ‚użać
żð nie można podejmować wypÅ‚at
żð Tworzymy konta
żð DebetKonto
żð LokataKonto
które są podklasami zdefiniowanej wcześniej klasy Konto
R. Pełka: Języki Programowania, 2008 44
Klasa Konto
R. Pełka: Języki Programowania, 2008 45
Dziedziczenie cd.
żð Podklasy i ich obiekty majÄ… swoiste wÅ‚aÅ›ciwoÅ›ci
żð DziedziczÄ… pola i metody nadklasy, które nie sÄ… prywatne
żð A wiÄ™c automatycznie konta debetowe i lokacyjne majÄ…
żð pola: numer, stanKonta, wlasciciel
żð metody: podajStanKonta, wplata, wyplata
żð MogÄ… mieć dodatkowe pola:
żð Konta lokacyjne mogÄ… mieć nowe pola
żð oprocentowanie stopaProcLokaty
żð kiedy ostatnio naliczono odsetki (od kiedy trwa okres odsetkowy)
żð Konta debetowe mogÄ… mieć dodatkowe pola
żð wysokość odsetek za zadÅ‚użenie
żð limit zadÅ‚użenia
żð od kiedy powstaÅ‚o zadÅ‚użenie
żð MogÄ… mieć dodatkowe metody:
żð Konta lokacyjne
żð naliczone odsetki
żð Konta debetowe
żð naliczone karne odsetki
R. Pełka: Języki Programowania, 2008 46
Podklasy
żð Przy pomocy sÅ‚owa kluczowego extends klasa dziedziczy cechy
innej klasy:
class LokataKonto extends Konto{ class DebetKonto extends Konto{
... ...
static int stopaProcLokaty = 3; static int stopaProcKredytu = 13;
int ostatniDzienNaliczOdsetek; int ostatniDzienOkresuRach;
int limit=10000;
int getStopaProcLokaty(){
return stopaProcLokaty; int getLimit(){
} return limit;
}
void naliczOdsetki(){
... void naliczKosztKredytu(){
...
R. Pełka: Języki Programowania, 2008 47
Podklasy cd.
public class Podklasa extends Nadklasa
{
String witaj;
Podklasa()
{
witaj="Dzień dobry";
}
public static void main(String[] args)
{
Podklasa t= new Podklasa();
System.out.println(t.witaj+" "+t.imie+"!");
}
}
class Nadklasa
{
String imie = "Janek";
}
A. Poniecki: Języki Programowania, 2012 48
super
żð OdwoÅ‚anie z podklasy do nadklasy
żð podklasa nie dziedziczy konstruktora z nadklasy
żð na samym poczÄ…tku podklasy trzeba zbudować konstruktora
żð czÄ™sto robi siÄ™ to przez wykorzystanie konstruktora nadklasy, z
wykorzystaniem odwołania super, jak pokazuje poniższy przykład
żð odwoÅ‚anie super może być stosowane również w celu dostÄ™pu do
innych elementów nadklasy np. metod
class LokataKonto extends Konto{
// przejmujemy konstruktora
// z nadklasy
LokataKonto(String x){
super(x);
ostatniDzienNaliczOdsetek = 0;
}
...
}
R. Pełka: Języki Programowania, 2008 49
Dostęp do nadklasy
Konto
żð pola private sÄ… chronione
żð niedostÄ™pne również z podklas
Pole:
żð muszÄ… wystarczyć metody getter
static protected int stopaProc
i setter
protected int stanKonta
String wlasciciel
żð pola protected
private int numer
Metoda:
żð dostÄ™pne z podklasy
getter
żð niedostÄ™pne z innych klas
public int getStanKonta()
public int getWlasciciel()
żð niechronione pola
public int getNumer()
żð dostÄ™pne ze wszystkich klas
public boolean czyRokPrzest()
całego pakietu
setter
żð niedostÄ™pne z klas innych
public void wplata(int)
pakietów
public void przelew(Konto,int)
żð sÄ… prywatne dla pakietu
public void wyplata(int)
...
R. Pełka: Języki Programowania, 2008 50
Dostęp z podklasy
Konto
Pole:
static protected int stopaProc
class LokataKonto extends Konto{
protected int stanKonta
void naliczOdsetki(){
String wlasciciel
wplata(stanKonta * stopaProc);
private int numer
} // OK
Metoda:
getter
void drukujWyciag(){
public int getStanKonta()
System.out.println(wlasciciel); //OK.
public int getWlasciciel()
System.out.println(numer); // błąd!
public int getNumer()
System.out.println(stanKonta); //OK.
}
public boolean czyRokPrzest()
...
setter
public void wplata(int)
public void przelew(Konto,int)
public void wyplata(int)
...
R. Pełka: Języki Programowania, 2008 51
this
żð sÅ‚owo kluczowe this oznacza aktualny obiekt
żð this(), this(...) oznaczajÄ… konstruktory aktualnej klasy
żð poniższy przykÅ‚ad ilustruje użycie this do budowy konstruktorów
public Konto(){
/* ten fragment kodu powinien znalezć się również
* w innych ewentualnych konstruktorach klasy Konto
*/
numerKonta = licznikKont;
licznikKont++;
}
public Konto(String nazwisko){
this(); // wołamy konstruktora bez parametrów
wlasciciel = nazwisko;
}
public Konto(String nazwisko, int kwota){
this(nazwisko); // wołamy konstruktora z parametrem
stanKonta = kwota;
}
R. Pełka: Języki Programowania, 2008 52
Podklasy w BlueJ
Strzałki z ciągłymi liniami wskazują, że
klasy LokataKonto i DebetKonto sÄ…
podklasami klasy Konto
Każdy obiekt podklasy:
- zawiera dodatkowe metody
- dziedziczy wszystkie metody nadklasy
R. Pełka: Języki Programowania, 2008 53
Overriding  przedefiniowanie
żð Metody nadklasy mogÄ… być przedefiniowane w podklasie,
żð można jest zdefiniować z tÄ… samÄ… nazwÄ…, ale z innÄ… treÅ›ciÄ…; nowa
definicja  przesłania definicję z nadklasy, stąd nazwa overriding
żð przykÅ‚ad: overriding metody wyplata
żð w podklasie LokataKonto, które nie dopuszcza debetu, przed
wypłatą należy sprawdzić, czy kwota wypłaty nie przekracza stanu
konta
class LokataKonto extends Konto{
...
void wyplata(int kwota){
if (getStanKonta() >= kwota)
super.wyplata(kwota);
}
...
metoda wyplata nadklasy, czyli klasy Konto
R. Pełka: Języki Programowania, 2008 54
Klasy  podklasy
żð Kiedy modelować klasÄ™ jako podklasÄ™ istniejÄ…cej już klasy?
żð Tylko wtedy, gdy ma to sens
żð każde koÅ‚o to figura
żð każda figura to geometryczny obiekt
żð każde konto oszczÄ™dnoÅ›ciowe jest kontem
żð każdy samochód osobowy jest samochodem ...
żð Tylko wtedy, gdy każdy obiekt nowej podklasy może być uważany za
szczególny przypadek obiektu istniejącej klasy
żð kwadrat jest szczególnym prostokÄ…tem
żð koÅ‚o jest szczególnÄ… elipsÄ…
żð student jest szczególnÄ… osobÄ…
żð Tylko wtedy, gdy metody nadklasy majÄ… także sens w podklasie
żð makeVisible() ma sens w klasie Figura i w podklasie Prostokat
żð getPole() ma sens w klasie Prostokat i w podklasie Kwadrat
żð getStanKonta() ma sens w klasie Konto i w podklasie LokataKonto
R. Pełka: Języki Programowania, 2008 55
Obsługa wyjątków
public class Wyjatek2
{ static void pauza() throws Exception{ }
public static void main(String[] args) throws Exception
{ String wyjatki[] ={"dzielenie","tablica"};
for (int i = 0; i < 2; i++)
{ try
{ wygeneruj(wyjatki[i]);
System.out.println("Wyjatek przy operacji typu:\"" + wyjatki[i] + "\" nie zostal
wygenerowany");
}
catch (Exception e)
{ System.out.println("Przy operacji typu \"" + wyjatki[i] + "\" wystapil wyjatek: \n" +
e.getClass() + "\n Z nastepujaca informacja: " + e.getMessage());
}
}
pauza();
}
A. Poniecki: Języki Programowania, 2012 56
Obsługa wyjątków cd.
static int wygeneruj(String s) throws Exception
{ try
{ if (s.equals("dzielenie"))
{ int i = 0;
return i/i;
}
if (s.equals("tablica"))
{ int t[] =new int[5] ;
return t[6];
}
return 0;
}
finally
{ System.out.println("\n[wygeneruj(\"" + s +"\") zakonczone]");
}
}
}
A. Poniecki: Języki Programowania, 2012 57
Klasy wbudowane - rozszerzenia
żð Termin rozszerzenie klasy oznacza stworzenie na jej podstawie podklasy i
ewentualnie dodanie nowych elementów
żð Java dysponuje olbrzymiÄ… bibliotekÄ… wbudowanych klas
żð Wszystkie klasy, z wyjÄ…tkiem klas zdefiniowanych jako final można
rozszerzać
żð aby napisać aplet tworzy siÄ™ podklasÄ™ wbudowanej klasy Applet, która
zawiera metody:
żð wizualizacji apletu w przeglÄ…darce stron www
żð uruchamiania i zatrzymywania apletu gdy okno przeglÄ…darki jest odÅ›wieżane
żð pisania i rysowania w obszarze apletu, korzystania z przycisków i menu
żð aby zbudować w swojej aplikacji graficzny interfejs użytkownika (GUI 
Graphical User Interface) korzysta siÄ™ z klas
żð Graphics, Event, Menu, Color, Window, Button, ...
które są umieszczone w pakiecie java.awt
R. Pełka: Języki Programowania, 2008 58
Pakiety
żð Najbardziej przydatne pakiety
żð Klasy jÄ™zyka Java sÄ… zebrane
żð java.lang
i udostępniane w pakietach
żð zawiera klasy elementów jÄ™zyka
(packages)
żð Obiekt, System, Math, String, ...
żð System pakietów ma budowÄ™
żð java.applet
hierarchicznÄ…
żð java.io
żð java.awt żð operacje wejÅ›cia/wyjÅ›cia
żð java.util
żð java.awt.color
żð collections
żð java.awt.image
żð formatowane wejÅ›cie (Scanner),
żð java.awt.image.renderable
data, czas, itp..
żð java.awt.font
żð java.net
żð komunikacja, usÅ‚ugi sieciowe
żð java.awt
żð Abstract Windowing Toolkit.
Narzędzia do komunikacji z
użytkownikiem (GUI)
R. Pełka: Języki Programowania, 2008 59
Dokumentacja pakietów
Sun Microsystems dostarcza szczegółową dokumentację
pakietów i zawartych w nich klas w API documentation.
Pliki można otwierać w oknie przeglądarki
R. Pełka: Języki Programowania, 2008 60
Korzystanie z pakietów
żð Korzystanie z klas zdefiniowanych w pakietach polega na podaniu w
programie pełnej hierarchii nazw z interesującą nas klasą na końcu
żð java.awt.Graphics
żð java.awt.event.MouseAdapter
żð Można też  otworzyć pakiet i korzystać z zawartych w nim klas
żð import java.awt.Graphics;
żð Aby otworzyć wszystkie klasy pakietu stosuje siÄ™ wildcards:
żð import java.awt.*;
żð import javax.swing.*;
żð Linia importowania pakietu (import) musi
znajdować się na początku klasy
Przykład:
żð Samo użycie linii import niczego nie
importuje. Jest to tylko informacja dla import java.awt.color.*;
kompilatora, by po natrafieniu na import java.io.*;
nieznany identyfikator szukał definicji
class MyClass{...}
we wskazanym pakiecie
R. Pełka: Języki Programowania, 2008 61
Scanner  java.util
żð Scanner otwiera strumieÅ„
wejściowy z pliku lub
terminala
żð MetodÄ… next( ) Scanner
wczytuje kolejne słowo z
wejścia
żð MetodÄ… nextint( ) wczytuje
nastepny int
żð Scaner znalazÅ‚ coÅ› innego,
sygnalizowany jest błąd
R. Pełka: Języki Programowania, 2008 62
Klasa Applet
żð PrzeglÄ…darka WWW korzysta z klasy Applet
żð tworzy aplet
new Applet(...)
żð inicjuje aplet metodÄ…
init( )
żð uruchamia go
start( )
żð po przeÅ‚Ä…czeniu na inna stronÄ™ wyÅ‚Ä…cza aplet
stop( )
żð po powrocie do strony wÅ‚Ä…cza znowu aplet
start( )
żð Za każdym razem gdy trzeba narysować aplet na ekranie
żð przy starcie
żð przy każdej zmianie wielkoÅ›ci lub pozycji okna
wołana jest metoda
paint( )
z sygnaturÄ… void paint(Graphics g)
żð Programowanie apletu polega na modyfikacji (redefinicji)
metod
R. Pełka: Języki Programowania, 2008 63
WÅ‚asny Aplecik
Metody (paint, init, start, stop, destroy) będą wywołane na zewnątrz
przez przeglÄ…darkÄ™
żð klasy i metody przeglÄ…darki muszÄ… być typu public
żð Rozszerzamy klasÄ™
import java.applet.Applet;
żð java.applet.Applet
import java.awt.*;
żð Redefiniujemy
żð paint()
public class Aplecik extends Applet
żð Używamy klasy
{
żð java.awt.Graphics
public void paint(Graphics g){
żð java.awt.Color
g.drawLine(50,50,200,300);
g.drawString("poczatek ...",50,50);
g.setColor(Color.blue);
g.drawString("...koniec",200,300);
g.drawOval(100,100,50,80);
}
}
R. Pełka: Języki Programowania, 2008 64
BlueJ
R. Pełka: Języki Programowania, 2008 65
Aplecik na stronie WWW
żð Dodanie apletu do strony
WWW w kodzie HTML
żð MiÄ™dzy znacznikami:

żð Ważniejsze parametry:
code, width, height
żð Kod apletu w Aplecik.class
R. Pełka: Języki Programowania, 2008 66
Aplecik w przeglÄ…darce
To tylko mały aplecik
Cóż, dosyć ładnie ...
R. Pełka: Języki Programowania, 2008 67
Text w apletach
import java.awt.*;
import java.applet.*;
public class Czcionki extends Applet
{
Font serif;
Font sansSerif;
Color colorrgb = null;
public void init()
{
serif= new Font("Serif", Font.BOLD, 28);
dialog= new Font("Dialog", Font.BOLD, 28);
}
public void paint(Graphics g)
{
g.setFont(serif);
g.drawString("Czcionka Serif pogrubiona", 50, 40 );
g.setColor(Color.blue);
g.setFont(dialog);
g.drawString("Czcionka Dialog w kolorze niebieskim", 50, 160 );
}
}
A. Poniecki: Języki Programowania, 2012 68
Obsługa zdarzeń
Zdarzenia wiążą się z obsługą urządzeń wejściowych. Są nimi obiekty informujące
o dokonanej określonej akcji. Informacja taka trafia do obiektu określanego
mianem odbiorcy (listener).
Dla myszki: - zdarzenia to MouseEvent
- interfejs to MouseListener
- rejestracja zdarzenia po wywołaniu metody: addMouseListener
Dla innych urządzeń w miejsce wyrazu Mouse należy umieścić właściwe określenie.
Metody:
mouseClicked(MouseEvent e) - wywoływana po kliknięciu przyciskiem
mousePressed(MouseEvent e) - wywoływana po wciśnięciu przycisku
mouseReleased(MouseEvent e) - wywoływana po zwolnieniu przycisku
mouseEntered(MouseEvent e) - wywoływana po najechaniu kursorem na obszar
komponentu
mouseExited(MouseEvent e) - wywoływana po opuszczeniu przez kursor obszaru
komponentu
A. Poniecki: Języki Programowania, 2012 69
Obsługa zdarzeń cd.
Program odbiera akcjÄ™ zwolnienia klawiszy myszki, co
powoduje narysowanie punktu oraz pobranie i wypisanie
jego współrzędnych.
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class Myszka extends Applet implements MouseListener
{
Point p;
String wsp="";
public void init()
{
addMouseListener(this);
}
A. Poniecki: Języki Programowania, 2012 70
Obsługa zdarzeń cd.
public void paint(Graphics g)
{
//g.drawLine(p.x, p.y, p.x, p.y);
g.drawOval(p.x, p.y, 10, 5);
g.fillOval(p.x, p.y, 10, 5);
g.drawString(wsp, 20, 20);
}
public void mouseClicked(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e)
{
p = e.getPoint();
wsp = "x = " + p.x + " y = " + p.y;
repaint();
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
}
A. Poniecki: Języki Programowania, 2012 71
Dzwięki
Obsługiwane są pliki o różnych rozszerzeniach (midi, wave, au, aiff, & ).
import java.applet.*;
public class Muza extends Applet
{
public void start()
{
play (getDocumentBase(), "muzyka.mid");
}
}
A. Poniecki: Języki Programowania, 2012 72
Dzwięki cd.
import java.applet.*;
public class Muza2 extends Applet
{ AudioClip muzyczka;
public void init() //wymagana ścieżka dostępu do pliku
{
muzyczka = getAudioClip(getDocumentBase(), "muzyka.mid");
}
public void start()
{
muzyczka.loop(); //wykonywanie w pętli
}
public void stop()
{
muzyczka.stop(); //zakończenie odtwarzania
}
}
A. Poniecki: Języki Programowania, 2012 73


Wyszukiwarka

Podobne podstrony:
JP SS 7 Klasy i obiekty
klasy i obiekty cz1 5
JP SS 2 algorytmy i podstawy programowania
JP SS 5 podstawy Java
JP SS 4 start Java
klasy i obiekty cz1 7
18 klasy i obiekty
klasy i obiekty cz1 0
klasy i obiekty cz2 0
JP SS 5 podstawy Java (3)
klasy i obiekty cz2 1
JP SS Interfejs graficzny
klasy i obiekty cz1 6
klasy i obiekty cz1 2
JAVA 09 klasy i obiekty(2)
JP SS 1 podstawy JP
JP SS 4 wprowadzenie Java
JP SS 1 podstawy JP

więcej podobnych podstron