JP SS 7 Klasy i obiekty


Języki Programowania
Klasy i obiekty w języku Java
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
2
1
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()
3
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
4
2
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
5
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Ä…
6
3
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
 Imie Nazwisko
name1
7
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
8
4
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
(!!!)
 Kamil Wozniak"
name1
przed:
 Piotr Wozniak"
name2
name2 = name1;
 Kamil Wozniak"
name1
po:
name2
9
Aliasy (aliases)
żð Dwie lub wiÄ™cej referencji do tego samego obiektu sÄ…
nazywane aliasami
żð 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
10
5
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
11
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
12
6
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) ...
13
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
14
7
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;
}
15
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
16
8
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.
17
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
18
9
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ść
19
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
20
10
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
21
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)
....
22
11
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
23
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()
24
12
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{
// pola klasy oznaczone słowem
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;
25
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
...
26
13
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
27
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
28
14
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
29
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
30
15
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?
31
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());
32
16
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( )
żð &
33
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()
34
17
Klasa String (cd.)
35
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
}
36
18
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
37
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 !!!
38
19
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
39
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
40
20
Dziedziczenie - interitance
żð 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
41
Klasa Konto
42
21
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
43
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(){
...
44
22
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
class LokataKonto extends Konto{
// przejmujemy konstruktora
// z nadklasy
LokataKonto(String x){
super(x);
ostatniDzienNaliczOdsetek = 0;
}
...
}
45
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)
...
46
23
Dostęp z podklasy
Konto
Pole:
static protected int stopaProc
class LokataKonto extends Konto{
protected int stanKonta
String wlasciciel void naliczOdsetki(){
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)
...
47
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;
}
48
24
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
49
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
50
25
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
51
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
52
26
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)
53
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
54
27
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 MyClass{...}
class
we wskazanym pakiecie
55
Scanner  java.util
żð Scanner otwiera strumieÅ„
wejściowy z pliku lub
termianla
żð MetodÄ… next( ) Scanner
wczytuje kolejne słowo z
wejścia
żð MetodÄ… nextint( ) wczytuje
nastepny int
żð Scaner znalazÅ‚ coÅ› innego,
sygnalizowany jest błąd
56
28
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
57
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);
}
}
58
29
BlueJ
59
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
60
30
Aplecik w przeglÄ…darce
To tylko mały aplecik
Cóż, dosyć ładnie ...
61
31


Wyszukiwarka