Języki Programowania
Klasy i obiekty.
R. Pełka: Języki Programowania, 2008
2
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
3
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
4
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()
R. Pełka: Języki Programowania, 2008
5
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
6
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
R. Pełka: Języki Programowania, 2008
7
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>
R. Pełka: Języki Programowania, 2008
8
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:
“Steve Jobs”
name1
num1 52
R. Pełka: Języki Programowania, 2008
9
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
R. Pełka: Języki Programowania, 2008
10
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
:
"Steve Jobs"
"Steve Wozniak"
name1
name2
po
:
"Steve Jobs"
R. Pełka: Języki Programowania, 2008
11
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
12
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
13
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
14
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
R. Pełka: Języki Programowania, 2008
15
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ę
R. Pełka: Języki Programowania, 2008
16
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)
R. Pełka: Języki Programowania, 2008
17
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
18
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
19
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
R. Pełka: Języki Programowania, 2008
20
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( )
{
}
R. Pełka: Języki Programowania, 2008
21
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
R. Pełka: Języki Programowania, 2008
22
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
23
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
R. Pełka: Języki Programowania, 2008
24
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
R. Pełka: Języki Programowania, 2008
25
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()
R. Pełka: Języki Programowania, 2008
26
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
R. Pełka: Języki Programowania, 2008
27
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
R. Pełka: Języki Programowania, 2008
28
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
R. Pełka: Języki Programowania, 2008
29
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();
}
}
R. Pełka: Języki Programowania, 2008
30
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();
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);
}
}
31
A. Poniecki
: Języki Programowania, 2012
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;
}
}
32
Wywoływanie metod cd.
A. Poniecki
: Języki Programowania, 2012
R. Pełka: Języki Programowania, 2008
33
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
34
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?
R. Pełka: Języki Programowania, 2008
35
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
36
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
37
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
38
Klasa
String
(cd.)
R. Pełka: Języki Programowania, 2008
39
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
R. Pełka: Języki Programowania, 2008
40
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
R. Pełka: Języki Programowania, 2008
41
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
42
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
43
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
R. Pełka: Języki Programowania, 2008
44
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
45
Klasa
Konto
R. Pełka: Języki Programowania, 2008
46
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
47
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
(){
...
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
Podklasy cd.
R. Pełka: Języki Programowania, 2008
49
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
50
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
)
...
R. Pełka: Języki Programowania, 2008
51
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.
}
...
R. Pełka: Języki Programowania, 2008
52
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;
}
R. Pełka: Języki Programowania, 2008
53
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
54
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
55
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
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();
}
56
Obsługa wyjątków
A. Poniecki
: Języki Programowania, 2012
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]");
}
}
}
57
Obsługa wyjątków cd.
A. Poniecki
: Języki Programowania, 2012
R. Pełka: Języki Programowania, 2008
58
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
59
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)
R. Pełka: Języki Programowania, 2008
60
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
61
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{...}
R. Pełka: Języki Programowania, 2008
62
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
63
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
64
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
R. Pełka: Języki Programowania, 2008
65
BlueJ
R. Pełka: Języki Programowania, 2008
66
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
R. Pełka: Języki Programowania, 2008
67
Aplecik w przeglądarce
To tylko mały aplecik
Cóż, dosyć ładnie ...
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 );
}
}
68
Text w apletach
A. Poniecki
: Języki Programowania, 2012
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
69
Obsługa zdarzeń
A. Poniecki
: Języki Programowania, 2012
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);
}
70
Obsługa zdarzeń cd.
A. Poniecki
: Języki Programowania, 2012
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){}
}
71
Obsługa zdarzeń cd.
A. Poniecki
: Języki Programowania, 2012
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");
}
}
72
Dźwięki
A. Poniecki
: Języki Programowania, 2012
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
}
}
73
A. Poniecki
: Języki Programowania, 2012
Dźwięki cd.