Język Java – część 1 (streszczenie)

Transkrypt

Język Java – część 1 (streszczenie)
Programowanie współbieĪne
JĊzyk Java – czĊĞü 1
(streszczenie)
Paweł RogaliĔski
Instytut Informatyki, Automatyki i Robotyki
Politechniki Wrocławskiej
pawel.rogalinski @ pwr.wroc.pl
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
1 / 81
Podstawowe elementy jĊzyka
¾ Komentarze
¾ słowa kluczowe
¾ Identyfikatory
¾ Typy danych
¾ Operatory
¾ Instrukcje
¾ Klasy i obiekty
¾ Kompozycja i dziedziczenie klas
¾ Klasy abstrakcyjne
¾ Interfejsy
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
2 / 81
Komentarze w Javie
Komentarz wierszowy
// Program wypisujący tekst powitania
Komentarz blokowy
/* Program wypisujący tekst powitania
Warszawa, 13 listopada 2002 r.
*/
Komentarz dokumentacyjny
/**
* Klasa rysująca wykres. Typ wykresu
* zaleĪy od naciĞniĊtego przycisku.
* @version 1.0
*/
class Wykres {...
JĊzyka Java cz. 1
3 / 81
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
Słowa kluczowe
Słowa kluczowe to słowa, które mają specjalne znaczenie (np. oznaczają instrukcje
sterujące) i nie mogą byü uĪywane w innym kontekĞcie niĪ okreĞla składnia jĊzyka.
abstract
assert
boolean
break
byte
case
catch
char
class
const
continue
default
do
double
else
extends
false
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
static
strictfp
super
switch
synchronized
this
throw
throws
transient
true
try
void
volatile
while
Uwagi:
¾ słowa kluczowe goto i const, są zarezerwowane ale nie są uĪywane.
¾ słowa boolean, byte, char, double, float, int, long, short
są nazwami typów podstawowych.
¾ słowa true, false i null są nazwami stałych.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
4 / 81
Identyfikatory
Identyfikatory to tworzone przez programistĊ nazwy klas, pól i metod klasy
oraz stałych i zmiennych.
Identyfikator musi zaczynaü siĊ od litery lub podkreĞlenia i moĪe składaü siĊ
z dowolnych znaków alfanumerycznych (liter i cyfr) oraz znaków podkreĞlenia.
Java rozróĪnia wielkie i małe litery w identyfikatorach
Identyfikator nie moĪe pokrywaü siĊ ze słowami kluczowymi.
Zalecenia:
¾ Nazwy klas: wszystkie słowa w nazwie rozpoczynaü duĪą literą,
np.: ObiektGraficzny
¾ Nazwy metod i pól publicznych: pierwsze słowo rozpoczynaü małą literą,
a kolejne wyrazy duĪą literą, np.: rysujTlo, kolorWypelnienia.
¾ Nazwy metod i pól prywatnych: pisaü wyłącznie małymi literami,
a wyrazy łączyü podkreĞleniem, np.: kierunek_ruchu.
¾ Nazwy zmiennych niemodyfikowalnych (stałych): pisaü wyłącznie duĪymi literami,
a wyrazy łączyü podkreĞleniem, np.: ROZMIAR_TABLICY.
JĊzyka Java cz. 1
5 / 81
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
Typy danych
Typ danej to zbiór jej moĪliwych wartoĞci oraz zestaw operacji, które moĪna na nich
wykonywaü.
JednoczeĞnie
okreĞla
on
rozmiar
pamiĊci
potrzebny
do
przechowywania danej oraz sposób zapisu danej w pamiĊci komputera.
JĊzyk Java zawiera nastĊpujące typy danych:
¾ typy podstawowe:
– typy całkowite: byte, short, int, long,
– typy rzeczywiste: float, double,
– typ znakowy: char,
– typ logiczny: boolean,
¾ typ wyliczeniowy
¾ typ referencyjny – nazwy typu referencyjnego pochodzą od nazwy klasy lub
interfejsu. WartoĞcią zmiennej typu referencyjnego jest referencja (odniesienie) do
obiektu.
Dane w programie przedstawiamy za pomocą literałów, zmiennych oraz stałych.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
6 / 81
Typy podstawowe
Typy podstawowe reprezentują pojedyncze wartoĞci – nie są one złoĪonymi obiektami.
Zapewnia to bardzo duĪą wydajnoĞü przy wykonywaniu obliczeĔ.
Rozmiar i zakres wartoĞci typów podstawowych
nazwa
typu
zajĊtoĞü
pamiĊci
zakres wartoĞci
wartoĞü
domyĞlna
znaczenie
byte
1
od -128 do 127
0
short
2
od -32768 do 32767
0
int
4
od ok. -2×10 do ok. 2×10
long
8
od ok. -9×1018 do ok. 9×1018
float
4
od ok. -3.4×1038 do ok. 3.4×1038
0.0F
double
8
od ok. -1.7×10308 do ok. 1.7×10308
0.0D
char
2
od 0 do 65535
‘x0’
znaki unicode
boolean
1
false,true
false
wartoĞci logiczne
JĊzyka Java cz. 1
9
9
0
liczby całkowite
0
liczby rzeczywiste
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
7 / 81
Typy wyliczeniowe
¾ Wyliczenia tworzy siĊ za pomocą słowa kluczowego enum, np.:
enum Kolor
{ Zielony, Zolty, Czerwony
}
¾ Identyfikatory Zielony, Zolty, Czerwony nazywany stałymi wyliczeniowymi.
Są one publicznymi statycznymi składowymi wyliczenia i posiadają
taki sam typ jak wyliczenie
¾ W programie moĪna deklarowaü zmienne wyliczeniowe, którym moĪna
przypisywaü stałe wyliczenia, np.:
Kolor kol;
kol = Kolor.Zielony.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
8 / 81
Operatory
Operatory są to specjalne symbole stosowane do wykonywania działaĔ arytmetycznych,
przypisaĔ, porównaĔ i innych operacji na danych.
Dane, na których są wykonywane operacje są nazywane argumentami. Operatory są
jedno, dwu lub trzyargumentowe.
Uwaga: Niektóre operatory mogą byü stosowane zarówno jako
jednoargumentowe jak i dwuargumentowe np. + .
KaĪdy operator moĪe byü stosowany wyłącznie do danych okreĞlonego typu.
Wynik działania operatora jest okreĞlonego typu.
Uwaga: Dla niektórych operatorów typ wyniku zaleĪy od typu argumentów.
WyraĪenia tworzy siĊ za pomocą operatorów i nawiasów ze zmiennych, stałych,
literałów oraz wywołaĔ metod. WyraĪenia są opracowywane (wyliczane),
a ich wyniki mogą byü w róĪny sposób wykorzystane np. w przypisaniach, jako
argumenty innych operatorów, w instrukcjach sterujących wykonaniem programu,
w wywołaniach metod, itd.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
9 / 81
Operatory cd.
KolejnoĞü opracowywania (wyliczania) wyraĪeĔ zaleĪy od priorytetów i wiązaĔ
operatorów uĪytych w tych wyraĪeniach.
Priorytety mówią o tym, w jakiej kolejnoĞci bĊdą wykonywane róĪne operacje w tym
samym
wyraĪeniu.
Przykład: W wyraĪeniu a+b*c najpierw bĊdzie wykonane mnoĪenie, a potem
dodawanie poniewaĪ operator * ma wyĪszy priorytet niĪ operator +.
ĩeby odwróciü kolejnoĞü wykonywania działaĔ trzeba uĪyü nawiasów: (a+b)*c
Wiązania okreĞlają kolejnoĞü wykonywania operacji o tym samym priorytecie tzn. czy są
one wykonywane od lewej strony wyraĪenia czy od prawej.
Przykład: W wyraĪeniu a-b+c najpierw bĊdzie wykonane odejmowanie,
a potem dodawanie bo wiązanie operatorów + i – jest lewostronne.
ĩeby odwróciü kolejnoĞü wykonywania działaĔ trzeba uĪyü nawiasów: a-(b+c)
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
10 / 81
Zestawienie operatorów dostĊpnych w Javie
lewe
wiązanie i
priorytet
1
2
operator
sposób uĪycia
działanie
.
[ ]
( )
++
obiekt.składowa
tablica[wyraĪenie]
metoda(lista wyraĪeĔ)
zmienna++
++zmienna
zmienna---zmienna
+wyraĪenie
-wyraĪenie
!wyraĪenie
~wyraĪenie
(typ)wyraĪenie
new typ
wyraĪenie*wyraĪenie
wyraĪenie/wyraĪenie
wyraĪenie%wyraĪenie
wybór składowej klasy
indeks tablicy
wywołanie metody
przyrostkowe / przedrostkowe
zwiĊkszenie o 1
przyrostkowe / przedrostkowe
zmniejszenie o 1
jednoargumentowy plus,
jednoargumentowy minus
negacja logiczna
dopełnienie bitowe
rzutowanie typu
tworzenie obiektu
mnoĪenie,
dzielenie,
modulo
lewe
prawe
--
3
+
!
~
(typ)
new
*
/
%
JĊzyka Java cz. 1
lewe
lewe
wiązanie i
priorytet
4
5
lewe
6
lewe
7
8
9
10
11
12
13
JĊzyka Java cz. 1
11 / 81
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
operator
+
sposób uĪycia
wyraĪenie+wyraĪenie
wyraĪenie-wyraĪenie
<<
wyraĪenie<<wyraĪenie
>>
wyraĪenie>>wyraĪenie
>>>
wyraĪenie>>>wyraĪenie
<
wyraĪenie<wyraĪenie
<=
wyraĪenie<=wyraĪenie
>
wyraĪenie>wyraĪenie
>=
wyraĪenie>=wyraĪenie
instanceof obiekt instanceof klasa
==
wyraĪenie==wyraĪenie
!=
wyraĪenie!=wyraĪenie
&
wyraĪenie&wyraĪenie
^
wyraĪenie^wyraĪenie
|
wyraĪenie|wyraĪenie
&&
wyraĪenie&&wyraĪenie
||
wyraĪenie||wyraĪenie
? :
wyraĪ ? wyraĪ : wyraĪ
działanie
dodawanie,
łączenie łaĔcuchów,
odejmowanie
przesuniĊcie bitowe w lewo
przesuniĊcie bitowe w prawo
przes. bitowe w prawo bez znaku
mniejsze,
mniejsze lub równe,
wiĊksze,
wiĊksze lub równe
stwierdzenie typu obiektu
równoĞü,
nierównoĞü
bitowe AND
bitiwe OR wyłączające
bitiwe OR
logiczne AND
logiczne OR
operator warunku
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
12 / 81
wiązanie i
priorytet
prawe
14
operator
sposób uĪycia
=
*=
/=
%=
+=
-=
<<=
>>=
>>>=
zmienna=wyraĪenie
zmienna*=wyraĪenie
zmienna/=wyraĪenie
zmienna%=wyraĪenie
zmienna+=wyraĪenie
zmienna-=wyraĪenie
zmienna<<=wyraĪenie
zmienna>>=wyraĪenie
&=
^=
|=
JĊzyka Java cz. 1
zmienna>>>=wyraĪenie
zmienna&=wyraĪenie
zmienna^=wyraĪenie
zmienna|=wyraĪenie
działanie
proste przypisanie
pomnóĪ i przypisz
podziel i przypisz
oblicz modulo i przypisz
dodaj i przypisz
odejmij i przypisz
przesuĔ w lewo i przypisz
przesuĔ w prawo i przypisz
przesuĔ w prawo bez znaku i
przypisz
koniunkcja bitowa i przypisz
róĪnica bitowa i przypisz
alternatywa bitowa i przypisz
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
13 / 81
Operatory przypisania
Operator przypisania = oblicza wartoĞü wyraĪenia po prawej stronie, a nastĊpnie
przypisuje obliczoną wartoĞü do zmiennej umieszczonej po lewej stronie.
Uwaga: Działanie operatora dla typów prostych jest zgodne z intuicją.
JeĞli a i b są zmiennymi typu prostego to instrukcja a=b powoduje skopiowanie
wartoĞci zmiennej b do a. PóĨniejsza modyfikacja zmiennej b nie wpływa na
wartoĞü zmiennej a.
JeĞli zmienne a i b są typu referencyjnego (zawierają odwołanie do obiektu)
to wykonanie instrukcji a=b powoduje skopiowanie do zmiennej a referencji do
obiektu wskazywanego przez zmienną b. W efekcie zmienne a i b wskazują na
ten sam obiekt. PóĨniejsza modyfikacja obiektu wskazywanego przez b powoduje
równieĪ modyfikacjĊ obiektu wskazywanego przez a.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
14 / 81
Operator przypisania - przykład dla typów prostych
i referencyjnych
class Test
{
int p;
Test(int p){ this.p=p; }
public String toString(){ return ""+p; }
public static void main(String[] args){
System.out.println("Inicjalizacja:");
int zmA = 10;
int zmB = 15;
Test obA = new Test(10);
Test obB = new Test(15);
System.out.println("zmA = " +zmA+ "
zmB = "+zmB);
System.out.println("obA = " +obA+ "
obB = "+obB);
System.out.println("\nPrzypisanie:");
zmA = zmB;
obA = obB;
System.out.println("zmA = " +zmA+ "
zmB = "+zmB);
System.out.println("obA = " +obA+ "
obB = "+obB);
System.out.println("\nModyfikacja:");
zmB = 20;
obB.p = 20;
System.out.println("zmA = " +zmA+ "
zmB = "+zmB);
System.out.println("obA = " +obA+ "
obB = "+obB);
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
15 / 81
Operator przypisania - przykład dla typów prostych
i referencyjnych
// Inicjalizacja
int zmA = 10;
int zmB = 15;
Test obA = new Test(10);
Test obB = new Tesy(20);
// Przypisanie
zmA = zmB;
obA = obB;
zmA
obA
10
zmB
10
obB
15
zmA
15
obA
15
zmB
10
obB
15
// Modyfikacja
zmB = 20;
obB.p = 20;
zmA
obA
15
zmB
20
JĊzyka Java cz. 1
15
10
obB
20
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
16 / 81
Rodzaje instrukcji w jĊzyku Java
Instrukcja pusta – nie powodujĊ wykonania Īadnych działaĔ np. ;
Instrukcje wyraĪeniowe:
¾ przypisanie np.
a = b;
¾ preinkrementacja np.
++a;
¾ predekrementacja np.
--b;
¾ postinckrementacja np.
a++;
¾ postdekrementacja np.
b--;
¾ wywołanie metody np.
x.metoda();
¾ wyraĪenie new np.
new Para();
Uwaga: instrukcja wyraĪeniowa jest zawsze zakoĔczona Ğrednikiem.
Instrukcja grupująca – dowolne instrukcje i deklaracje zmiennych ujĊte w nawiasy
klamrowe np.
{ int a,b;
a = 2*a+b;
}
Uwaga: po zamykającym nawiasie nie stawiamy Ğrednika.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
17 / 81
Rodzaje instrukcji w jĊzyku Java cd.
Instrukcja etykietowana – identyfikator i nastĊpujący po nim dwukropek wskazujący
instrukcje sterującą switch, for, while lub do.
Instrukcja sterująca – umoĪliwia zmianĊ sekwencji
instrukcji programu. RozróĪniamy instrukcje:
¾ warunkowe:
if, if ... else, switch
¾ iteracyjne:
for, while, do ... while
¾ skoku:
break, continue, return
(kolejnoĞci) wykonania innych
Instrukcja throw – zgłaszanie wyjątku przerywającego normalny tok działania programu.
Instrukcja synchronized – wymuszanie synchronizacji przy współbieĪnym
wykonywaniu róĪnych wątków programu
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
18 / 81
Postaü instrukcji warunkowej
if
Instrukcja warunkowa if słuĪy do zapisywania decyzji, gdzie wykonanie instrukcji
jest uzaleĪnione od spełnienia jakiegoĞ warunku.
if (warunek)
{
instrukcja;
}
warunek
fałsz
prawda
instrukcja
JĊzyka Java cz. 1
19 / 81
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
Postaü instrukcji warunkowej
if - else
Instrukcja warunkowa if ... else słuĪy do zapisywania decyzji, gdzie wykonanie
jednej z alternatywnych instrukcji zaleĪy od spełnienia jakiegoĞ warunku.
JeĞli warunek jest prawdziwy to wykonywana jest instrukcja1, w przeciwnym wypadku
wykonywana jest instrukcja2.
if (warunek)
{
instrukcja1;
}
else
{
instrukcja2;
}
JĊzyka Java cz. 1
prawda
warunek
instrukcja1
fałsz
instrukcja2
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
20 / 81
Przykład - instrukcja if ... else
import javax.swing.JOptionPane;
class PrzykladIf
{
public static void main(String[] args)
{ double a, b, c, delta, x1, x2;
a = Double.parseDouble(JOptionPane.showInputDialog(null, "Podaj
b = Double.parseDouble(JOptionPane.showInputDialog(null, "Podaj
c = Double.parseDouble(JOptionPane.showInputDialog(null, "Podaj
System.out.println("\n" + a + " x^2 + " + b + " x + " + c + " =
a:"));
b:"));
c:"));
0");
if (a<0)
{ System.out.println("\n To nie jest równanie kwadratowe");
System.exit(0);
}
delta = b*b-4*a*c;
System.out.println("\n delta=" + delta);
if (delta>0){
x1 = (-b - Math.sqrt(delta))/(2*a);
x2 = (-b + Math.sqrt(delta))/(2*a);
System.out.println("\n x1=" + x1 + "
x2=" + x2);
}
else if (delta==0){
x1 = -b/(2*a);
System.out.println("\n x1=" + x1);
}
else System.out.println("\n To równanie nie ma pierwiastków");
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
Postaü instrukcji wyboru
21 / 81
switch
Instrukcja wyboru switch pozwala zapisywaü decyzje, kiedy to o wyborze jednej
z alternatyw decyduje wartoĞü skalarna jakiegoĞ wyraĪenia testowego. WyraĪenie to
musi byü typu całkowitego, znakowego lub wyliczeniowego. Jego wynik jest
porównywany z wyraĪeniami stałymi (np. literałami) wystĊpującymi po słowie kluczowym
case. W przypadku zgodnoĞci wykonywana jest odpowiednia instrukcja po dwukropku
i nastĊpujące po niej kolejne instrukcje aĪ do napotkania instrukcji break lub return.
JeĞli Īadne z wyraĪeĔ stałych po słowie case nie jest zgodne z wartoĞcią wyraĪenia
testowego to wykonywana jest instrukcja po klauzuli default.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
22 / 81
Postaü instrukcji wyboru
switch
switch (test)
{ case wartoĞü1:
instrulcje1;
break;
case wartoĞü2:
instrukcje2;
case wartoĞü3:
instrukcje3;
case wartoĞü4:
instrukcje4;
break;
case wartoĞü5:
instrukcje5;
break;
...
...
default:
instrukcje-n;
}
JĊzyka Java cz. 1
test
wartoĞü1
instrukcje1
wartoĞü2
instrukcje2
wartoĞü3
instrukcje3
wartoĞü4
instrukcje4
wartoĞü5
instrukcje5
...
inna
wartoĞü
...
instrukcje-n
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
23 / 81
Przykład – instrukcja switch
import
javax.swing.JOptionPane;
class PrzykladSwitch{
public static void main(String[] args){
double a, b;
char oper;
a=Double.parseDouble(JOptionPane.showInputDialog(null, "Podaj a"));
b=Double.parseDouble(JOptionPane.showInputDialog(null, "Podaj b"));
oper=JOptionPane.showInputDialog(null, "Podaj działanie").charAt(0);
System.out.println("a=" + a + "
b=" + b + "
oper=" + oper);
switch(oper){
case '+': System.out.println("
Suma
break;
case '-': System.out.println("Roznica
break;
case '*': System.out.println("Iloczyn
break;
case '/': System.out.println(" Iloraz
break;
default: System.out.println("Nieznana
}
System.out.println("Koniec \n");
wynosi " + (a+b));
wynosi " + (a-b));
wynosi " + (a*b));
wynosi " + (a/b));
operacja");
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
24 / 81
Postaü pĊtli
while
W nagłówku pĊtli while zapisywany jest warunek, który jest testowany przed
wykonaniem kaĪdej iteracji. Dopóki ten warunek jest prawdziwy, powtarzane jest
wykonanie instrukcji. Gdy warunek nie jest spełniony wykonanie pĊtli koĔczy siĊ.
Uwaga: JeĞli warunek nie bĊdzie spełniony juĪ na wstĊpie, to instrukcja w pĊtli while
nie bĊdzie wykonana ani razu
while (warunek)
{
instrukcja;
}
warunek
fałsz
prawda
instrukcja
JĊzyka Java cz. 1
25 / 81
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
Postaü pĊtli
do ... while
PĊtla do ... while słuĪy do zapisywania iteracji wykonywanej przynajmniej raz.
Instrukcja w pĊtli jest wykonywana, po czym sprawdzany jest warunek powtórzenia.
JeĞli warunek jest spełniony to instrukcja w pĊtli jest wykonywana ponownie.
W przeciwnym razie wykonanie pĊtli koĔczy siĊ.
Uwaga: Instrukcja w pĊtli do ... while zawsze wykona siĊ co najmniej jeden raz.
do
{
instrukcja;
}
while(warunek);
instrukcja
prawda
warunek
fałsz
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
26 / 81
Postaü pĊtli
for
W nagłówku pĊtli for podawane są: inicjalizacja,
warunek powtórzenia oraz aktualizacja. Inicjalizacja jest
wykonywana przed rozpoczĊciem wykonywania pĊtli.
inicjalizacja
Warunek jest sprawdzany przed kaĪdą iteracją i jeĞli jest
spełniony wykonywana jest instrukcja wewnątrz pĊtli
i nastĊpująca po niej aktualizacja. W przeciwnym razie
warunek
fałsz
pĊtla jest przerywana.
prawda
for(inicjalizacja; warunek; aktualizacja)
{
instrukcja;
}
JĊzyka Java cz. 1
instrukcja
aktualizacja
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
27 / 81
Porównanie instrukcji iteracyjnych
PĊtle while oraz do ...while stosujemy zwykle wtedy, gdy kontynuacja działania
pĊtli zaleĪy od jakiegoĞ warunku, a liczba iteracji nie jest z góry znana lub jest
trudna do okreĞlenia.
PĊtla for jest stosowana najczĊĞciej przy organizacji pĊtli iteracyjnych ze znanym
zakresem iteracji.
PĊtle for moĪna łatwo przekształciü na pĊtlĊ while. Ilustruje to poniĪsze zastawienie:
for (inicjalizacja; warunek; aktualizacja)
{
instrukcja;
}
JĊzyka Java cz. 1
inicjalizacja;
while(warunek)
{
instrukcja;
aktualizacja;
}
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
28 / 81
Przerywanie pĊtli – instrukcja break
Instrukcja break powoduje przerwanie wykonywania pĊtli. W przypadku pĊtli
zagnieĪdĪonych przerywana jest pĊtla wewnĊtrzna, w której bezpoĞrednio
znajduje siĊ instrukcja break.
JeĞli po instrukcji break wystĊpuje etykieta, to przerywana jest ta pĊtla lub blok
instrukcji, która jest opatrzona tą etykietą.
Uwaga: etykieta musi byü umieszczona bezpoĞrednio przed pĊtlą lub blokiem
instrukcji, które mają byü przerwane.
Instrukcja break stosowana jest równieĪ do opuszczania instrukcji switch.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
29 / 81
Kontynuowanie pĊtli – instrukcja continue
Instrukcja continue przerywa wykonywanie bieĪącego kroku pĊtli i wznawia
wykonanie kolejnej iteracji. W przypadku pĊtli zagnieĪdĪonych działanie to
dotyczy tej pĊtli wewnĊtrznej, w której jest umieszczona instrukcja continue.
JeĞli po instrukcji continue wystĊpuje etykieta, to wznawiana jest iteracja tej pĊtli,
która jest opatrzona tą etykietą.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
30 / 81
Klasy i obiekty
Java jest jĊzykiem obiektowym. JĊzyki obiektowe posługują siĊ pojĊciem obiektu i klasy.
Obiekt to konkretny lub abstrakcyjny byt, wyróĪnialny w modelowanej rzeczywistoĞci,
posiadający okreĞlone właĞciwoĞci (atrybuty) oraz mogący Ğwiadczyü okreĞlone usługi
(metody), czyli wykonywaü okreĞlone działania lub przejawiaü okreĞlone zachowania.
Obiekty współdziałają ze sobą wymieniając komunikaty, które Īądają wykonania
okreĞlonych usług (metod).
Klasa to mający nazwĊ opis pewnego rodzaju bytów posiadających takie same cechy
(byty te nazywamy obiektami lub instancjami klasy). Wspólne cechy to atrybuty (pola)
poszczególnych obiektów oraz operacje (metody), które moĪna na obiektach
wykonywaü.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
31 / 81
Klasy i obiekty cd.
Definicja klasy okreĞla:
¾ zestaw cech (atrybutów) obiektów klasy,
¾ zestaw operacji, które moĪna wykonywaü na obiektach klasy,
¾ specjalne operacje, które pozwalają na inicjowanie obiektów przy ich tworzeniu.
Wspólne cechy (atrybuty) obiektów nazywane są polami klasy.
Operacje wykonywane na obiektach nazywane są metodami.
Specjalne operacje inicjalizacji przy tworzeniu obiektów nazywane są konstruktorami.
Pola i metody (wraz z konstruktorami) nazywane są składowymi klasy.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
32 / 81
Klasy i obiekty cd.
KlasĊ przedstawia siĊ w formie prostokąta
podzielonego na trzy czĊĞci:
¾Ğrodkowa czĊĞü przedstawia atrybuty obiektów,
atrybuty
obiektów klasy
(pola klasy)
¾ dolna czĊĞü przedstawia konstruktory oraz
konstruktory
oraz
metody
obiektów
metody obiektów.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
składowe klasy
¾ górna czĊĞü zawiera nazwĊ klasy,
Nazwa klasy
33 / 81
Klasy i obiekty cd.
Ogólna postaü definicji klasy w jĊzyku Java:
public class NazwaKlasy
{
[spDostĊpu] typ nazwaPola;
...
[spDostĊpu] typ nazwaMetody(lista_parametrów)
{
definicja_funkcji
}
...
}
Uwagi:
¾ modyfikator dostĊpu public przed słowem class moĪe nie wystĊpowaü,
¾ modyfikatory [spDostĊpu] okreĞlają dostĊpnoĞü pól i metod.
¾ nagłówek i definicja metody w całoĞci muszą znajdowaü siĊ w klasie.
¾ definicja klasy nie jest zakoĔczona Ğrednikiem.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
34 / 81
Przykładowa definicja klasy ParaLiczb
class ParaLiczb
{
// definicja pól
int a;
int b;
// definicja konstruktora
ParaLiczb()
{
a = 0;
b = 0;
}
// definicja metody suma
int suma()
{
return a+b;
}
// definicja metody iloczn
int iloczyn()
{
return a*b;
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
35 / 81
Obiekty i referencje do obiektów
Obiekty są instancjami (egzemplarzami) klasy.
Do obiektów moĪna odwoływaü siĊ w programie za pomocą referencji.
Referencja to wartoĞü, która oznacza lokalizacjĊ (adres) obiektu w pamiĊci.
Referencje mogą byü pamiĊtane w zmiennych referencyjnych, np.:
ParaLiczb para;
Zmienne referencyjne mogą zawieraü referencje do obiektów lub nie zawieraü Īadnej
referencji (nie wskazywaü na Īaden obiekt). Zmienna, która nie zawiera referencji do
obiektu ma wartoĞü null.
Uwaga:
¾ Zmiennej referencyjnej moĪna przypisywaü wyłącznie referencje do obiektu lub
wartoĞü null.
¾ Referencje moĪna porównywaü wyłącznie za pomocą operatorów == lub !=.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
36 / 81
Obiekty i referencje do obiektów
Deklaracja zmiennej referencyjnej nie tworzy obiektu tzn. nie wydziela pamiĊci
do przechowywania obiektu klasy. Obiekt musi byü jawnie utworzony za pomocą
operatora new, który zwraca referencjĊ do obiektu. Ta referencja moĪe zostaü
przypisana zmiennej referencyjnej, np.:
para = new ParaLiczb();
ParaLiczb
a
b
para
JĊzyka Java cz. 1
obiekt klasy
ParaLiczb
referencja
zmienna
referencyjna
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
37 / 81
Definiowanie pól klasy
Pola (atrybuty) klasy deklarujemy jako zmienne wewnątrz klasy. Deklaracja moĪe
zawieraü modyfikator dostĊpu (np. private, protected lub public), oraz wyraĪenie
inicjujące, np.:
private float wartoĞü = 100.0f;
Uwaga: nazwy pól zwykle piszemy małymi literami.
Pola ustalone zawierają w deklaracji dodatkowy modyfikator final, np.:
final int ROZMIAR_CZCIONKI = 14;
Uwaga: nazwy pól ustalonych zwykle piszemy DUĩYMI_LITERAMI.
Pola klasy, które
wartoĞci domyĞlne:
nie
mają
przypisanej
wartoĞci
pola typu całkowitego (np. typu int)
pola typu rzeczywistego (np. typu float)
pola typu logicznego
pola typu referencyjnego
JĊzyka Java cz. 1
–
–
–
–
początkowej
bĊdą
miały
liczbĊ 0,
liczbĊ 0.0
wartoĞü false,
wartoĞü null.
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
38 / 81
Odwołania do pól klasy
Do pól klasy odwołujemy siĊ za pomocą operatora selekcji .
referencja_do_obiektu.nazwa_pola
np.
para.a
Uwaga:
JeĞli odwołujemy siĊ do pola bieĪącego obiektu (np. w metodzie wywołanej na rzecz
tego obiektu), które nie zostało przesłoniĊte, to moĪna odwoływaü siĊ z pominiĊciem
zmiennej referencyjnej i operatora selekcji . .
class ParaLiczb
{ int a, b;
odwołanie
do pola a
int getA()
{ return a;
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
39 / 81
Odwołania do pól klasy cd.
Uwaga:
JeĞli odwołujemy siĊ do pola bieĪącego obiektu (np. w metodzie wywołanej na rzecz
tego obiektu), które zostało przesłoniĊte przez zmienną lokalną, to do pola moĪna
odwoływaü siĊ za pomocą słowa this np.:
class ParaLiczb
{ int a, b;
int setA(int a)
{ this.a = a;
}
}
JĊzyka Java cz. 1
deklaracja pola a
parametr a przesłania
zasiĊg pola a
odwołanie
do pola a
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
40 / 81
Definiowane metod w klasie
modyfikator
dostĊpu
typ
wyniku
nazwa
metody
lista
parametró
parametrów
public int obliczSume(int a, int b)
{
int c = a+b;
ciało
metody
return c;
}
nagłówek metody
zwracany
wynik
¾ nagłówek i ciało metody w całoĞci muszą znajdowaü siĊ w klasie.
¾ nazwĊ metody zaczynamy od małej litery i dalej stosujemy notacjĊ wĊgierską
np. dodaj, obliczSume.
¾ modyfikator dostĊpu okreĞla
czy metoda moĪe byü wywoływana spoza
klasy, w której jest zdefiniowana.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
41 / 81
Definiowane metod w klasie cd.
¾ typ wyniku okreĞla typ danych zwracanych przez metodĊ. JeĞli metoda nic nie
zwraca to zapisujemy void.
¾ JeĞli metoda zwraca wynik to zakoĔczenie działania metody powinno
nastĊpowaü na skutek instrukcji return.
¾ lista parametrów zawiera deklaracje parametrów, które są przekazywane do
metody przy wywołaniu. Lista ta moĪe byü pusta (metoda bezparametrowa).
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
42 / 81
Konstruktory
Konstruktor to specjalna metoda, która słuĪy (głównie) do inicjowania pól obiektów.
Konstruktor
¾ zawsze ma nazwĊ taką samą jak nazwa klasy,
¾ nie ma Īadnego typu wyniku (nawet void),
¾ ma listĊ parametrów (w szczególnoĞci moĪe byü pusta).
¾ jest zawsze wywoływany za pomocą wyraĪenia new
Uwaga:
W klasie moĪe byü zdefiniowanych wiele przeciąĪonych konstruktorów,
które róĪnią siĊ listą parametrów.
JeĞli w klasie nie zdefiniowano Īadnego konstruktora to jest tworzony domyĞlny
konstruktor bezparametrowy, który inicjuje pola obiektu wartoĞciami domyĞlnymi.
Konstruktor domyĞlny nie jest dodawany, gdy w klasie zdefiniowano jakikolwiek
inny konstruktor.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
43 / 81
Konstruktory – przykład
class Towar
private
private
private
{
String nazwa;
double cena;
int
ilosc;
public Towar()
{
nazwa = "nieznany";
cena = 0.0;
ilosc = 0;
}
public Towar(String nazwa)
{
this();
this.nazwa = nazwa;
}
wywołanie konstruktora
bezparametrowego
public Towar(String nazwa, double cena, int ilosc)
{
this(nazwa);
this.cena = cena;
this.ilosc = ilosc;
}
wywołanie konstruktora
z jednym parametrem
public static void main(String [] args)
{ Towar t1, t2, t3, t4;
t1 = new Towar();
wywołanie konstruktora
bezparametrowego
wywołanie konstruktora
z jednym parametrem
t2 = new Towar("Zeszyt");
t3 = new Towar("Blok rysunkowy", 2.50, 5);
}
wywołanie konstruktora
z trzema parametrami
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
44 / 81
Pola i metody statyczne
Wszystkie pola niestatyczne istnieją w kaĪdym obiekcie bĊdącym instancją klasy.
tzn. kaĪdy obiekt posiada własny indywidualny zestaw atrybutów opisujących jego
właĞciwoĞci.
Pola statyczne dotyczą całej klasy, a nie poszczególnych obiektów – są one pamiĊtane
w specjalnym obszarze pamiĊci wspólnym dla całej klasy.
Składowe statyczne stanowią właĞciwoĞci całej klasy,
a nie poszczególnych obiektów.
Składowe statyczne (pola i metody):
¾ są deklarowane przy uĪyciu specyfikatora static
¾ mogą byü uĪywane nawet wtedy, gdy nie istnieje Īaden obiekt klasy.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
45 / 81
Pola i metody statyczne cd.
Do składowych statycznych klasy odwołujemy siĊ za pomocą operatora selekcji .
NazwaKlasy.nazwa_składowej
JeĪeli istnieje jakiĞ obiekt to do składowej statycznej moĪna siĊ równieĪ odwoływaü tak,
jak do zwykłej składowej (tzn. poprzez podanie referencji do obiektu)
referencja_do_obiektu.nazwa_składowej
Wewnątrz klasy do składowych statycznych moĪna odwoływaü siĊ w uproszczony
sposób podając tylko ich nazwĊ.
Uwaga:
Ze statycznych metod nie wolno odwoływaü siĊ do niestatycznych składowych
klasy podając ich nazwĊ (obiekt moĪe nie istnieü).
MoĪliwe są natomiast odwołania do innych składowych statycznych.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
46 / 81
Pola i metody statyczne – przykład
class Towar {
private static int vat = 0;
static void ustawVAT(int vat)
{ Towar.vat = vat;
System.out.printf("\nVAT wynosi %d\n\n", vat);
}
private String nazwa = "nieznany";
private double cena = 0.0;
private int
ilosc = 0;
Towar(String nazwa, double cena, int ilosc)
{
this.nazwa = nazwa;
this.cena = cena;
this.ilosc = ilosc;
}
pole statyczne
metoda statyczna
pola niestatyczne
konstruktor
double obliczWartoscNetto()
{
return cena * ilosc;
}
metody
niestatyczne
double obliczVAT()
{
return cena*ilosc*vat/100;
}
double obliczWartoscBrutto()
{
return obliczWartoscNetto() + obliczVAT();
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
47 / 81
Pola i metody statyczne – przykład cd.
public String toString()
{ return String.format("%10s %7.2f*%d + %2d%% VAT -> %7.2f",
nazwa, cena, ilosc, vat, obliczWartoscBrutto());
}
metody
niestatyczne
public void drukuj()
{ System.out.println(this);
}
public static void main(String[] args) {
// nazwa = ”Towar”;
// cena = 100.0;
// ilosc = 1;
// drukuj();
w metodzie statycznej nie
wolno odwoływaü siĊ do
pól i metod niestatycznych
Towar t1 = new Towar("Atlas
", 12.50, 2);
Towar t2 = new Towar("Zeszyt A4", 2.40, 5);
ustawVAT(0);
wywołania metody
statycznej
t1.drukuj();
t2.drukuj();
Towar.ustawVAT(7);
t1.drukuj();
t2.drukuj();
t1.ustawVAT(22);
t1.drukuj();
t2.drukuj();
wywołania metody
niestatycznej
dla obiektów t1 i t2
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
48 / 81
Związki miĊdzy klasami: „jest” i „zawiera”
Przkład:
Pojazd
Pojazd
silnikowy
Silnik
Silnik
elektryczny
Wóz
konny
Silnik
spalinowy
Motocykl
Pojazd silnikowy
Motocykl
Rower
Samochód
jest szczególnym rodzajem Pojazdu
jest szczególnym rodzajem Pojazdu silnikowego
Pojazd silnikowy
JĊzyka Java cz. 1
zawiera
Silnik
49 / 81
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
Ponowne wykorzystanie klas
Przy tworzeniu nowych klas moĪna wykorzystywaü juĪ istniejące klasy za pomocą:
¾kompozycji,
¾dziedziczenia.
KompozycjĊ
stosuje
siĊ
wtedy,
gdy
miĊdzy klasami
zachodzi
relacja
typu
„całoĞü ↔ czĊĞü” tzn. nowa klasa zawiera w sobie istniejącą klasĊ.
Dziedziczenie
stosuje
siĊ
wtedy,
gdy
miĊdzy
klasami
„generalizacja ↔ specjalizacja” tzn. nowa klasa
zachodzi
relacja
jest szczególnym
rodzajem juz istniejącej klasy.
Uwaga:
Zwykle tworzy siĊ nowe klasy wykorzystując jednoczeĞnie kompozycjĊ
i dziedziczenie np.:
klasa Pojazd silnikowy jest uszczegółowieniem klasy Pojazd oraz zawiera w
sobie klasĊ Silnik.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
50 / 81
Kompozycja
KompozycjĊ uzyskujemy poprzez definiowanie w nowej klasie pól, które są obiektami
istniejących klas.
Przykład:
Klasa Osoba zawiera:
¾ pola nazwisko i imie, które naleĪą do klasy String.
Klasa Ksiązka zawiera:
¾ pole autor naleĪące do klasy Osoba,
¾ pole tytul naleĪące do klasy String,
¾ pole cena typu double.
JĊzyka Java cz. 1
51 / 81
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
Kompozycja - definicja klasy Osoba oraz Ksiazka
class Osoba
{ private String nazwisko, imie;
public Osoba(String nazwisko, String imie)
{ this.nazwisko = nazwisko;
this.imie = imie;
}
public String podajNazwisko()
{ return nazwisko; }
public String podajImie()
{ return imie; }
}
class Ksiazka
{ private Osoba autor;
private String tytul;
double cena;
public Ksiazka(Osoba autor, String tytul, double cena)
{ this.autor = autor;
this.tytul = tytul;
this.cena = cena;
}
public Osoba podajAutor()
{ return autor; }
public String podajTytul()
{ return tytul; }
public double podajCena()
{ return cena; }
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
52 / 81
Kompozycja cd.
Przykładowa instrukcja tworząca nowy obiekt klasy Ksiazka:
Ksiazka lektura = new Ksiazka( new Osoba(”Sienkiewicz”, ”Henryk”),
”Potop”,
32.5 );
lektura
Osoba
Ksiazka
autor
tytul
cena
nazwisko
imie
String
”Sienkiewicz”
String
”Henryk”
32.5
String
”Potop”
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
53 / 81
Dziedziczenie
Dziedziczenie polega na przejĊciu właĞciwoĞci i funkcjonalnoĞci obiektów innej klasy
i ewentualnej modyfikacji tych właĞciwoĞci i funkcjonalnoĞci w taki sposób, by były one
bardziej wyspecjalizowane.
Do wyraĪania relacji dziedziczenia jednej klasy przez drugą
słuĪy słowo kluczowe extends
class B extends A
{
...
}
Klasa B dziedziczy (rozszerza) klasĊ A, tzn.
¾ klasa A jest klasą bazową, (superklasą) klasy B
¾ klasa B jest klasą pochodną klasy A
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
54 / 81
Dziedziczenie cd.
Przykład:
Klasa Publikacja zawiera:
¾ pole tytul z klasy String i pole cena typu double.
Klasa Ksiązka dziedziczy po klasie Publikacja i dodatkowo zawiera:
¾ pole autor naleĪące do klasy String.
Klasa Czasopismo dziedziczy po klasie Publikacja i dodatkowo zawiera:
¾ pole numer typu int.
JĊzyka Java cz. 1
55 / 81
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
Dziedziczenie cd.
Przykładowe instrukcje tworzące nowe obiekty klas Ksiazka i Czasopismo:
Ksiazka lektura = new Ksiazka(”Bolesław Prus”, ”Lalka”, 22.50 );
Czasopismo gazeta = new Czasopismo(”Przektój”, 12, 3.90 );
lektura
gazeta
JĊzyka Java cz. 1
Ksiazka
tytul
cena
22.50
autor
Publikacja(...)
podajTytul()
podajCena()
Ksiazka(...)
podajAutor()
String
String
”Lalka”
”Bolesław Prus”
Czasopismo
tytul
cena
3.90
numer
12
Publikacja(...)
podajTytul()
podajCena()
Czasopismo(...)
podajNumer()
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
String
”Przekrój”
56 / 81
Inicjowanie obiektów przy dziedziczeniu
Pola klasy bazowej moĪna inicjowaü za pomocą wywołania z konstruktora klasy
pochodnej konstruktora klasy bazowej:
super(args);
gdzie args jest listą argumentów przekazanych do konstruktora klasy bazowej
JeĞli konstrukcja super(...) wystĊpuje, MUSI byü pierwszą instrukcją
konstruktora klasy pochodnej.
Gdy nie wystĊpuje, przed wykonaniem kodu klasy pochodnej zostanie
wywołany konstruktor bezparametrowy klasy bazowej.
Przykład:
Czasopismo(String tytul, int numer, double cena)
{ super(tytul, cena);
Wywołanie konstruktora
this.numer = numer;
klasy bazowej
}
JĊzyka Java cz. 1
57 / 81
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
PrzeciąĪanie metod
PrzeciąĪanie metod w klasie polega na definiowaniu wielu metod o tej samej nazwie
ale odmiennej liĞcie parametrów. PrzeciąĪane mogą byü zarówno konstruktory jak i
metody statyczne i niestatyczne.
Przykład:
class Para
{ int a, b;
Para()
{ System.out.println(" Konstruktor bezparametrowy");
a = b = 0;
}
PrzeciąĪone
PrzeciąĪone
konstruktory
konstruktory
Para(int x, int y)
{ System.out.println(" Konstruktor z parametrami");
a = x; b = y;
}
void pokaz()
{ System.out.println("Metoda bez parametru");
System.out.println("Para("+ a +", "+ b +")" );
}
void pokaz(String tekst)
{ System.out.println("Metoda z parametrem");
System.out.print(tekst);
pokaz();
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
PrzeciąĪone
PrzeciąĪone
konstruktory
metody
Wywołanie metody
przeciąĪonej
58 / 81
PrzeciąĪanie metod cd.
public static void main(String[] args)
{
System.out.println("<=== Tworzenie obiektow ===>");
Para p1 = new Para();
Para p2 = new Para(3,7);
System.out.println("\n<=== Metoda pokaz bez parametru ===>");
p2.pokaz();
System.out.println("\n<=== Metoda pokaz z parametrem ===>");
p2.pokaz("Para p2: ");
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
59 / 81
Przedefiniowanie metody
Przedefiniowanie metody klasy bazowej w klasie pochodnej nastĊpuje wtedy, gdy w
klasie pochodnej zdefiniujemy metodĊ z taką samą sygnaturą (nazwa i lista parametrów)
i typem wyniku jak sygnatura i typ wyniku nieprywatnej i niestatycznej metody klasy
bazowej.
Wówczas metoda klasy bazowej zostaje ukryta.
Przykład:
class Para
{ int a, b;
Para(int x, int y)
{ System.out.println(" Konstruktor z parametrami");
a = x; b = y;
}
void pokaz()
{ System.out.println("Metoda bez parametru z klasy Para");
System.out.println("Para("+ a +", "+ b +")" );
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
60 / 81
Przedefiniowanie metody cd.
class Trojka extends Para
{ int c;
Trojka(int x, int y, int z)
{ super(x, y);
c = z;
}
Wywołanie konstruktora
klasy bazowej
void pokaz()
{ System.out.println("Metoda bez parametru z klasy Trojka");
System.out.println("Trojka("+ a +", "+ b +", "+ c +")" );
}
Przedefiniowanie
metody z klasy bazowej
void pokaz(String tekst)
{ System.out.println("Metoda z parametrem z klasy Trojka");
System.out.println(tekst);
pokaz();
super.pokaz();
}
public static void main(String[] args)
{
System.out.println("<=== Tworzenie obiektow ===>");
Trojka t1 = new Trojka(1, 2, 3);
PrzeciąĪenie metody
Wywołanie metody
przedefiniowanej
Wywołanie metody z
klasy bazowej
System.out.println("\n<=== Metoda pokaz bez parametru ===>");
t1.pokaz();
System.out.println("\n<=== Metoda pokaz z parametrem ===>");
t1.pokaz("Trojka t1: ");
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
61 / 81
Przedefiniowanie metody cd.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
62 / 81
Pokrycie metody statycznej
Pokrycie metody statycznej klasy bazowej w klasie pochodnej nastĊpuje wtedy, gdy w
klasie pochodnej zdefiniujemy statyczną metodĊ z taką samą sygnaturą (nazwa i lista
parametrów) i typem wyniku jak sygnatura i typ wyniku nieprywatnej i statycznej metody
klasy bazowej.
Wówczas metoda klasy bazowej zostaje ukryta. MoĪna siĊ do niej odwołaü z innej
metody poprzedzając wywołanie metody nazwą klasy bazowej i operatorem „.” .
Uwaga:
W podobny sposób moĪna pokrywaü pola klasy bazowej. NaleĪy w klasie
pochodnej zdefiniowaü pole o tej samej nazwie (moĪe byü innego typu).
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
63 / 81
Hierarchia dziedziczenia w Javie
JeĞli przy definicji klasy nie uĪywamy słowa extends (tzn. nie Īądamy jawnie
dziedziczenia) to nasza klasa domyĞlnie dziedziczy klasĊ Object.
W Javie kaĪda klasa moĪe bezpoĞrednio odziedziczyü tylko jedną klasĊ. Ale poĞrednio
moĪe mieü dowolnie wiele nadklas.
W Javie wszystkie klasy pochodzą poĞrednio od klasy Object
class A
{
}
class B extends A
{
}
class C extends A
{
}
class D extends B
{
}
class E extends E
{
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
64 / 81
Konwersje referencyjne
MoĪna zauwaĪyü, Īe obiekt klasy pochodnej posiada wszystkie atrybuty i metody
klasy bazowej, a wiĊc „zawiera w sobie” obiekt klasy bazowej (nadklasy). Dlatego
odniesienie do takiego obiektu moĪna zapamiĊtaü w zmiennej referencyjnej klasy
bazowej.
Obiekty klasy Ksiazka i klasy Czasopismo mają właĞciwoĞci obiektów
klasy Publikacja (tzn. posiadają wszystkie atrybuty i metody klasy Publikacja).
Referencje do obiektów klas Ksiazka i Czasopismo moĪna wiĊc przypisywaü do
zmiennych referencyjnych klasy Publikacja.
JĊzyka Java cz. 1
65 / 81
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
Konwersje referencyjne cd.
Przykładowe instrukcje tworzące nowe obiekty klas Ksiazka i Czasopismo:
Publikacja publ_1 = new Ksiazka(”Bolesław Prus”,”Lalka”, 22.50 );
Publikacja publ_2 = new Czasopismo(”Przektój”, 12, 3.90 );
publ_1
publ_2
JĊzyka Java cz. 1
Ksiazka
tytul
cena
22.50
autor
Publikacja(...)
podajTytul()
podajCena()
Ksiazka(...)
podajAutor()
String
String
”Lalka”
”Bolesław Prus”
Czasopismo
tytul
cena
3.90
numer
12
Publikacja(...)
podajTytul()
podajCena()
Czasopismo(...)
podajNumer()
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
String
”Przekrój”
66 / 81
Metody wirtualne
JeĞli w podklasie (klasie pochodnej) zostanie przedefiniowana jakaĞ metoda,
zdefiniowana pierwotnie w nadklasie (klasie bazowej) to przy wywołaniu tej metody
zostanie uruchomiona metoda tej klasy, do której faktycznie naleĪy obiekt, a nie tej klasy
która jest typem zmiennej referencyjnej zawierającej odniesienie do obiektu.
Oznacza to, Īe wiązanie odwołaĔ do metod z kodem programu nastĊpuje nie w czasie
kompilacji programu, lecz fazie wykonania programu tuĪ przed kaĪdorazowym
wykonaniem instrukcji wywołującej przedefiniowaną metodĊ.
Metody wirtualne to takie metody, dla których wiązanie odwołaĔ z kodem programu
nastĊpuje w fazie wykonania programu
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
67 / 81
Metody wirtualne cd.
Metody wirtualne to takie metody, dla których wiązanie odwołaĔ z kodem programu
nastĊpuje w fazie wykonania programu
W Javie wszystkie metody są wirtualne za wyjątkiem:
¾metod statycznych (bo nie dotyczą obiektów, a klasy)
¾metod deklarowanych ze specyfikatorem final, który oznacza, Īe metoda
jest ostateczne i nie moĪe byü przedefiniowana,
¾metod prywatnych (bo metody prywatne nie mogą zostaü przedefiniowane).
Odwołania do metod wirtualnych są polimorficzne, gdyĪ efekt kaĪdorazowego
odwołania moĪe przybieraü róĪne kształty, w zaleĪnoĞci od tego jaki jest faktyczny typ
obiektu, na rzecz którego wywołano metodĊ wirtualną.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
68 / 81
Metody wirtualne - przykład.
class Zwierz
{
String nazwa = "nieznany";
Zwierz(){ }
Zwierz(String n){ nazwa = n; }
String podajGatunek() { return "Jakis zwierz"; }
String podajNazwe()
{ return nazwa; }
String podajGlos()
{ return "?"; }
Metody
podajGatunek(),
podajNazwe(),
podajGlos()
są wirtualne.
void mowa()
{
System.out.println(podajGatunek() + " " +
podajNazwe() + " mowi " +
podajGlos() );
}
}
class Pies extends Zwierz
{
Pies(){ }
Pies(String n){ super(n); }
String podajGatunek() { return "Pies"; }
String podajGlos()
{ return "HAU HAU!"; }
}
Działanie
metod
wirtualnych
wywołanych w metodzie mowa()
bĊdzie zaleĪeü od klasy obiektu, na
rzecz którego zostanie wywołana
metoda mowa().
class Kot extends Zwierz
{
Kot() { }
Kot(String n){ super(n); }
String podajGatunek() { return "Kot"; }
String podajGlos()
{ return "Miauuu..."; }
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
69 / 81
Metody wirtualne – przykład cd.
class ZOO
{
static void dialogZwierzat(Zwierz z1, Zwierz z2)
{ z1.mowa();
z2.mowa();
System.out.println("----------------------------");
}
public static void main(String []args)
{
Zwierz z1 = new Zwierz(),
z2 = new Zwierz("Inny zwierz");
Pies pies = new Pies(),
szarik = new Pies("Szarik"),
reksio = new Pies("Reksio");
Kot filemon = new Kot("Filemon");
dialogZwierzat(z1,
z2);
dialogZwierzat(szarik, reksio);
dialogZwierzat(pies,
filemon);
dialogZwierzat(szarik, filemon);
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
70 / 81
Metody i klasy abstrakcyjne
Metoda abstrakcyjna to metoda, która nie ma implementacji (ciała) i jest
zadeklarowana ze specyfikatorem abstract. Taka metoda moĪe byü deklarowana
tylko w klasie abstrakcyjnej !
abstract int obliczCos();
nie
ma
ciała
–
tylko
Ğrednik
Klasą abstrakcyjną to klasa, opatrzona specyfikatorem abstract. Taka klasa moĪe
(ale nie musi) zawieraü metody abstrakcyjne.
metoda abstrakcyjna
abstract class JakasKlasa
{ abstract int obliczCos();
void wypiszCos(){ System.out.printn(”cos”); }
}
Nie moĪna tworzyü obiektów klasy abstrakcyjnej !!!
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
71 / 81
Metody i klasy abstrakcyjne cd.
Klasa abstrakcyjna moĪe byü dziedziczona przez nowe klasy. Klasa pochodna MUSI
przedefiniowaü (a właĞciwie zdefiniowaü) wszystkie metody abstrakcyjne, które
odziedziczyła z abstrakcyjnej klasy bazowej. W przeciwnym wypadku klasa pochodna
nadal pozostanie klasą abstrakcyjną i nie bĊdzie moĪna tworzyü jej obiektów.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
72 / 81
Interfejsy
Interfejs w Javie to deklarowany za pomocą słowa kluczowego interface nazwany
zbiór deklaracji zawierający:
¾ publiczne abstrakcyjne metody (bez implementacji),
¾ publiczne statyczne zmienne finalne (stałe) o ustalonych typach i wartoĞciach.
Implementacja interfejsu w klasie polega na zdefiniowaniu w tej klasie wszystkich
metod zadeklarowanych w implementowanym interfejsie.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
73 / 81
Interfejsy cd.
Ogólna postaü definicji interfejsu w jĊzyku Java:
public interface NazwaInterfejsu
{
typ nazwaZmiennej = wartosc;
...
typ nazwaMetody(lista_parametrów);
...
}
Uwagi:
¾ modyfikator dostĊpu public przed słowem interface moĪe nie wystĊpowaü
- wówczas interfejs jest dostĊpny tylko w bieĪącym pakiecie,
¾ zmienne są zawsze typu static final i mają przypisaną wartoĞü stałą,
¾ metody są zawsze abstrakcyjne (bez implementacji).
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
74 / 81
Implementacja interfejsu
Ogólna postaü definicji klasy implementującej interfejs w jĊzyku Java:
public class NazwaKlasy extends KlasaBazowa implements
NazwaInterfejsu_1, ..., NazwaInterjejsu_n
{
...
}
Uwagi:
¾ modyfikator dostĊpu public przed słowem class moĪe nie wystĊpowaü wówczas klasa jest dostĊpna tylko w bieĪącym pakiecie,
¾ klasa moĪe ale nie musi dziedziczyü inną klasĊ (słowa extends KlasaBazowa
mogą nie wystĊpowaü)
¾ klasa moĪe implementowaü wiele interfejsów,
¾ klasa musi definiowaü WSZYSTKIE metody implementowanych interfejsów albo
pozostaü klasą abstrakcyjną.
¾ klasa moĪe zawieraü własne (nie bĊdące czĊĞcią interfejsu) atrybuty i metody.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
75 / 81
Implementacja interfejsu – przykład
Przykład zawiera implementacjĊ klas reprezentujących róĪne gatunki zwierząt. CzeĞü
zwierząt potrafi pływaü, Niektóre potrafią wydawaü odgłosy.
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
76 / 81
Implementacja interfejsu – przykład
/**
*
Interfejs definiujący metody
*
dla obiektów pływających w wodzie
*/
interface Plywa
{
float podajGlebokosc();
}
/**
*
Interfejs definiujący metody
*
dla obiektów wydających glosy
*/
interface WydajeGlos
{
String podajGlos();
}
/**
*
Klasa abstrakcyjna reprezentująca zwierzĊta
*/
abstract class Zwierz
{
String nazwa;
Zwierz(String nazwa){ this.nazwa = nazwa;}
public String podajNazwe(){return nazwa; }
public abstract String podajGatunek();
public abstract void info();
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
77 / 81
Implementacja interfejsu – przykład cd.
Klasa Ryba jest klasą pochodną Zwierz, która implementuje interfejs Plywa,
natomiast klasa Kot implementuje interfejs WydajeGlos
class Ryba extends Zwierz implements Plywa
{
float glebokosc;
Ryba(String nazwa, float glebokosc)
{ super(nazwa);
this.glebokosc = glebokosc;
}
public String podajGatunek() { return "Ryba";
}
public float podajGlebokosc(){ return glebokosc;}
public void info()
{ System.out.println(podajNazwe() + " pływa na głĊbokoĞci " + podajGlebokosc() );
}
}
class Kot extends Zwierz implements WydajeGlos
{
Kot(String nazwa){ super(nazwa); }
public String podajGatunek() { return "Kot";
}
public String podajGlos()
{ return "Miauuu"; }
public void info()
{ System.out.println(podajNazwe() + " mówi " + podajGlos());
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
78 / 81
Implementacja interfejsu – przykład cd.
Klasa Kaczka jest klasą pochodną Zwierz, która implementuje zarówno interfejs
Plywa jak i interfejs WydajeGlos
class Kaczka extends Zwierz implements Plywa, WydajeGlos
{
Kaczka(String nazwa){ super(nazwa); }
public String podajGatunek() { return "Kaczka"; }
public float podajGlebokosc(){ return 0.0F;
}
public String podajGlos()
{ return "Kwa Kwa";}
public void info()
{ System.out.println(podajNazwe() + " pływa po powierzchni i mówi ” + podajGlos() );
}
}
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
79 / 81
Interfejs i zmienne referencyjne
Interfejsy, podobnie jak klasy wyznaczają typy zmiennych referencyjnych.
Przykład:
Deklaracja zmiennej, której typem jest interfejs
WydajeGlos wg1, wg2;
WartoĞcią takiej zmiennej moĪe byü odwołanie do obiektu dowolnej klasy,
która implementuje ten interfejs.
wg1 = new Kaczka(”Dziwaczka”);
wg2 = new Kot(”Bonifacy”);
Przy wykonywaniu powyĪszych przypisaĔ nastĊpuje referencyjna konwersja
rozszerzająca referencji wskazującej na nowy obiekt do typu interfejsu
(implementowany interfejs jest traktowany podobnie jak klasa bazowa).
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
80 / 81
Interfejs i zmienne referencyjne cd.
Przez zmienną której typem jest interfejs moĪna wywołaü dowolną metodĊ
zadeklarowaną w tym interfejsie:
System.out.println( wg1.podajGlos() ); // wypisze ”Kwa Kwa”
System.out.println( wg2.podajGlos() ); // wypisze ”Miauuu”
Wywoła
siĊ
poprawna
wersja
metody,
odpowiednio
dla
faktycznego
obiektu
wskazywanego przez zmienną.
Wywołanie innej metody, która nie została zdefiniowana w interfejsie, jest moĪliwe
wyłącznie po uĪyciu jawnej konwersji zawĊĪającej:
((Zwierz)wg1).info();
// wypisze ”Dziwaczka pływa po powierzchni i mówi Kwa Kwa”
((Zwierz)wg2).info();
// wypisze ”Bonifacy mówi Miauuu”
JĊzyka Java cz. 1
Autor: Paweł RogaliĔski – Instytut Informatyki, Automatyki i Robotyki PWr
81 / 81
Nazwa pliku: 06_Java_Streszczenie.doc
Katalog:
C:\Documents and
Settings\pawel\Moje
dokumenty\www\idun\dydaktyka\zaoczne_Pr
og_wsp\Wyklad_java
Szablon:
C:\Documents and
Settings\pawel\Dane
aplikacji\Microsoft\Szablony\Normal.dot
Tytuł:
1
Temat:
Autor:
pawel
Słowa kluczowe:
Komentarze:
Data utworzenia: 2006-08-06 19:03:00
Numer edycji: 148
Ostatnio zapisany: 2008-05-16 21:44:00
Ostatnio zapisany przez: pawel
Całkowity czas edycji: 5 756 minut
Ostatnio drukowany: 2008-05-16 23:32:00
Po ostatnim całkowitym wydruku
Liczba stron: 81
Liczba wyrazów: 6 309 (około)
Liczba znaków: 37 854 (około)