1
Języki Programowania
Klasy i obiekty w języku Java
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
2
3
Obiekty i klasy
Każda klasa może być opisana
przez podanie
konstruktora
zbiór metod zdefiniowanych
wewnątrz klasy
Konstruktor tworzy nowy obiekt
danej klasy
Metody powodują wykonanie
określonej czynności
Malarz
Konstruktor:
Malarz()
Metody:
void rysujDom()
void rysujPortret(string)
void kasujPiksel()
void zmienKolor()
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
3
5
Konto bankowe jako klasa
Klasa
Konto
zawiera trzy pola (
fields
)
określające numer konta, właściciela i
stan konta
Każdy obiekt utworzony przez tę klasę
ma swoje własne pola odpowiadające
polom klasy, w których obiekty
przechowują swoje wartości pól
Przykłady trzech obiektów klasy
Konto
:
class
Konto
{
int
numer;
String
wlasciciel;
int
stanKonta;
}
Ć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 sprawdź, że:
int numer = 0
,
String wlasciciel = <null>
,
int stanKonta = 0
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ą
<null>
4
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 (wskaźnikiem) 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:
“Imie Nazwisko”
name1
num1 52
8
Przypisanie =
Operacja przypisania
kopiuje
wartość podaną z prawej
strony przypisania do miejsca wskazanego z lewej
strony
Dla typów prymitywnych
num1 38
num2 96
przed
num2 = num1;
num1 38
num2 38
po
5
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
(
!!!
)
name2 = name1;
name1
name2
przed
:
„Kamil Wozniak"
„Piotr Wozniak"
name1
name2
po
:
„Kamil Wozniak"
10
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
6
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
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
7
13
Metody zwracające wynik
Metoda
podajStanKonta
zwraca wynik typu
int
będący
wartością pola
stanKonta
int
podajStanKonta
( )
{
return
stanKonta;
}
Typ zwracanego
wyniku
Nazwa metody
Lista parametrów
(tutaj pusta)
Zwróć jako wynik
(rezultat) ...
Wartość pola
stanKonta
14
Metody z parametrem
Metoda
wplata
wymaga podania argumentu (parametru) typu
int
będącego wartością kwoty wpłaty
void
wplata
(int kwota)
{
stanKonta
+=
kwota;
}
Typ zwracanego
wyniku (brak)
Nazwa metody
Parametr typu
int
Stan konta
zwiększ o ...
kwotę
8
15
Sygnatura metody
Nagłówek metody nazywany jest również
sygnaturą
. Dla sygnatury
istotny jest tylko typ zwracanej wartości i typy parametrów
void
wplata
(int kwota)
{
stanKonta
+=
kwota;
}
int
podajStanKonta
( )
{
return
stanKonta;
}
void
przelew
(Konto odbiorca, int kwota)
{
//
... Zajmiemy sie tym później
;
}
void (int)
int ( )
void (Konto, int)
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
9
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.
18
Przelewy
void
przelew
(
Konto
odbiorca,
int
kwota)
{
wyplata(kwota);
odbiorca.wplata(kwota);
}
Aby dokonać przelewu metoda
przelew
musi otrzymać dwa parametry:
• konto odbiorcy
• kwotę przelewu
Podczas
wywołania
metody
parametry formalne
metody otrzymują wartości
parametrów aktualnych
przelew
(
konto7
,325)
wyplata
(325);
konto7
.wplata(325);
Wywołanie:
Powoduje wywołanie
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.
Sprawdź jak to działa w BlueJ
10
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 = <null>
Za metodę Konstruktor odpowiada klasa
Konstruktor obiektów danej klasy (np.
Konto
) ma taką samą
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
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ść
<null>
Domyślny konstruktor
klasy
Konto
Konto( )
{
}
20
Ulepszony konstruktor
Konto
(
int
nowyNumer,
String
nazwisko){
numer
= nowyNumer;
wlasciciel
= nazwisko;
stanKonta
= 0;
}
new
Konto
(
569123666
,
”Kowalski”
)
Definicja konstruktora
Wywołanie konstruktora
Efekt
Nowy obiekt ma
numer i właściciela
zgodnie z
parametrami
aktualnymi wywołania
konstruktora
11
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
22
Ochrona danych
Konto
Pole:
int
numer
String
wlasciciel
int
stanKonta
Konstruktor:
Konto()
Konto(
int,String
)
Metoda:
int
podajStanKonta()
void
wplata(
int
)
void
wyplata(
int
)
void
przelew(
Konto,int
)
....
Użytkownik klasy
Konto
powinien mieć
dostęp do danych obiektu tej klasy tylko
przez metody
Można ochronić wybrane pola przed
dostępem z zewnątrz za pomocą słowa
kluczowego
private
12
23
Ochrona danych
cd.
Chronimy pola
wlasciciel
i
stanKonta
Użytkownik obiektu nie może
odczytać lub zmienić tych pól
inaczej jak tylko przez dostępne
metody
int podajStanKonta()
String podajWlasciciela()
wplata()
wyplata()
przelew()
zauważmy, że można odczytać
pole
wlasciciel
, ale nie można go
zmienić
Jeśli bank chce później np.:
wprowadzić opłaty od operacji
drukować protokoły i wyciągi
Musi zmodyfikować potrzebne
metody i ma pewność
bezpieczeństwa transakcji
// pola obiektu
int
numer;
private
String wlasciciel;
private
int
stanKonta;
// metody obiektu
public
int
podajStanKonta(){
return
stanKonta;
}
public
String podajWlasciciela(){
return
wlasciciel;
}
public
void
wplata(
int
kwota){
stanKonta += kwota;
}
dostępne z
zewnątrz obiektu
24
getters & setters
Projektując klasę zaleca się
deklarować wszystkie dane w
polach
private
Dostęp do danych z zewnątrz
powinien odbywać się tylko przez
metody
public
Przejrzystość zapewnia podział
metod na dwie grupy:
setter
– do ustawiania wartości pól
getter
– do odczytu wartości pól
zaleca się by nazwy metod
zaczynały się odpowiednio od
get
lub
set
(wcześniej tego nie
przestrzegaliśmy pisząc np.
podajStanKonta)
Date
Fields:
private int
day
private int
month
private int
year
Constructors:
Date()
Date(
int,int,int
)
Methods:
getter
public int
getDay()
public int
getMonth()
public int
getYear()
setter
public void
setDay()
public void
setMonth()
public void
setYear()
13
25
Pola statyczne
pola klasy są
oznaczone słowem
kluczowym
static
pola klasy i obiektu
będą wstępnie
inicjowane
class
Konto{
// pola klasy
static
int
stopaProcentowa = 4;
static
int
licznikKont;
// pola obiektu
int
numer;
String wlasciciel =
”Pan Dyrektor”;
int
stanKonta = 0;
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
26
Autoinkrementacja x++
class
Konto{
// pola klasy
static
int
stopaProcentowa = 4;
static
int
licznikKont;
// konstruktor
Konto(String nowyKlient){
wlasciciel = nowyKlient;
stanKonta = 0;
numer = licznikKont;
licznikKont++;
}
// pola obiektu
int
numer;
String wlasciciel;
int
stanKonta;
// metody obiektu
...
Każde pole
xyz
typu
int
może
być autoinkrementowane
xyz++ ;
co powoduje zwiększenie
wartości pola o 1
Zwiększ aktualny numer konta
(który będzie przydzielony
następnemu klientowi) o 1
14
27
Metody statyczne
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
class
Konto{
static
stopaProcentowa = 3;
static
int
getStopaProcentowa()
{
return stopaProcentowa();
}
}
28
Wywoływanie metod
Jeśli chcemy wywołać metodę obiektu, musimy najpierw utworzyć obiekt
określonej klasy, a następnie wywołać metodę:
obiekty
slonce
sciana
Jeśli chcemy wywołać metodę klasy (metodę
statyczną
), przy wywołaniu
zamiast nazwy obiektu podajemy nazwę klasy
klasa
Konto
Square sciana = new Square();
Circle slonce = new Circle()
...
slonce.changeColor(
”yellow”);
sciana.moveHorizontal(50);
Konto
.getStopaProcentowa();
15
29
Komentarze
Java stosuje trzy rodzaje komentarzy programu źró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óźniejsze 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
30
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
16
31
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 – sprawdź!
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?
32
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()
);
17
33
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( )
…
34
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()
18
35
Klasa
String
(cd.)
36
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
)
public
class
MojaAplikacja
{
public static
void
main(String[] args){
AlgorytmAplikacji.zrobSwoje();
System.out.println("Podane argumenty");
for (
int
k=0; k<args.length; k++)
System.out.print(args[k]+" ");
}
}
public
class
AlgorytmAplikacji
{
public static
void
zrobSwoje(){
System.out.println("Pozdrowienia od algorytmu");
}
// zapis właściwej treści algorytmu aplikacji
}
Główna klasa aplikacji musi
zawierać metodę
main
o
sygnaturze podanej w
przykładzie
args
oznacza tablicę
stringów, do której trafią
argumenty aplikacji podane
przy jej uruchomieniu
19
37
Aplikacje w JDK
Tworzenie i uruchamianie aplikacji w środowisku
JDK
przebiega w
następujących etapach:
Utworzenie kodów źró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
38
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 !!!
20
39
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
40
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 źró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
21
41
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
42
Klasa
Konto
22
43
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
44
Podklasy
Przy pomocy słowa kluczowego
extends
klasa dziedziczy cechy
innej klasy:
class
LokataKonto
extends
Konto{
...
static
int stopaProcLokaty = 3;
int
ostatniDzienNaliczOdsetek;
int
getStopaProcLokaty
(){
return
stopaProcLokaty;
}
void
naliczOdsetki
(){
...
class
DebetKonto
extends
Konto{
...
static
int stopaProcKredytu = 13;
int
ostatniDzienOkresuRach;
int
limit=10000;
int
getLimit
(){
return
limit;
}
void
naliczKosztKredytu
(){
...
23
45
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;
}
...
}
46
Dostęp do nadklasy
pola
private
są chronione
niedostępne również z podklas
muszą wystarczyć metody
getter
i
setter
pola
protected
dostępne z podklasy
niedostępne z innych klas
niechronione pola
dostępne ze wszystkich klas
całego pakietu
niedostępne z klas innych
pakietów
są prywatne dla pakietu
Konto
Pole:
static
protected
int
stopaProc
protected
int
stanKonta
String
wlasciciel
private int
numer
Metoda:
getter
public int
getStanKonta()
public int
getWlasciciel()
public int
getNumer()
public boolean
czyRokPrzest()
setter
public void
wplata(
int
)
public void
przelew(Konto,
int
)
public void
wyplata(
int
)
...
24
47
Dostęp z podklasy
Konto
Pole:
static
protected
int
stopaProc
protected
int
stanKonta
String
wlasciciel
private int
numer
Metoda:
getter
public int
getStanKonta()
public int
getWlasciciel()
public int
getNumer()
public boolean
czyRokPrzest()
setter
public void
wplata(
int
)
public void
przelew(Konto,
int
)
public void
wyplata(
int
)
...
class
LokataKonto
extends
Konto{
void
naliczOdsetki
(){
wplata(
stanKonta * stopaProc
);
} //
OK
void
drukujWyciag
(){
System.out.println(
wlasciciel
);
//OK.
System.out.println(numer);
// błąd!
System.out.println(stanKonta);
//OK.
}
...
48
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 znaleźć 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;
}
25
49
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
50
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
26
51
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
52
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
27
53
Pakiety
Klasy języka Java są zebrane
i udostępniane w pakietach
(
packages
)
System pakietów ma budowę
hierarchiczną
java.awt
java.awt.color
java.awt.image
java.awt.image.renderable
java.awt.font
Najbardziej przydatne pakiety
java.lang
zawiera klasy elementów języka
Obiekt, System, Math, String, ...
java.applet
java.io
operacje wejścia/wyjścia
java.util
collections
formatowane wejście (Scanner),
data, czas, itp..
java.net
komunikacja, usługi sieciowe
java.awt
Abstract Windowing Toolkit
.
Narzędzia do komunikacji z
użytkownikiem (GUI)
54
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
28
55
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
Samo użycie linii
import
niczego nie
importuje. Jest to tylko informacja dla
kompilatora, by po natrafieniu na
nieznany identyfikator szukał definicji
we wskazanym pakiecie
Przykład:
import
java.awt.color.*;
import
java.io.*;
class
MyClass{...}
56
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
29
57
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
58
Własny Aplecik
import
java.applet.Applet
;
import
java.awt.*
;
public
class Aplecik
extends
Applet
{
public
void
paint(Graphics g){
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);
}
}
Rozszerzamy klasę
java.applet.Applet
Redefiniujemy
paint()
Używamy klasy
java.awt.Graphics
java.awt.Color
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
30
59
BlueJ
60
Aplecik na stronie WWW
Dodanie apletu do strony
WWW w kodzie HTML
Między znacznikami:
<Applet></Applet>
Ważniejsze parametry:
code, width, height
Kod apletu w
Aplecik.class
31
61
Aplecik w przeglądarce
To tylko mały aplecik
Cóż, dosyć ładnie ...