Program w Javie składa się ze zbioru klas. Każda klasa publiczna musi być zapisana w oddzielnym pliku o takiej samej nazwie,
jak nazwa tej klasy (zasada ta nie dotyczy klas wewnętrznych i pakietowych), oraz rozszerzeniu
java. Wykonywanie programu
rozpoczyna się od metody o nazwie
PDLQ
, która musi być zadeklarowana jako publiczna i statyczna. Jeżeli program składa się
z wielu klas publicznych i więcej niż jedna z nich zawiera taką metodę
PDLQ
, to aplikacja ma wiele punktów wejścia (startowych),
może być więc uruchamiana na kilka sposobów. Schematyczna konstrukcja programu:
SXEOLFFODVV0DLQ
^
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
NRGPHWRG\PDLQ
`
`
Deklaracja pojedynczej zmiennej
Deklaracja zmiennej polega na podaniu jej typu oraz nazwy i kończy się znakiem średnika; schematycznie:
QD]ZDB]PLHQQHMW\SB]PLHQQHM
Przykładowo:
FODVV0DLQ
^
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
LQWOLF]ED
`
`
Deklaracja może być równoczesna z przypisaniem wartości (inicjalizacją zmiennej):
QD]ZDB]PLHQQHMW\SB]PLHQQHM ZDUWRĞü
Przykładowo:
LQWOLF]ED
Nazwy zmiennych
Nazwa zmiennej może się składać z liter (zarówno małych, jak i dużych), cyfr oraz znaku podkreślenia, nie może jednak zaczynać
się od cyfry. Dopuszczalny jest także znak dolara, ale przyjmuje się, że jest on zarezerwowany dla narzędzi przetwarzających kod
i raczej nie należy go stosować w nazwach zmiennych. Można wykorzystać znaki spoza ścisłego alfabetu łacińskiego (wszelkiego
rodzaju znaki narodowe).
Deklaracja wielu zmiennych
W jednym wierszu można deklarować wiele zmiennych, jeśli są one tego samego typu; schematycznie:
W\SB]PLHQQHMQD]ZDQD]ZDQD]ZD1
Przykładowo:
LQWSLHUZV]DBOLF]EDGUXJDBOLF]EDWU]HFLDBOLF]ED
Deklaracje wielu zmiennych mogą być powiązane z ich równoczesną inicjalizacją:
LQWSLHUZV]DBOLF]ED GUXJDBOLF]EDWU]HFLDBOLF]ED
Zmienne referencyjne
Zmienne typów referencyjnych (z ang. reference types), inaczej odnośnikowych, deklaruje się tak, jak przedstawiono wyżej, czyli:
W\SB]PLHQQHMQD]ZDB]PLHQQHM
z tą różnicą, że konstrukcja ta powoduje powstanie jedynie odniesienia, któremu domyślnie zostanie przypisana wartość pusta
QXOO
. Zmiennej referencyjnej po deklaracji należy przypisać odniesienie do obiektu utworzonego oddzielną instrukcją (patrz
sekcja „Klasy i obiekty”).
Operatory arytmetyczne
Operator
Wykonywane działanie
mnożenie
dzielenie
dodawanie
odejmowanie
dzielenie modulo (reszta z dzielenia)
inkrementacja (zwiększanie)
dekrementacja (zmniejszanie)
Operatory logiczne
Operator
Symbol
Iloczyn (AND)
Suma (OR)
__
Negacja (NOT)
Operatory logiczne działają według zasad opisanych
poniżej.
Iloczyn logiczny
Wynikiem operacji AND (iloczynu logicznego) jest wartość
WUXH
, wtedy i tylko wtedy, kiedy oba argumenty mają
wartość
WUXH
. W każdym innym przypadku wynikiem jest
wartość
IDOVH
.
Argument 1
Argument 2
Wynik
WUXH
WUXH
WUXH
WUXH
IDOVH
IDOVH
IDOVH
WUXH
IDOVH
IDOVH
IDOVH
IDOVH
Suma logiczna
Wynikiem operacji OR (sumy logicznej) jest wartość
IDO
VH
, wtedy i tylko wtedy, kiedy oba argumenty mają wartość
IDOVH
. W każdym innym przypadku wynikiem jest
WUXH
.
Argument 1
Argument 2
Wynik
WUXH
WUXH
WUXH
WUXH
IDOVH
WUXH
IDOVH
WUXH
WUXH
IDOVH
IDOVH
IDOVH
Negacja logiczna
Operacja NOT (negacja logiczna) zamienia wartość argu-
mentu na przeciwną. Jeśli argument miał wartość
WUXH
,
będzie miał wartość
IDOVH
, jeśli argument miał wartość
IDOVH
, będzie miał wartość
WUXH
.
Argument
Wynik
WUXH
IDOVH
IDOVH
WUXH
Operatory bitowe
Operator
Symbol
Iloczyn (AND)
Suma (OR)
_
Negacja (NOT)
a
Różnica symetryczna (XOR)
A
Przesunięcie bitowe w prawo
!!
Przesunięcie bitowe w lewo
Przesunięcie bitowe w prawo z wypełnieniem zerami
!!!
Operatory przypisania
Argument 1
Operator
Argument 2
Znaczenie
x
y
[ \
x
y
[ [\
x
y
[ [±\
x
y
[ [ \
x
y
[ [\
x
y
[ [\
x
y
[ [\
x
!!
y
[ [!!\
x
!!!
y
[ [!!!\
x
y
[ [ \
x
_
y
[ [_\
x
A
y
[ [A\
W przypadku korzystania ze zintegrowanych środowisk programistycznych sposób kompilacji zależy od wykorzystywanego pro-
duktu. W przypadku korzystania z kompilatora pracującego w wierszu poleceń, zawartego w pakiecie Java Development Kit (JDK),
kompilacja odbywa się po wydaniu następującego polecenia:
MDYDFQD]ZDBSOLNXMDYD
Kompilator ten udostępnia m.in. opcje:
Opcja
Znaczenie
J
Włącza lub wyłącza generowanie informacji dla debugera
QRZDUQ
Wyłącza wyświetlanie ostrzeżeń
YHUERVH
Wyświetla dodatkowe informacje o postępie kompilacji
GHSUHFDWLRQ
Wyświetla informacje o użyciu przestarzałych metod API
FODVVSDWK
Specyfikuje położenie plików bibliotecznych
VRXUFHSDWK
Specyfikuje położenie plików źródłowych
G
Określa położenie plików wynikowych
HQFRGLQJ
Określa standard kodowania znaków w plikach źródłowych
VRXUFH
Określa standard, z którym kompatybilne są pliki źródłowe
WDUJHW
Określa kompatybilność kodów wynikowych z poszczególnymi wersjami maszyn wirtualnych
KHOS
Wyświetla skróconą listę opcji kompilatora
Parametr
WDUJHW
może przyjmować jedną z następujących wartości:
x 1.1 — kod zgodny z maszyną wirtualną w wersji 1.1;
x 1.2 — kod zgodny z wersją 1.2 i wyższymi;
x 1.3 — kod zgodny z wersją 1.3 i wyższymi;
x 1.4 — kod zgodny z wersją 1.4 i wyższymi;
x 1.5 — kod zgodny z wersją 1.5 i wyższymi;
x 1.6 — kod zgodny z wersją 1.6 i wyższymi;
x 1.7 — kod zgodny z wersją 1.7 i wyższymi;
x 5 — kod zgodny z wersją 1.5 i wyższymi;
x 6 — kod zgodny z wersją 1.6 i wyższymi;
x 7 — kod zgodny z wersją 1.7 i wyższymi.
Java udostępnia pewną liczbę wbudowanych typów danych, czyli takich, które oferuje sam język i z których można korzystać bez
potrzeby ich definiowania. Określa się je jako typy proste lub podstawowe (z ang.
primitive types).
Typ znakowy (char)
Typ
FKDU
służy do reprezentowania wszelkich znaków, m.in. liter. Jest on 16-bitowy i opiera się na standardzie Unicode (czyli
standardzie umożliwiającym przedstawienie znaków występujących w większości języków świata). Ponieważ znaki reprezentowa-
ne są tak naprawdę jako 16-bitowe kody liczbowe, typ ten można zaliczyć również do typów arytmetycznych.
Typ logiczny (boolean)
Typ
ERROHDQ
może reprezentować jedynie dwie wartości:
WUXH
(prawda) i
IDOVH
(fałsz).
Typy arytmetyczne
Typy całkowitoliczbowe
Typy arytmetyczne całkowitoliczbowe służą
do reprezentowania liczb całkowitych.
W Javie występują cztery ich rodzaje:
x
E\WH
,
x
VKRUW
,
x
LQW
,
x
ORQJ
.
Osoby programujące w innych językach programowania, takich jak C, C++ czy PHP, powinny zwrócić uwagę, że zakres wartości
możliwych do przedstawienia jest z góry ustalony i nie zależy od platformy systemowej, na której uruchamiany jest program w Javie.
Typy zmiennopozycyjne
Typy zmiennopozycyjne występują w dwóch odmianach:
x
IORDW
(pojedynczej precyzji),
x
GRXEOH
(podwójnej precyzji),
różniących się rozmiarem oraz zakresem liczb możliwych
do zaprezentowania.
W Javie istnieją dwa rodzaje komentarzy, oba zapożyczone z języków takich, jak C i C++:
x blokowy,
x wierszowy.
Komentarz blokowy
Komentarz blokowy rozpoczyna się od znaków
, a kończy się znakami
. Wszystko, co znajduje się pomiędzy tymi znakami,
jest traktowane przez kompilator jako komentarz i pomijane w procesie kompilacji. Umiejscowienie komentarza blokowego jest
w zasadzie dowolne — może on się znaleźć nawet w środku instrukcji (pod warunkiem, że nie zostanie przedzielone żadne słowo).
Komentarzy blokowych nie wolno zagnieżdżać.
FODVV0DLQ
^
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
WRMHVWNRPHQWDU]EORNRZ\
6\VWHPRXWSULQWOQ7RMHVWQDSLV
`
`
Komentarz wierszowy
Komentarz wierszowy zaczyna się od znaków
i obowiązuje do końca danej linii programu. Wszystko to, co występuje po tych
dwóch znakach aż do końca bieżącej linii, jest ignorowane przez kompilator.
FODVV0DLQ
^
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
WRMHVWNRPHQWDU]ZLHUV]RZ\
6\VWHPRXWSULQWOQ7RMHVWQDSLV
`
`
Komentarz wierszowy może znaleźć się w środku komentarza blokowego:
WDNRQVWUXNFMDMHVWSRSUDZQD
KOMPILACJA KODU
TYPY DANYCH
KOMENTARZE
S
S
Rodzaje te różnią się zakresem liczb, które można reprezentować za ich
pomocą, co przedstawia poniższa tabela.
Typ
Liczba bitów
Zakres
E\WH
8
od −128 do 127
VKRUW
16
od −32 768 do 32 767
LQW
32
od −2
31
do 2
31
− 1
ORQJ
64
od −2
63
do 2
63
− 1
Typ
Liczba bitów
Zakres
IORDW
32
od –3,4e38 do 3,4e38
GRXEOH
64
od –1,8e308 do 1,8e308
ZMIENNE
OPERATORY
Ciąg dalszy na stronie 2
Î
BUDOWA APLIKACJI
S
S
S
S
KLASY I OBIEKTY
Operatory porównywania
Operator
Opis
Wynikiem jest
WUXH
, jeśli argumenty są sobie równe
Wynikiem jest
WUXH
, jeśli argumenty są różne
!
Wynikiem jest
WUXH
, jeśli argument lewostronny jest większy od prawostronnego
Wynikiem jest
WUXH
, jeśli argument lewostronny jest mniejszy od prawostronnego
!
Wynikiem jest
WUXH
, jeśli argument lewostronny jest większy od prawostronnego lub równy mu
Wynikiem jest
WUXH
, jeśli argument lewostronny jest mniejszy od prawostronnego lub równy mu
Priorytet operatorów
(Od najsilniejszych do najsłabszych; operatory w jednym wierszu mają ten sam priorytet).
Grupa operatorów
Symbole
Inkrementacja przyrostkowa
,
Inkrementacja przedrostkowa, negacja
,
,
a
,
Mnożenie, dzielenie
,
,
Dodawanie, odejmowanie
,
Przesunięcia bitowe
,
!!
,
!!!
Porównania (mniejsze, większe)
,
!
,
,
!
Porównania (równe, różne)
,
Bitowe AND
Bitowe XOR
A
Bitowe OR
_
Logiczne AND
Logiczne OR
__
Warunkowy
"
Przypisania
,
,
,
,
,
,
,
A
,
_
,
,
!!
,
!!!
Instrukcja continue
Instrukcja
FRQWLQXH
powoduje przerwanie bieżącej iteracji
pętli i przejście do kolejnej iteracji.
Przykład (wyświetlenie parzystych liczb z zakresu 1 – 20):
IRULQWL L L^
LIL FRQWLQXH
6\VWHPRXWSULQWOQL
`
2
Tablice informatyczne. Java. Wydanie III
Deklaracje tablic
Tablice w Javie są obiektami. Aby móc skorzystać z tablicy,
należy najpierw zadeklarować zmienną tablicową, a następ-
nie utworzyć samą tablicę (obiekt tablicy). Schematycznie
deklaracja taka jest następująca:
W\SBWDEOLF\QD]ZDBWDEOLF\>@
lub (co ma identyczne znaczenie):
W\SBWDEOLF\>@QD]ZDBWDEOLF\
Tablicę tworzy się za pomocą operatora
QHZ
o postaci:
QHZW\SBWDEOLF\>OLF]EDBHOHPHQWyZ@
Tablicę można również jednocześnie zadeklarować i utwo-
rzyć, korzystając z konstrukcji:
W\SBWDEOLF\QD]ZDBWDEOLF\>@ QHZW\SB
´WDEOLF\>OLF]EDBHOHPHQWyZ@
lub:
W\SBWDEOLF\>@QD]ZDBWDEOLF\ QHZW\SB
´WDEOLF\>OLF]EDBHOHPHQWyZ@
Przykład:
FODVV0DLQ
^
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
LQWWDE>@ QHZLQW>@
WDE>@
6\VWHPRXWSULQWOQ3LHUZV]\
´HOHPHQWWDEOLF\PDZDUWRĞü
´WDE>@
`
`
Inicjalizacja tablicy
W przypadku niewielkich tablic można dokonać inicjalizacji
tablicy, ujmując wartości, które mają się znaleźć w jej komór-
kach, w nawias klamrowy. Nie trzeba wtedy korzystać z ope-
ratora
QHZ
. Schematycznie deklaracja taka jest następująca:
W\SBWDEOLF\QD]ZDBWDEOLF\>@ ^ZDUWRĞü
´ZDUWRĞüZDUWRĞü1`
Na przykład deklarację sześcioelementowej tablicy liczb
całkowitych typu
LQW
i wypełnienie jej kolejnych komórek
wartościami od 1 do 6 można wykonać za pomocą instrukcji:
LQWWDEOLFD>@ ^`
Właściwość length
Każda tablica ma właściwość
OHQJWK
, która określa liczbę
jej komórek.
Przykład:
LQWWDEOLFD>@ QHZLQW>@
IRULQWL LWDEOLFDOHQJWK
´L^
WDEOLFD>L@ L
`
Tablice wielowymiarowe
Deklaracja regularnych tablic wielowymiarowych odbywa
się w sposób analogiczny do deklaracji tablic jednowymia-
rowych, dodawane są jedynie kolejne nawiasy kwadratowe.
Schematyczna deklaracja tablicy dwuwymiarowej ma po-
stać:
W\SBWDEOLF\QD]ZDBWDEOLF\>@>@
Tablica tego typu może zostać zainicjowana przy użyciu
składni z nawiasami klamrowymi:
W\SBWDEOLF\QD]ZDBWDEOLF\>@>@ ^
^ZDUWRĞüZDUWRĞüZDUWRĞü1`
^ZDUWRĞüZDUWRĞüZDUWRĞü1`
`
Przykład (dwuwymiarowa tablica liczb całkowitych wypeł-
niona danymi):
LQWWDE>@>@ ^
^`
^`
`
Do jej utworzenia można użyć także standardowego opera-
tora
QHZ
w postaci:
QHZW\SBWDEOLF\>OLF]EDBHOHPHQWyZ@
´>OLF]EDBHOHPHQWyZ@
Przykład:
LQWWDE>@>@ QHZLQW>@>@
LQWFRXQW
IRULQWL LL^
IRULQWM MM^
WDE>L@>M@ FRXQW
`
`
Budowa klasy
Definicja klasy ma schematyczną postać:
FODVVQD]ZDBNODV\
^
WUHĞüNODV\
GHILQLFMHSyOLPHWRG
`
Przykład:
FODVV3XQNW
^
LQW[
LQW\
`
Tworzenie obiektów
Zmienna typu obiektowego (odnośnikowego, referencyjne-
go) tworzona jest za pomocą konstrukcji:
QD]ZDBNODV\QD]ZDB]PLHQQHM
Do tak zadeklarowanej zmiennej można przypisać obiekt
utworzony za pomocą operatora
QHZ
:
QHZQD]ZDBNODV\
Jednoczesna deklaracja zmiennej, utworzenie obiektu i przy-
pisanie go zmiennej odbywa się za pomocą schematycznej
konstrukcji:
QD]ZDBNODV\QD]ZDB]PLHQQHM QHZ
´QD]ZDBNODV\
Przykład:
3XQNWPRM3XQNW QHZ3XQNW
Pola klas
Definicje pól
Pola definiowane są w ciele klasy, podobnie jak zwykłe zmien-
ne. Najpierw należy podać typ pola, a po nim — nazwę pola:
FODVVQD]ZDBNODV\
^
W\SBSRODQD]ZDBSROD
W\SBSRODQD]ZDBSROD
W\SBSROD1QD]ZDBSROD1
`
Odwołania do pól obiektu
Po utworzeniu obiektu do jego pól można odwoływać się za
pomocą operatora kropki (
); schematycznie:
QD]ZDBRELHNWXQD]ZDBSROD
Przykład:
3XQNWSXQNW QHZ3XQNW
SXQNW[
SXQNW\
Wartości domyślne pól
Każde niezainicjowane pole klasy otrzymuje wartość domyślną,
zależną od jego typu. Wartości te zaprezentowane są w poniż-
szej tabeli.
Typ
Wartość domyślna
E\WH
VKRUW
LQW
ORQJ
IORDW
GRXEOH
FKDU
?
ERROHDQ
IDOVH
RELHNWRZ\
QXOO
Metody klas
Definicje metod
Metody definiowane są w ciele klasy pomiędzy znakami na-
wiasu klamrowego. Każda metoda może przyjmować argu-
menty oraz zwracać wynik. Schematyczna deklaracja metody
ma postać:
W\SBZ\QLNXQD]ZDBPHWRG\DUJXPHQW\BPHWRG\
^
LQVWUXNFMHPHWRG\
`
Po umieszczeniu w ciele klasy deklaracja taka będzie wyglą-
dała następująco:
FODVVQD]ZDBNODV\
^
W\SBZ\QLNXQD]ZDBPHWRG\DUJXPHQW\B
´PHWRG\
^
LQVWUXNFMHPHWRG\
`
`
Jeśli metoda nie zwraca żadnego wyniku, jako typ wyniku
należy zastosować słowo
YRLG
, jeśli natomiast nie przyjmuje
żadnych argumentów, pomiędzy znakami nawiasu okrągłego
nie należy nic wpisywać.
Przykład:
FODVV3XQNW
^
LQW[
LQW\
YRLGZ\VZLHWO:VSROU]HGQH
^
6\VWHPRXWSULQWOQZVSyáU]ĊGQD[
´ [
6\VWHPRXWSULQWOQZVSyáU]ĊGQD\
´ \
`
`
Odwołania do metod obiektu
Po utworzeniu obiektu do jego metod można odwoływać się
(podobnie jak w przypadku pól) za pomocą operatora kropki
(
); schematycznie:
QD]ZDBRELHNWXQD]ZDBPHWRG\
Przykład:
3XQNWSXQNW QHZ3XQNW
SXQNWZ\VZLHWO:VSROU]HGQH
Argumenty metod
Metoda może mieć dowolną liczbę argumentów umiesz-
czonych w nawiasie okrągłym za jej nazwą. Poszczególne
argumenty należy oddzielić od siebie znakami przecinka;
schematycznie:
W\SBZ\QLNXQD]ZDBPHWRG\W\SBDUJXPHQWXB
´QD]ZDBDUJXPHQWXBW\SBDUJXPHQWXB
´QD]ZDBDUJXPHQWXBW\SBDUJXPHQWX
´B1QD]ZDBDUJXPHQWXB1
Przykład:
YRLGXVWDZ;<LQWZVS;LQWZVS<
^
[ ZVS;
\ ZVS<
`
Argumentami mogą być typy zarówno proste, jak i obiektowe.
Przeciążanie metod
W każdej klasie może istnieć dowolna liczba metod o takiej
samej nazwie, jeśli tylko różnią się przyjmowanymi argumen-
tami. Mogą, ale nie muszą się one różnić również typem zwra-
Instrukcja warunkowa if...else
Podstawowa instrukcja warunkowa ma postać:
LIZDUXQHN^
LQVWUXNFMH
`
HOVH^
LQVWUXNFMH
`
Oznacza to, że jeżeli
ZDUXQHN
jest prawdziwy, to zostaną
wykonane
LQVWUXNFMH
, w przeciwnym wypadku zosta-
ną wykonane
LQVWUXNFMH
. Blok
HOVH
jest opcjonalny.
Instrukcja warunkowa if...else if
Instrukcja złożona
LIHOVHLI
ma postać:
LIZDUXQHN^
LQVWUXNFMH
`
HOVHLIZDUXQHN^
LQVWUXNFMH
`
GDOV]HEORNLHOVHLI
HOVH^
LQVWUXNFMH1
`
Oznacza to, że jeżeli
ZDUXQHN
jest prawdziwy, to zosta-
ną wykonane
LQVWUXNFMH
, w przeciwnym wypadku,
jeżeli prawdziwy jest
ZDUXQHN
, zostaną wykonane
LQ
VWUXNFMH
. Liczba bloków
HOVH LI
nie jest ograni-
czona. Jeżeli żaden warunek nie będzie spełniony, zostaną
wykonane
LQVWUXNFMH1
z bloku
HOVH
. Blok
HOVH
jest
opcjonalny.
Przykład:
FODVV0DLQ
^
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
LQW[
LI[!^
6\VWHPRXWSULQWOQ[ZLĊNV]H
´RG]HUD
`
HOVHLI[^
6\VWHPRXWSULQWOQ[PQLHMV]H
´RG]HUD
`
HOVH^
6\VWHPRXWSULQWOQ[UyZQH]HUR
`
`
`
Instrukcja switch
Instrukcja warunkowa
VZLWFK
może zastąpić serię instrukcji
LIHOVHLI
:
VZLWFKZ\UDĪHQLH^
FDVHZDUWRĞü
LQVWUXNFMH
EUHDN
FDVHZDUWRĞü
LQVWUXNFMH
EUHDN
FDVHZDUWRĞü
LQVWUXNFMH
EUHDN
GHIDXOW
LQVWUXNFMH
`
Znaczenie jest takie samo, jak w innych językach programo-
wania. Jeżeli wartością wyrażenia jest
ZDUWRĞü
, wyko-
nywane są
LQVWUXNFMH
, jeżeli wartością wyrażenia jest
ZDUWRĞü
, wykonywane są
LQVWUXNFMH
itd. Jeżeli
nie uda się dopasować wartości wyrażenia do wartości wystę-
pujących po klauzulach
FDVH
, wykonywane są instrukcje wy-
stępujące po słowie
GHIDXOW
. Instrukcja
EUHDN
przerywa
wykonywanie bloku
VZLWFK
.
Operator warunkowy
Operator warunkowy ma postać:
ZDUXQHN"ZDUWRĞüZDUWRĞü
Zapis ten oznacza, że jeżeli
ZDUXQHN
jest prawdziwy, warto-
ścią wyrażenia staje się
ZDUWRĞü
, w przeciwnym wypadku
wartością wyrażenia staje się
ZDUWRĞü
.
FODVV0DLQ
^
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
LQWOLF]ED
LQWOLF]ED OLF]ED"
6\VWHPRXWSULQWOQOLF]ED
`
`
Pętla for
Pętla
IRU
ma ogólną postać:
IRUZ\UDĪHQLHSRF]ąWNRZHZ\UDĪHQLH
´ZDUXQNRZHZ\UDĪHQLHPRG\ILNXMąFH^
LQVWUXNFMHGRZ\NRQDQLD
`
x
Z\UDĪHQLH SRF]ąWNRZH
jest stosowane do
zainicjalizowania zmiennej używanej jako licznik liczby
wykonań pętli;
x
Z\UDĪHQLHZDUXQNRZH
określa warunek, jaki musi
być spełniony, aby dokonać kolejnego przejścia w pętli;
x
Z\UDĪHQLH PRG\ILNXMąFH
używane jest zwy-
kle do modyfikacji zmiennej będącej licznikiem.
Przykład:
IRULQWL LL^
6\VWHPRXWSULQWOQ3U]HELHJL
`
Rozszerzona pętla for
Począwszy od Javy w wersji 5.0 (1.5), dostępna jest rozsze-
rzona pętla
IRU
(z ang.
HQKDQFHG IRU
), nazywana też
pętlą typu
IRUHDFK
. Umożliwia ona automatyczną iterację
po obiekcie udostępniającym iterator (np. po kolekcji lub ta-
blicy). Konstrukcja jest następująca:
IRUW\SQD]ZDREM^
LQVWUXNFMH
`
W kolejnych przebiegach pętli pod
QD]ZD
będzie podsta-
wiana wartość kolejnego elementu (np. kolejnej komórki
tablicy). Pętla będzie działała tak długo, aż zostaną przejrzane
wszystkie elementy obiektu
REM
typu
W\S
. Przykład:
SXEOLFFODVV0DLQ^
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@^
LQWWDE>@ ^
´`
IRULQWYDOWDE^
6\VWHPRXWSULQWOQYDO
`
`
`
Pętla while
Ogólna postać pętli
ZKLOH
jest następująca:
ZKLOHZ\UDĪHQLHZDUXQNRZH^
LQVWUXNFMH
`
Oznacza to, że dopóki warunek jest prawdziwy, będą wykony-
wane instrukcje.
Przykład:
LQWL
ZKLOHL^
6\VWHPRXWSULQWOQ3U]HELHJL
L
`
Pętla do...while
Pętla
GRZKLOH
jest odmianą pętli
ZKLOH
i ma postać:
GR^
LQVWUXNFMH
`
ZKLOHZDUXQHN
Oznacza to, że
LQVWUXNFMH
będą wykonywane, dopóki
warunek jest prawdziwy.
Przykład:
LQWL
GR^
6\VWHPRXWSULQWOQ3U]HELHJL
`
ZKLOHL
Instrukcja break
Pętle pojedyncze
Instrukcja
EUHDN
powoduje przerwanie wykonywania bieżą-
cej iteracji pętli i opuszczenie bloku pętli.
Przykład:
LQWL
ZKLOHWUXH^
6\VWHPRXWSULQWOQ3U]HELHJL
LIL! EUHDN
`
Pętle zagnieżdżone
W przypadku pętli zagnieżdżonych instrukcja
EUHDN
po-
woduje przerwanie bieżącej iteracji jedynie tej pętli, w której
została umieszczona:
IRULQWL LL^
IRULQWM MM^
LIL EUHDNZW\PPLHMVFX
´]RVWDQLHSU]HUZDQHZ\NRQ\ZDQLHSĊWOL
´ZHZQĊWU]QHM
6\VWHPRXWSULQWOQLM
`
`
TABLICE
INSTRUKCJE JĘZYKA
S
S
S
S
S
S
S
S
canego wyniku. Technika ta jest nazywana przeciążaniem
(z ang.
overloading) metod. Przykład:
SXEOLFFODVV3XQNW
^
LQW[
LQW\
YRLGXVWDZ;<LQWZVS;LQWZVS<
^
[ ZVS;
\ ZVS<
`
YRLGXVWDZ;<3XQNWSXQNW
^
[ SXQNW[
\ SXQNW\
`
`
Rodzaje klas
Klasy w Javie można ogólnie podzielić na:
x
pakietowe,
x
publiczne,
x
wewnętrzne,
x
interfejsowe (patrz sekcja „Interfejsy”).
Jeśli przed nazwą klasy nie znajduje się modyfikator
SXE
OLF
, to jest to klasa pakietowa, czyli klasa dostępna jedynie
dla innych klas z tego samego pakietu. Jeśli natomiast przed
nazwą klasy znajduje się modyfikator
SXEOLF
, to jest to kla-
sa publiczna, czyli klasa dostępna dla wszystkich innych klas.
Deklaracja klasy pakietowej ma postać:
FODVVQD]ZDBNODV\
^
SRODLPHWRG\NODV\
`
Deklaracja klasy publicznej ma postać:
SXEOLFFODVVQD]ZDBNODV\
^
SRODLPHWRG\NODV\
`
Klasy wewnętrzne to klasy zdefiniowane wewnątrz innych
klas. Postać schematyczna:
>VSHF\ILNDWRUGRVWĊSX@FODVVNODVDB
´]HZQĊWU]QD
^
>VSHF\ILNDWRUGRVWĊSX@FODVVNODVDB
´ZHZQĊWU]QD
^
SRODLPHWRG\NODV\ZHZQĊWU]QHM
`
SRODLPHWRG\NODV\]HZQĊWU]QHM
`
Przykład klasy wewnętrznej (
,QVLGH
):
SXEOLFFODVV2XWVLGH
^
FODVV,QVLGH
^
`
`
Ponieważ klasy wewnętrzne są definiowane wewnątrz innych
klas, w pewnym sensie można je traktować jako składowe
tych klas, a zatem można też w stosunku do nich stosować
modyfikatory dostępu. W związku z tym klasy wewnętrzne
mogą być:
x
pakietowe,
x
publiczne,
x
prywatne,
x
chronione
i należy je traktować tak jak składowe wymienionych typów.
Konstruktory
Definicja konstruktora
Konstruktor to specjalna metoda, która jest wywoływana
zawsze po utworzeniu obiektu w pamięci. Metoda będąca
konstruktorem nigdy nie zwraca wyniku i musi mieć nazwę
zgodną z nawą klasy; schematycznie:
SXEOLFFODVVQD]ZDBNODV\
^
QD]ZDBNODV\
^
NRGNRQVWUXNWRUD
`
`
Przykład:
SXEOLFFODVV3XQNW
^
LQW[
LQW\
3XQNW
^
[
\
`
`
Argumenty konstruktorów
Konstruktor może być bezargumentowy albo może przyjmo-
wać argumenty używane (bezpośrednio lub pośrednio) np.
do zainicjowania pól obiektu. Argumenty przekazuje się do-
kładnie w taki sam sposób, jak w przypadku zwykłych metod;
schematycznie:
FODVVQD]ZDBNODV\
^
QD]ZDBNODV\W\SDUJXPHQWW\S
´DUJXPHQWW\S1DUJXPHQW1
^
NRGNRQVWUXNWRUD
`
`
Przykład:
SXEOLFFODVV3XQNW
^
LQW[
LQW\
3XQNWLQWZVS;LQWZVS<
^
[ ZVS;
\ ZVS<
`
`
Wywołanie konstruktora
Konstruktor bezargumentowy (czyli konstruktor domyślny)
jest wywoływany automatycznie w trakcie tworzenia obiektu
danej klasy, czyli po wykonaniu instrukcji:
QHZQD]ZDBNODV\
Jeżeli konstruktor wymaga podania argumentów, należy
umieścić je w nawiasie okrągłym, tak jak w przypadku zwy-
kłej metody:
QHZQD]ZDBNODV\DUJXPHQW\BNRQVWUXNWRUD
Przykład:
3XQNWSXQNW QHZ3XQNW
Przeciążanie konstruktorów
Konstruktory, tak jak zwykłe metody, mogą być przeciążane,
tzn. każda klasa może mieć kilka konstruktorów, jeśli tylko róż-
nią się one przyjmowanymi argumentami.
Przykład:
FODVV3XQNW
^
LQW[
LQW\
3XQNW
^
[
\
`
3XQNWLQWZVS;LQWZVS<
^
[ ZVS;
\ ZVS<
`
3XQNW3XQNWSXQNW
^
[ SXQNW[
\ SXQNW\
`
`
Konstruktor domyślny
Jeżeli w klasie nie będzie zdefiniowany żaden konstruktor, zo-
stanie do niej automatycznie dodany bezargumentowy kon-
struktor domyślny. Klasa taka będzie się zatem zachowywała
tak, jakby miała schematyczną postać:
SXEOLFFODVVQD]ZDBNODV\
^
QD]ZDBNODV\
^
`
SRODLPHWRG\NODV\
`
Jeżeli w klasie zostanie jawnie zdefiniowany konstruktor bez-
argumentowy, automatycznie stanie się on konstruktorem
domyślnym (jest to ważne przy dziedziczeniu), niezależnie od
tego, czy istnieją inne konstruktory.
Słowo kluczowe this
Słowo kluczowe
WKLV
to odwołanie do obiektu bieżącego.
Można je traktować jako referencję do aktualnego obiektu.
Odwołanie do pól i metod przez wskazanie
WKLV
odbywa się
za pomocą operatora kropki (
):
WKLVQD]ZDBSROD ZDUWRĞü
WKLVQD]ZDBPHWRG\DUJXPHQW\
Umożliwia to m.in. stosowanie w metodach i konstruktorach
argumentów o nazwach identycznych z nazwami pól klasy.
Przykład:
SXEOLFFODVV3XQNW
^
LQW[
LQW\
3XQNWLQW[LQW\
^
WKLV[ [
WKLV\ \
`
`
Składowe statyczne
Składowe statyczne są to pola i metody klasy, które mogą ist-
nieć, nawet jeśli nie istnieje obiekt tej klasy. Każda taka meto-
da lub takie pole są wspólne dla wszystkich obiektów tej klasy.
Składowe te oznaczane są słowem
VWDWLF
.
Metody statyczne
Metody statyczne oznacza się słowem
VWDWLF
, które zwy-
czajowo powinno znaleźć się zaraz za modyfikatorem dostę-
pu; schematycznie:
PRG\ILNDWRUBGRVWĊSXVWDWLFW\SB]ZUDFDQ\
´QD]ZDBPHWRG\DUJXPHQW\
^
WUHĞüPHWRG\
`
Przykład:
SXEOLFFODVV$
^
SXEOLFVWDWLFYRLGI
^
6\VWHPRXWSULQWOQ0HWRGDINODV\
´$
`
`
Tak napisaną metodę można wywołać klasycznie, tzn. po utwo-
rzeniu obiektu klasy
$
, np. w postaci:
$D QHZ$
DI
Ponieważ jednak metody statyczne istnieją nawet wtedy,
kiedy nie ma żadnego obiektu danej klasy, możliwe jest wy-
wołanie w postaci:
$I
Ogólniej metodę statyczną można wywołać w postaci:
QD]ZDBNODV\QD]ZDBPHWRG\DUJXPHQW\B
´PHWRG\
bez konieczności tworzenia obiektu danej klasy.
Pola statyczne
Pola statyczne są deklarowane przez umieszczenie słowa
VWDWLF
przed typem pola; schematycznie:
VWDWLFW\SBSRODQD]ZDBSROD
lub
PRG\ILNDWRUBGRVWĊSXVWDWLFW\SBSROD
´QD]ZDBSROD
Przykład:
SXEOLFFODVV$
^
SXEOLFVWDWLFLQWOLF]ED
`
Do pól statycznych można odwoływać się tak, jak do innych
pól klasy, poprzedzając je nazwą obiektu, czyli stosując kon-
strukcję:
QD]ZDBRELHNWXQD]ZDBSROD
bądź też poprzedzając je nazwą klasy:
QD]ZDBNODV\QD]ZDBSROD
Przykład:
$OLF]ED
Dziedziczenie
Klasy potomne
W Javie dziedziczenie wyraża się za pomocą słowa
H[WHQGV
.
Schematyczna konstrukcja jest następująca:
FODVVNODVDBSRWRPQDH[WHQGVNODVDBED]RZD
^
WUHĞüNODV\SRWRPQHM
`
Zapis taki oznacza, że klasa potomna dziedziczy z klasy
bazowej.
Przykład:
FODVV3XQNW
^
LQW[
LQW\
`
FODVV3XQNW'H[WHQGV3XQNW
^
LQW]
`
Konstruktory w klasach potomnych
Podczas tworzenia obiektu klasy potomnej zawsze wywoły-
wany jest domyślny, bezargumentowy konstruktor klasy ba-
zowej. Jeżeli w klasie bazowej nie istnieje konstruktor domyśl-
ny, wymagane jest jawne wywołanie jednego z pozostałych
konstruktorów. Wywołanie to wymaga zastosowania składni
ze słowem kluczowym
VXSHU
. Słowo to oznacza w tym przy-
padku wywołanie konstruktora klasy bazowej. Schematyczna
konstrukcja jest następująca:
SXEOLF
FODVVNODVDBSRWRPQDH[WHQGVNODVDBED]RZD
^
NODVDBSRWRPQD
^
VXSHUDUJXPHQW\
«GDOV]\NRGNRQVWUXNWRUD«
`
`
Jeśli metodzie
VXSHU
przekaże się argumenty, zostanie wy-
wołany konstruktor klasy bazowej, który tym argumentom
odpowiada. Ważne jest, aby metoda
VXSHU
była pierwszą
instrukcją konstruktora klasy potomnej.
Przykład:
FODVV3XQNW
^
LQW[
LQW\
3XQNWLQW[LQW\
^
WKLV[ [
WKLV\ \
`
`
FODVV3XQNW'H[WHQGV3XQNW
^
LQW]
3XQNW'LQW[LQW\LQW]
^
VXSHU[\
WKLV] ]
`
`
Modyfikatory dostępu
Przed każdym polem i każdą metodą może wystąpić modyfi-
kator (inaczej specyfikator) dostępu, określający prawa dostę-
pu do składowych klasy. Wyróżnia się cztery rodzaje dostępu:
x
publiczny,
x
prywatny,
x
chroniony,
x
pakietowy.
Domyślnie, jeżeli przed składową klasy nie występuje żadne
określenie, dostęp jest pakietowy, co oznacza, że dostęp do
tej składowej mają wyłącznie klasy pakietu, w którym się ona
znajduje. Dostęp publiczny jest określany słowem
SXEOLF
,
dostęp prywatny — słowem
SULYDWH
, a chroniony — sło-
wem
SURWHFWHG
.
Dostęp publiczny
Jeżeli dana składowa klasy jest publiczna, oznacza to, że
mają do niej dostęp wszystkie inne klasy, czyli dostęp nie jest
w żaden sposób ograniczony. Modyfikator dostępu
SXEOLF
należy zatem umieścić przed nazwą typu, co schematycznie
wygląda tak:
SXEOLFQD]ZDBW\SXQD]ZDB]PLHQQHM
Podobnie jest z metodami — modyfikator dostępu powinien
być pierwszym elementem deklaracji:
SXEOLFW\SB]ZUDFDQ\QD]ZDBPHWRG\
´DUJXPHQW\
Przykład:
FODVV3XQNW
^
SXEOLFLQW[
SXEOLFLQW\
SXEOLFLQWSRELHU];
^
UHWXUQ[
`
SXEOLFLQWSRELHU]<
^
UHWXUQ\
`
`
Dostęp prywatny
Składowe oznaczone słowem
SULYDWH
to takie, które do-
stępne są jedynie z wnętrza danej klasy, tzn. wszystkie metody
danej klasy mogą je dowolnie odczytywać, zapisywać (pola)
i wywoływać (metody), natomiast żadna inna klasa nie może
ich ani odczytać, ani zapisać. Modyfikator dostępu
SULYDWH
należy umieścić przed nazwą typu; schematycznie:
SULYDWHQD]ZDBW\SXQD]ZDB]PLHQQHM
Podobnie jest z metodami — specyfikator dostępu powinien
być pierwszym elementem deklaracji:
SULYDWHW\SB]ZUDFDQ\QD]ZDBPHWRG\
´DUJXPHQW\
Przykład:
FODVV3XQNW
^
SULYDWHLQW[
SULYDWHLQW\
SXEOLFLQWSRELHU];
^
UHWXUQ[
`
SXEOLFLQWSRELHU]<
^
UHWXUQ\
`
`
Dostęp chroniony
Składowe klasy, oznaczone słowem
SURWHFWHG
, to skła-
dowe chronione. Są one dostępne jedynie dla metod danej
klasy, klas potomnych oraz klas z tego samego pakietu.
Specyfikator dostępu
SURWHFWHG
należy umieścić przed
nazwą typu, co schematycznie wygląda tak:
SURWHFWHGQD]ZDBW\SXQD]ZDB]PLHQQHM
Podobnie jest z metodami — specyfikator dostępu powinien
być pierwszym elementem deklaracji:
SURWHFWHGW\SB]ZUDFDQ\QD]ZDBPHWRG\
´DUJXPHQW\
Przykład:
FODVV3XQNW
^
SURWHFWHGLQW[
SURWHFWHGLQW\
SURWHFWHGLQWSRELHU];
^
UHWXUQ[
`
SURWHFWHGLQWSRELHU]<
^
UHWXUQ\
`
`
Dostęp pakietowy
Dostęp pakietowy jest dostępem domyślnym, stosowanym,
kiedy przed składową klasy nie występuje żaden modyfikator
dostępu. Konstrukcja taka oznacza, że dostęp do składowej
mają wszystkie klasy pakietu, w którym się ona znajduje.
Przykład:
FODVV3XQNW
^
LQW[
LQW\
LQWSRELHU];
^
UHWXUQ[
`
LQWSRELHU]<
^
UHWXUQ\
`
`
Klasy i składowe finalne
Klasy finalne
Klasa finalna to taka, z której nie wolno wyprowadzać innych
klas, innymi słowy: taka, z której nie mogą dziedziczyć inne
klasy. Pozwala to tworzyć klasy, których postać będzie z góry
ustalona. Jeśli klasa ma stać się klasą finalną, należy przed jej
nazwą umieścić słowo kluczowe
ILQDO
, zgodnie ze sche-
matem:
PRG\ILNDWRUBGRVWĊSXILQDOFODVV
´QD]ZDBNODV\
^
SRODLPHWRG\NODV\
`
Przykład:
SXEOLFILQDOFODVV([DPSOH
^
SXEOLFLQWOLF]ED
SXEOLFYRLGZ\VZLHWO
^
6\VWHPRXWSULQWOQOLF]ED
`
`
Pola finalne
Pole klasy oznaczone słowem
ILQDO
staje się polem final-
nym, czyli takim, którego wartość jest stała i nie można jej
zmieniać. Słowo kluczowe
ILQDO
umieszcza się zwyczajowo
przed nazwą typu danego pola:
ILQDOW\SBSRODQD]ZDBSROD
lub ogólniej:
PRG\ILNDWRUBGRVWĊSX>VWDWLF@ILQDOW\SB
´SRODQD]ZDBSROD
Poprawne są wszystkie poniższe deklaracje:
ILQDOLQWOLF]ED
SXEOLFILQDOGRXEOHOLF]ED
SXEOLFVWDWLFILQDOFKDU]QDN
Po takiej deklaracji pierwsze przypisanie wartości ustala nie-
zmienną wartość pola.
Deklaracja może też być połączona z inicjalizacją, np.:
SXEOLFILQDOGRXEOHOLF]ED
Jeśli pole finalne jest typu referencyjnego, np.:
ILQDO3XQNWSXQNW QHZ3XQNW
oznacza to, że nie można zmieniać pierwotnie przypisanej re-
ferencji. Nic jednak nie stoi na przeszkodzie, aby modyfikować
pola obiektu wskazywanego przez tę referencję, np.:
SXQNW[
Metody finalne
Metoda oznaczona słowem
ILQDO
staje się metodą finalną,
co oznacza, że nie będzie możliwe jej przesłonięcie w klasie
potomnej. Słowo
ILQDO
umieszczane jest przed typem war-
tości zwracanej przez metodę:
ILQDOW\SB]ZUDFDQ\QD]ZDBPHWRG\
´DUJXPHQW\
lub ogólniej:
PRG\ILNDWRUBGRVWĊSX>VWDWLF@ILQDOW\SB
´]ZUDFDQ\QD]ZDBPHWRG\DUJXPHQW\
Prawidłowe są następujące przykładowe deklaracje:
ILQDOYRLGPHWRGD^ NRGPHWRG\ `
SXEOLFILQDOLQWPHWRGD^ NRG
´PHWRG\ `
SXEOLFVWDWLFILQDOYRLGPHWRGD
´^ NRGPHWRG\ `
3
Tablice informatyczne. Java. Wydanie III
S
S
S
S
ciąg dalszy na stronie 5
Î
SXEOLFVWDWLFILQDOLQWPHWRGDLQW
´DUJXPHQW^ NRGPHWRG\ `
Argumenty finalne
Argument finalny to taki, którego nie wolno zmieniać w ciele
metody. Aby uczynić argument finalnym, należy umieścić
słowo
ILQDO
przed jego typem. Schematycznie:
PRG\ILNDWRUBGRVWĊSX>VWDWLF@>ILQDO@
W\SB]ZUDFDQ\QD]ZDBPHWRG\ILQDOW\SB
´DUJXPHQWXQD]ZDBDUJXPHQWX
Na przykład deklaracja publicznej metody o nazwie
PHWR
GD
, która nie zwraca żadnej wartości, lecz przyjmuje jeden
finalny argument typu
LQW
o nazwie
DUJXPHQW
, będzie
miała postać:
SXEOLFYRLGPHWRGDILQDOLQWDUJXPHQW
^
WUHĞüPHWRG\
`
Klasy i metody abstrakcyjne
Klasy i metody abstrakcyjne deklaruje się za pomocą słowa
kluczowego
DEVWUDFW
. Jeżeli w klasie znajduje się co naj-
mniej jedna metoda abstrakcyjna, klasa taka musi być również
zadeklarowana jako abstrakcyjna (nie wyklucza to istnienia
klas abstrakcyjnych, w których żadna z metod nie jest abs-
trakcyjna):
>SXEOLF@DEVWUDFWFODVVQD]ZDBNODV\^
>VSHF\ILNDWRUBGRVWĊSX@DEVWUDFWW\SB
´]ZUDFDQ\QD]ZDBPHWRG\DUJXPHQW\
`
Metoda abstrakcyjna ma jedynie definicję, nie może zawierać
żadnego kodu. Przykładowa publiczna i abstrakcyjna klasa
6KDSH
zawierająca abstrakcyjną metodę
GUDZ
będzie
miała postać:
SXEOLFDEVWUDFWFODVV6KDSH^
SXEOLFDEVWUDFWYRLGGUDZ
`
Po takiej deklaracji nie można będzie tworzyć obiektów klasy
6KDSH
.
Zadeklarowanie metody jako abstrakcyjnej wymusza jej rede-
klarację w klasie potomnej.
4
Tablice informatyczne. Java. Wydanie III
Tworzenie interfejsu
Interfejs to klasa czysto abstrakcyjna, czyli taka, w której
wszystkie metody traktuje się jako abstrakcyjne. Interfejs
deklaruje się za pomocą słowa kluczowego
LQWHUIDFH
.
Interfejs może być publiczny, jeśli jest zdefiniowany w pliku
o takiej samej nazwie jak nazwa interfejsu, lub pakietowy
(dostępny jedynie dla klas wchodzących w skład danego pa-
kietu). Schematyczna konstrukcja interfejsu jest następująca:
>SXEOLF@LQWHUIDFHQD]ZDBLQWHUIHMVX^
W\SB]ZUDFDQ\QD]ZDBPHWRG\DUJXPHQW\
W\SB]ZUDFDQ\QD]ZDBPHWRG\DUJXPHQW\
GDOV]HPHWRG\LQWHUIHMVX
W\SB]ZUDFDQ\QD]ZDBPHWRG\1DUJXPHQW\
`
Przykładowy interfejs o nazwie
'UDZDEOH
zawierający
deklarację jednej tylko metody o nazwie
GUDZ
będzie miał
postać:
SXEOLFLQWHUIDFH'UDZDEOH^
SXEOLFYRLGGUDZ
`
Implementowanie interfejsu
To, że klasa ma implementować dany interfejs, zaznacza się,
wykorzystując słowo kluczowe
LPSOHPHQWV
; schema-
tycznie:
>VSHF\ILNDWRUGRVWĊSX@>DEVWUDFW@
FODVVQD]ZDBNODV\LPSOHPHQWVQD]ZDB
´LQWHUIHMVX^
«SRODLPHWRG\NODV\«
`
Jeśli więc przykładowa klasa
6KDSH
ma implementować
przedstawiony wyżej interfejs
'UDZDEOH
, powinna mieć
postać:
SXEOLFFODVV6KDSHLPSOHPHQWV'UDZDEOH^
SXEOLFYRLGGUDZ^
ZQĊWU]HPHWRG\GUDZ
`
`
Pola interfejsu
Pola interfejsu są jednocześnie publiczne, statyczne i finalne
— trzeba im przypisać wartości już w momencie ich deklara-
cji. Deklaracja pola interfejsu nie różni się od deklaracji pola
klasy. Zgodnie z konwencją przyjmuje się, że nazwy takich
pól pisze się wielkimi literami, a poszczególne człony nazwy
oddziela się znakiem podkreślenia, np.:
SXEOLFLQWHUIDFH1RZ\,QWHUIHMV^
LQW32/(B7<38B,17
GRXEOH32/(B7<38B'28%/(
2EMHFW32/(B7<38B2%-(&7 QHZ2EMHFW
`
Instrukcja try...catch
Do przechwytywania wyjątków służy blok instrukcji
WU\FDWFK
o schematycznej, podstawowej postaci:
WU\^
LQVWUXNFMHPRJąFHVSRZRGRZDüZ\MąWHN
`
FDWFK7\S:\MąWNXLGHQW\ILNDWRU:\MąWNX^
REVáXJDZ\MąWNX
`
W nawiasie klamrowym, występującym po słowie
WU\
,
umieszcza się instrukcję (instrukcje), która może spowodo-
wać wystąpienie błędu. W bloku występującym po
FDWFK
należy umieścić kod, który ma zostać wykonany, kiedy wy-
stąpi wyjątek.
Przykład:
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
LQWWDE>@ QHZLQW>@
WU\^
SU]HNURF]HQLHLQGHNVXWDEOLF\
WDE>@
`
FDWFK$UUD\,QGH[2XW2I%RXQGV([FHSWLRQH^
SU]HFKZ\FHQLHZ\MąWNX
6\VWHPRXWSULQWOQ1LHSUDZLGáRZ\
´LQGHNVWDEOLF\
`
`
Hierarchia wyjątków
Każdy wyjątek jest obiektem pewnej klasy. Klasy podlegają
z kolei regułom dziedziczenia, zgodnie z którymi powstaje
hierarchia klas. Wszystkie typowe wyjątki, które można stan-
dardowo przechwytywać w aplikacjach za pomocą bloku
WU\FDWFK
, dziedziczą (bezpośrednio lub pośrednio)
z klasy
([FHSWLRQ
, dziedziczącej z klas
7KURZDEOH
oraz
2EMHFW
. Wynika z tego ważna właściwość: jeżeli dana
instrukcja może wygenerować wyjątek typu X, to można za-
wsze przechwycić wyjątek ogólniejszy, czyli wyjątek, którego
typem będzie jedna z klas nadrzędnych w stosunku do X.
Przechwytywanie wielu wyjątków
W jednym bloku
WU\FDWFK
można przechwytywać
wiele wyjątków. Konstrukcja taka zawiera wtedy jeden blok
WU\
i wiele bloków
FDWFK
:
WU\^
LQVWUXNFMHPRJąFHVSRZRGRZDü
´Z\MąWHN
`
FDWFK.ODVD:\MąWNXLGHQW\ILNDWRU
´:\MąWNX^
REVáXJDZ\MąWNX
`
FDWFK.ODVD:\MąWNXLGHQW\ILNDWRU
´:\MąWNX^
REVáXJDZ\MąWNX
`
«GDOV]HEORNLFDWFK«
FDWFK.ODVD:\MąWNX1LGHQW\ILNDWRU
´:\MąWNX1^
REVáXJDZ\MąWNXQ
`
Po wygenerowaniu wyjątku maszyna wirtualna sprawdza,
czy jego typem jest
.ODVD:\MąWNX
— jeśli tak, to wy-
konywane są instrukcje obsługi tego wyjątku i blok
WU\
FDWFK
jest opuszczany. Jeżeli jednak typem wyjątku nie jest
.ODVD:\MąWNX
, wtedy sprawdza się, czy jest on typu
.ODVD:\MąWNX
itd.
Przy przechwytywaniu wielu wyjątków w jednym bloku nale-
ży pamiętać o ich hierarchii. Ogólna zasada jest taka: nie ma
znaczenia kolejność, jeżeli wszystkie wyjątki są na jednym
poziomie hierarchii. Jeśli jednak przechwytywane są wyjątki
z różnych poziomów, najpierw muszą to być wyjątki bardziej
szczegółowe, czyli stojące niżej w hierarchii, a dopiero po
nich wyjątki bardziej ogólne, czyli stojące wyżej w hierarchii.
Przykład:
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
WU\^
LQWOLF]ED
`
FDWFK$ULWKPHWLF([FHSWLRQH^
6\VWHPRXWSULQWOQH
`
FDWFK5XQWLPH([FHSWLRQH^
6\VWHPRXWSULQWOQH
`
FDWFK([FHSWLRQH^
6\VWHPRXWSULQWOQH
`
`
Zagnieżdżanie bloków try...catch
Bloki
WU\FDWFK
można zagnieżdżać. W jednym bloku
przechwytującym wyjątek X może istnieć drugi blok, który
będzie przechwytywał wyjątek Y. Schematycznie taka kon-
strukcja ma postać:
WU\^
LQVWUXNFMHPRJąFHVSRZRGRZDü
´Z\MąWHN
WU\^
LQVWUXNFMHPRJąFHVSRZRGRZDü
´Z\MąWHN
`
FDWFK7\S:\MąWNXLGHQW\ILNDWRU
´:\MąWNX^
REVáXJDZ\MąWNX
`
`
FDWFK7\S:\MąWNXLGHQW\ILNDWRU
´:\MąWNX^
REVáXJDZ\MąWNX
`
Przykład:
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
3XQNWSXQNW QXOO
LQWOLF]ED
WU\^
WU\^
OLF]ED
`
FDWFK$ULWKPHWLF([FHSWLRQH^
6\VWHPRXWSULQWOQ1LHSUDZLGáRZD
´RSHUDFMDDU\WPHW\F]QD
6\VWHPRXWSULQWOQ3U]\SLVXMĊ
´]PLHQQHMOLF]EDZDUWRĞü
OLF]ED
`
SXQNW[ OLF]ED
`
FDWFK([FHSWLRQH^
6\VWHPRXWSULQWOQ%áąGRJyOQ\
6\VWHPRXWSULQWOQH
`
`
Zgłaszanie wyjątków
Zgłoszenie własnego wyjątku polega na utworzeniu nowego
obiektu jednej z klas wyjątków. Za pomocą instrukcji
QHZ
należy utworzyć nowy obiekt klasy, która dziedziczy (pośred-
nio lub bezpośrednio) z klasy
7KURZDEOH
. W najbardziej
ogólnym przypadku będzie to klasa
([FHSWLRQ
. Tak utwo-
rzony obiekt musi stać się parametrem instrukcji
WKURZ
, np.:
WKURZQHZ([FHSWLRQ
Jeśli taki wyjątek zostanie obsłużony przez znajdującą się
w danym bloku (danej metodzie) instrukcję
WU\
FDWFK
, nie trzeba robić nic więcej. Jeśli jednak nie zostanie
obsłużony, w specyfikacji metody należy zaznaczyć, że może
ona taki wyjątek zgłaszać. Wymaga to zastosowania instrukcji
WKURZV
w ogólnej postaci:
VSHF\ILNDWRUBGRVWĊSX>VWDWLF@>ILQDO@
´W\SB]ZUDFDQ\QD]ZDBPHWRG\DUJXPHQW\
WKURZV.ODVD:\MąWNX.ODVD:\MąWNX
´.ODVD:\MąWNX1
^
WUHĞüPHWRG\
`
Przykład:
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
WKURZV([FHSWLRQ
^
WKURZQHZ([FHSWLRQ
`
Jeżeli zgłaszany wyjątek ma otrzymać własny komunikat,
należy przekazać go jako argument konstruktora klasy
([FHSWLRQ
:
WKURZQHZ([FHSWLRQNRPXQLNDW
lub:
([FHSWLRQH[FHSWLRQ QHZ
´([FHSWLRQNRPXQLNDW
WKURZH[FHSWLRQ
Ponowne zgłaszanie wyjątków
Raz przechwycony wyjątek można zgłosić ponownie
(„wyrzucić”), wykorzystując instrukcję
WKURZ
:
WU\^
LQVWUXNFMHPRJąFHVSRZRGRZDü
´Z\MąWHN
`
FDWFKW\S:\MąWNXLGHQW\ILNDWRU:\MąWNX^
LQVWUXNFMHREVáXJXMąFHV\WXDFMĊ
´Z\MąWNRZą
WKURZLQGHQW\ILNDWRU:\MąWNX
`
Przykład:
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
WU\^
LQWOLF]ED
`
FDWFK$ULWKPHWLF([FHSWLRQH^
6\VWHPRXWSULQWOQ7XZ\MąWHN
´]RVWDáSU]HFKZ\FRQ\
SRQRZQH]JáRV]HQLHZ\MąWNX
WKURZH
`
`
Tworzenie wyjątków
W Javie można tworzyć własne klasy wyjątków. Należy napisać
klasę pochodną, dziedziczącą pośrednio lub bezpośrednio
z klasy
7KURZDEOH
. W praktyce wyjątki najczęściej są wy-
prowadzane z klasy
([FHSWLRQ
i klas od niej pochodnych:
SXEOLFFODVVQD]ZDBNODV\H[WHQGV([FHSWLRQ
^
WUHĞüNODV\
`
Przykład (nowy wyjątek
*HQHUDO([FHSWLRQ
):
SXEOLFFODVV*HQHUDO([FHSWLRQH[WHQGV
´([FHSWLRQ
^
`
Zgłoszenie wyjątku
*HQHUDO([FHSWLRQ
:
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
WKURZV*HQHUDO([FHSWLRQ
^
WKURZQHZ*HQHUDO([FHSWLRQ
`
Sekcja finally
Do bloku
WU\
możemy dołączyć sekcję
ILQDOO\
, która
będzie wykonywana zawsze, niezależnie od tego, co będzie
działo się w bloku
WU\
; schematycznie:
WU\^
LQVWUXNFMHPRJąFHVSRZRGRZDüZ\MąWHN
`
FDWFK^
LQVWUXNFMHVHNFMLFDWFK
`
ILQDOO\^
LQVWUXNFMHVHNFMLILQDOO\
`
Sekcję
ILQDOO\
można stosować w przypadku dowolnych
instrukcji, nie ma też konieczności przechwytywania wyjąt-
ku. Stosowana jest wtedy konstrukcja
WU\ILQDOO\
w postaci:
WU\^
LQVWUXNFMH
`
ILQDOO\^
LQVWUXNFMH
`
Kod z bloku
ILQDOO\
zostanie wykonany zawsze, niezależ-
nie od tego, jakie instrukcje znajdują się w bloku
WU\
.
Tworzenie pakietów
Klasy w Javie grupowane są w jednostki nazywane pakieta-
mi. Pakiet to inaczej biblioteka, zestaw powiązanych tema-
tycznie klas. Do tworzenia pakietów służy słowo kluczowe
SDFNDJH
, po którym następuje nazwa pakietu, zakończona
znakiem średnika; schematycznie:
SDFNDJHQD]ZDBSDNLHWX
Instrukcja ta musi znajdować się na początku pliku, przed nią
nie może być żadnych innych instrukcji. Przed
SDFNDJH
mogą występować jedynie komentarze:
SDNLHWLNODVDSDNLHWRZD
SDFNDJHQD]ZDBSDNLHWX
FODVVQD]ZDBNODV\
^
WUHĞüNODV\
`
Aby skorzystać z klasy zawartej w pakiecie w innej klasie, na-
leży użyć dyrektywy
LPSRUW
w postaci:
LPSRUWQD]ZDBSDNLHWXQD]ZDBNODV\
Dyrektywa
LPSRUW
musi znajdować się na początku pliku.
Aby zaimportować wszystkie klasy z danego pakietu, dyrek-
tywa
LPSRUW
powinna mieć postać:
LPSRUWQD]ZDBSDNLHWX
Przykład:
LPSRUWMDYDLR
Nazwy pakietów
Nazwy pakietów powinny być pisane w całości małymi lite-
rami, a jeśli pakiet ma być udostępniony publicznie, należy
poprzedzić go odwróconą nazwą domeny twórcy pakietu.
Nie jest to obligatoryjne, ale pozwala na utworzenie, z dużym
prawdopodobieństwem, nazwy unikatowej w skali globu.
Jeżeli np. domeną autora jest
marcinlis.com i ma powstać
pakiet o nazwie
grafika, jego pełna nazwa będzie brzmieć:
com.marcinlis.grafika. Wszystkie klasy tego pakietu będą
musiały zostać umieszczone w strukturze katalogów odpo-
wiadających tej nazwie.
Uogólnianie w klasach
Jeśli w klasie ma być użyty typ uogólniony (z ang. generic
type), należy to zaznaczyć w jej definicji za pomocą nawiasu
kątowego umieszczonego za nazwą klasy. W nawiasie trzeba
umieścić identyfikatory typów, które zostaną zastosowane,
oddzielając je od siebie znakami przecinka; schematycznie:
>SXEOLF@FODVVQD]ZDBNODV\LGLG
´«LG1!
^
WUHĞüNODV\
`
Każdy z identyfikatorów może być następnie użyty we
wnętrzu klasy jako określenie konkretnego typu danych.
Zwyczajowo stosuje się identyfikatory jednoliterowe (rozpo-
czynając od litery T), jednak nie jest to ograniczenie formalne
(identyfikator typu może być wieloznakowy). Przykład klasy
przechowującej jedną wartość dowolnego typu:
SXEOLFFODVV2SDNRZDQLH7!^
SXEOLF7YDO
`
Przykład klasy przechowującej dwie wartości dwóch do-
wolnych typów:
SXEOLFFODVV2SDNRZDQLH79!^
SXEOLF7YDO
SXEOLF9YDO
`
Przy deklaracji zmiennych klasy korzystającej z typów uogól-
nionych należy podać w nawiasie kątowym określenia kon-
kretnych typów; schematycznie:
QD]ZDBNODV\LGLG«LG1!QD]ZDB
´]PLHQQHM
Przykład:
2SDNRZDQLH,QWHJHU!RS
2SDNRZDQLH,QWHJHU6WULQJ!RS
Analogicznie należy postąpić przy tworzeniu obiektów;
schematycznie:
QHZQD]ZDBNODV\LGLG«LG1!
Przykład:
2SDNRZDQLH,QWHJHU!RS QHZ
´2SDNRZDQLH,QWHJHU!
2SDNRZDQLH,QWHJHU6WULQJ!RS QHZ
´2SDNRZDQLH,QWHJHU6WULQJ!
Po takich definicjach możliwe będą m.in. następujące przy-
pisania:
RSYDO
RSYDO QHZ,QWHJHU
RSYDO
RSYDO DEF[\]
Uogólnianie metod
Uogólnianie metod jest niezależne od uogólnień klas, więc
w klasie uogólnionej mogą się znajdować nieuogólnione
metody, a uogólnione metody mogą się znajdować w zwy-
kłych klasach. Jeśli metoda ma operować na argumencie
typu ogólnego, to specyfikację tego typu należy umieścić
przed typem zwracanym przez metodę; ogólnie:
>PRG\ILNDWRUBGRVWĊSX@LGLG«LG1!
´W\SB]ZUDFDQ\QD]ZDBPHWRG\DUJXPHQW\
^
WUHĞüPHWRG\
`
Przykład:
SXEOLFFODVV0DLQ
^
SXEOLFVWDWLF8!YRLGVKRZ8YDO
^
6\VWHPRXWSULQWOQYDOWR6WULQJ
`
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
VKRZQHZ2EMHFW
VKRZQHZ,QWHJHU
`
`
INTERFEJSY
WYJĄTKI
PAKIETY
TYPY UOGÓLNIONE
S
S
S
S
S
S
S
S
S
S
Deklaracja
Opis
3ULQW6WUHDPDSSHQGFKDUF
Dodaje znak do strumienia
3ULQW6WUHDPDSSHQG&KDU6HTXHQFHFVT
Dodaje do strumienia sekwencję znaków
3ULQW6WUHDPDSSHQG&KDU6HTXHQFHFVT
´
LQWVWDUWLQWHQG
Dodaje do strumienia część sekwencji znaków wyznaczaną
przez indeksy
VWDUW
i
HQG
ERROHDQFKHFN(UURU
Opróżnia bufor oraz sprawdza, czy nie wystąpił błąd
SURWHFWHGYRLGFOHDU(UURU
Zeruje status błędu
YRLGFORVH
Zamyka strumień
YRLGIOXVK
Powoduje opróżnienie bufora
3ULQW6WUHDPIRUPDW/RFDOHO6WULQJ
´
IRUPDW2EMHFW«DUJV
Zapisuje w strumieniu dane określone przez argumenty
DUJV
w formacie zdefiniowanym przez
IRUPDW
, zgodnie z ustawienia-
mi narodowymi wskazanymi przez
O
3ULQW6WUHDPIRUPDW6WULQJIRUPDW
´
2EMHFW«DUJV
Zapisuje w strumieniu dane określone przez argumenty
DUJV
w formacie określonym przez
IRUPDW
YRLGSULQWERROHDQE
Wyświetla wartość typu
ERROHDQ
YRLGSULQWFKDUF
Wyświetla znak
YRLGSULQWFKDU>@V
Wyświetla tablicę znaków
YRLGSULQWGRXEOHG
Wyświetla wartość typu
GRXEOH
YRLGSULQWIORDWI
Wyświetla wartość typu
IORDW
YRLGSULQWLQWL
Wyświetla wartość typu
LQW
YRLGSULQWORQJO
Wyświetla wartość typu
ORQJ
YRLGSULQW2EMHFWREM
Wyświetla ciąg znaków uzyskany przez wywołanie metody
WR6WULQJ
obiektu
REM
YRLGSULQW6WULQJV
Wyświetla ciąg znaków
V
3ULQW6WUHDPSULQWI/RFDOHO6WULQJ
´
IRUPDW2EMHFW«DUJV
Zapisuje w strumieniu dane określone przez argumenty
DUJV
w formacie zdefiniowanym przez
IRUPDW
, zgodnie z ustawienia-
mi narodowymi wskazanymi przez
O
3ULQW6WUHDPSULQWI6WULQJIRUPDW
´
2EMHFW«DUJV
Zapisuje w strumieniu dane określone przez argumenty
DUJV
w formacie określonym przez
IRUPDW
YRLGSULQWOQ
Wyświetla znak końca linii (powoduje przejście do nowej linii)
YRLGSULQWOQERROHDQE
Wyświetla wartość typu
ERROHDQ
oraz znak końca linii
YRLGSULQWOQFKDUF
Wyświetla znak zapisany w
F
oraz znak końca linii
YRLGSULQWOQFKDU>@WDE
Wyświetla tablicę znaków
WDE
oraz znak końca linii
YRLGSULQWOQGRXEOHG
Wyświetla wartość typu
GRXEOH
oraz znak końca linii
YRLGSULQWOQIORDWI
Wyświetla wartość typu
IORDW
oraz znak końca linii
YRLGSULQWOQLQWL
Wyświetla wartość typu
LQW
oraz znak końca linii
YRLGSULQWOQORQJO
Wyświetla wartość typu
ORQJ
oraz znak końca linii
YRLGSULQWOQ2EMHFWREM
Wyświetla ciąg znaków uzyskany przez wywołanie metody
WR6WULQJ
obiektu
REM
oraz znak końca linii
YRLGSULQWOQ6WULQJV
Wyświetla ciąg znaków
V
oraz znak końca linii
SURWHFWHGYRLGVHW(UURU
Ustawia strumień w stan błędu
YRLGZULWHE\WH>@EXILQWRII
´
LQWOHQ
Zapisuje do strumienia bajty z tablicy
EXI
, w liczbie wskazywa-
nej przez
OHQ
, poczynając od komórki określonej przez
RII
YRLGZULWHLQWE
Zapisuje bajt
E
do strumienia
System plików
Klasa File
Klasa
)LOH
pozwala na wykonywanie podstawowych operacji na plikach i katalogach, takich jak ich tworzenie i usuwanie,
operacje na nazwach czy pobieranie parametrów (np. czasu utworzenia bądź modyfikacji). Nie jest to jednak klasa, która umoż-
liwiałaby modyfikację zawartości pliku. Wybrane metody udostępniane przez klasę
)LOH
zostały zebrane w poniższej tabeli.
Typ
Nazwa metody
Opis
ERROHDQ
FDQ([HFXWH
Sprawdza, czy aplikacja może uruchomić dany plik
ERROHDQ
FDQ5HDG
Sprawdza, czy aplikacja może odczytywać dany plik
ERROHDQ
FDQ:ULWH
Sprawdza, czy aplikacja ma prawa zapisu do danego pliku
LQW
FRPSDUH7R)LOHSDWKQDPH
Porównuje ścieżki dostępu do plików
VWDWLF)LOH FUHDWH7HPS)LOH6WULQJ
´
SUHIL[6WULQJVXIIL[
Tworzy pusty plik tymczasowy. Nazwa tego pliku powstaje
przy wykorzystaniu prefiksu i sufiksu przekazanych
w parametrach.
VWDWLF)LOH
FUHDWH7HPS)LOH6WULQJ
´
SUHIL[6WULQJVXIIL[
´
ERROHDQGHOHWH2Q([LW
´
)LOH$WWULEXWH"!DWWUV
Tworzy pusty plik tymczasowy o atrybutach wskazanych
przez
DWWUV
. Argument
GHOHWH2Q([LW
wskazuje, czy
plik ma być automatycznie usunięty po zakończeniu pracy
maszyny wirtualnej. Metoda dostępna od JDK 1.7.
VWDWLF)LOH
FUHDWH7HPS)LOH6WULQJ
´
SUHIL[6WULQJVXIIL[
´
)LOHGLUHFWRU\
Tworzy pusty plik tymczasowy w katalogu wskazywanym
przez argument
GLUHFWRU\
ERROHDQ
GHOHWH
Usuwa plik lub katalog
YRLG
GHOHWH2Q([LW
Zaznacza, że plik ma zostać usunięty, kiedy maszyna
wirtualna będzie kończyć pracę
ERROHDQ
H[LVWV
Sprawdza istnienie pliku lub katalogu
)LOH
JHW$EVROXWH)LOH
Zwraca obiekt zawierający bezwzględną nazwę pliku
lub katalogu (wraz z pełną ścieżką dostępu)
6WULQJ
JHW$EVROXWH3DWK
Zwraca bezwzględną ścieżkę dostępu do pliku lub katalogu
)LOH
JHW&DQRQLFDO)LOH
Zwraca obiekt zawierający kanoniczną postać nazwy pliku
lub katalogu (wraz z pełną ścieżką dostępu)
6WULQJ
JHW&DQRQLFDO3DWK
Zwraca kanoniczną postać ścieżki dostępu do pliku
lub katalogu
ORQJ
JHW)UHH6SDFH
Zwraca ilość wolnego miejsca na partycji wskazywanej
przez bieżący obiekt typu
)LOH
6WULQJ
JHW1DPH
Zwraca nazwę pliku (bez ścieżki dostępu)
6WULQJ
JHW3DUHQW
Zwraca nazwę katalogu nadrzędnego
)LOH
JHW3DUHQW)LOH
Zwraca obiekt wskazujący na katalog nadrzędny
6WULQJ
JHW3DWK
Zwraca nazwę bieżącego katalogu lub pliku w postaci
obiektu typu
6WULQJ
ORQJ
JHW7RWDO6SDFH
Zwraca całkowity rozmiar partycji wskazywanej przez
bieżący obiekt
ORQJ
JHW8VDEOH6SDFH
Zwraca ilość miejsca dostępnego dla maszyny wirtualnej
na partycji wskazywanej przez bieżący obiekt
LQW
KDVK&RGH
Oblicza wartość funkcji skrótu dla danej ścieżki dostępu
ERROHDQ
LV$EVROXWH
Sprawdza, czy dana ścieżka dostępu jest ścieżką bez-
względną
ERROHDQ
LV'LUHFWRU\
Sprawdza, czy ścieżka dostępu wskazuje na katalog
ERROHDQ
LV)LOH
Sprawdza, czy ścieżka dostępu wskazuje na plik
ERROHDQ
LV+LGGHQ
Sprawdza, czy ścieżka dostępu wskazuje na ukryty katalog
lub plik
ORQJ
ODVW0RGLILHG
Zwraca czas ostatniej modyfikacji pliku lub katalogu
ORQJ
OHQJWK
Zwraca wielkość pliku w bajtach
6WULQJ>@
OLVW
Zwraca zawartość katalogu w postaci tablicy obiektów
typu
6WULQJ
6WULQJ>@
OLVW)LOHQDPH)LOWHUILOWHU
Zwraca listę plików i podkatalogów spełniających kryteria
wskazane przez
ILOWHU
)LOH>@
OLVW)LOHV
Zwraca zawartość katalogu w postaci obiektów typu
)LOH
)LOH>@
OLVW)LOHV)LOH)LOWHUILOWHU
Zwraca zawartość katalogu spełniającą kryteria wskazane
przez
ILOWHU
w postaci obiektów typu
)LOH
Standardowy strumień wejściowy
Standardowy strumień wejściowy jest reprezentowany przez obiekt
6\VWHPLQ
, czyli obiekt
LQ
zawarty w klasie
6\VWHP
(statyczne i finalne pole klasy). Jest to obiekt typu
,QSXW6WUHDP
(klasy reprezentującej strumienie wejściowe). Metody udo-
stępniane przez tę klasę zostały zebrane w poniższej tabeli.
Typ zwracany
Metoda
Opis
LQW
DYDLODEOH
Zwraca liczbę bajtów, które mogą być odczytane ze strumienia
YRLG
FORVH
Zamyka strumień i zwalnia związane z nim zasoby
YRLG
PDUNLQWUHDGOLPLW
Zaznacza bieżącą pozycję w strumieniu
ERROHDQ
PDUN6XSSRUWHG
Sprawdza, czy strumień może obsługiwać metody
PDUN
i
UHVHW
DEVWUDFWLQW UHDG
Odczytuje kolejny bajt ze strumienia
LQW
UHDGE\WH>@E
Odczytuje ze strumienia liczbę bajtów nie większą niż rozmiar tabli-
cy
E
. Zwraca faktycznie odczytaną liczbę bajtów.
LQW
UHDGE\WH>@E
LQWRIILQWOHQ
Odczytuje ze strumienia liczbę bajtów nie większą niż wskazywana
przez
OHQ
, i zapisuje je w tablicy
E
, począwszy od komórki wska-
zywanej przez
RII
. Zwraca faktycznie przeczytaną liczbę bajtów.
YRLG
UHVHW
Wraca do pozycji strumienia wskazywanej przez wywołanie metody
PDUN
ORQJ
VNLSORQJQ
Pomija w strumieniu liczbę bajtów wskazywanych przez
Q
. Zwraca
faktycznie pominiętą liczbę bajtów.
Wczytywanie tekstu za pomocą klasy buforowej
Należy skorzystać z metody
UHDG/LQH
klasy
%XIIHUHG5HDGHU
. Aby utworzyć obiekt tej klasy powiązany ze standardowym
strumieniem wejściowym
6\VWHPLQ
, trzeba dodatkowo utworzyć obiekt pośredniczący klasy
,QSXW6WUHDP5HDGHU
,
stosując konstrukcję:
%XIIHUHG5HDGHUEU,Q QHZ%XIIHUHG5HDGHU
QHZ,QSXW6WUHDP5HDGHU6\VWHPLQ
Przykład:
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
%XIIHUHG5HDGHUEU,Q QHZ%XIIHUHG5HDGHU
QHZ,QSXW6WUHDP5HDGHU6\VWHPLQ
6\VWHPRXWSULQWOQ:SURZDGĨZLHUV]WHNVWX]DNRĔF]RQ\]QDNLHP(QWHU
WU\^
6WULQJOLQH EU,QUHDG/LQH
6\VWHPRXWSULQW:SURZDG]RQDOLQLDWROLQH
`
FDWFK,2([FHSWLRQH^
6\VWHPRXWSULQWOQ%áąGSRGF]DVRGF]\WXVWUXPLHQLD
`
`
Wprowadzanie liczb
Do wprowadzania wartości liczbowych można zastosować klasę
6WUHDP7RNHQL]HU
, która dzieli strumień wejściowy na
jednostki leksykalne, czyli tokeny. Ma ona pole o nazwie
QYDO
, które zawiera wartość aktualnego tokena w postaci liczby typu
GRXEOH
(o ile ten token jest liczbą). Typ tokena można rozpoznać, odczytując stan pola
WW\SH
, które może przyjmować na-
stępujące wartości:
x
6WUHDP7RNHQL]HU77B(2)
— osiągnięty został koniec strumienia;
x
6WUHDP7RNHQL]HU77B(2/
— osiągnięty został koniec linii;
x
6WUHDP7RNHQL]HU77B180%(5
— token jest liczbą;
x
6WUHDP7RNHQL]HU77B:25'
— token jest słowem.
Przykład:
LPSRUWMDYDLR
SXEOLFFODVV0DLQ
^
SXEOLFVWDWLFYRLGPDLQ6WULQJDUJV>@
^
6WUHDP7RNHQL]HUVWU7RN QHZ6WUHDP7RNHQL]HU
QHZ%XIIHUHG5HDGHU
QHZ,QSXW6WUHDP5HDGHU6\VWHPLQ
6\VWHPRXWSULQW:SURZDGĨOLF]EĊ
WU\^
VWU7RNQH[W7RNHQ
`
FDWFK,2([FHSWLRQH^
6\VWHPRXWSULQW%áąGSRGF]DVRGF]\WXGDQ\FK]HVWUXPLHQLD
UHWXUQ
`
LIVWU7RNWW\SH 6WUHDP7RNHQL]HU77B180%(5^
6\VWHPRXWSULQW7RQLHMHVWSUDZLGáRZDOLF]ED
UHWXUQ
`
GRXEOHOLF]ED VWU7RNQYDO
6\VWHPRXWSULQW:SURZDG]RQDOLF]EDWROLF]ED
`
`
5
Tablice informatyczne. Java. Wydanie III
WSPÓŁPRACA Z SYSTEMEM
Klasa Scanner
Począwszy od wersji Javy 5.0 (1.5), do przetwarzania danych
wejściowych można używać klasy
6FDQQHU
. Zawiera ona
konstruktory, które mogą przyjmować obiekty klas:
)LOH
,
,QSXW5HDGHU
i
6WULQJ
, a także obiekty implementujące
interfejsy
5HDGDEOH
lub
5HDGDEOH%\WH&KDQQHO
. Jest
to więc zestaw pozwalający na obsługę bardzo wielu formatów
wejściowych. Metod klasy
6FDQQHU
jest bardzo wiele, a najbar-
dziej przydatne są te z rodziny
QH[W
i
KDV1H[W
, konstruowa-
ne na bardzo prostych zasadach, które schematycznie można
przedstawić jako:
KDV1H[W1D]ZD7\SX3URVWHJR
oraz:
QH[W1D]ZD7\SX3URVWHJR
Istnieją więc metody:
KDV1H[W
,
KDV1H[W,QW
,
KDV1H[W
'RXEOH
,
KDV1H[W%\WH
itd. Wszystkie one zwracają wartość
WUXH
, jeśli w powiązanym strumieniu danych kolejną jednostką
leksykalną jest wartość danego typu prostego, natomiast „pusta”
metoda
KDV1H[W
zwraca wartość
WUXH
, jeżeli w strumieniu
istnieje jakakolwiek kolejna jednostka leksykalna. Dodatkowo
istnieje metoda
KDV1H[W/LQH
, która określa, czy w strumie-
niu znajduje się wiersz tekstu.
Metody z rodziny
QH[W
, a więc:
QH[W,QW
,
QH[W'RXEOH
,
QH[W%\WH
itd., zwracają kolejną jednostkę leksykalną w postaci
wartości danego typu prostego. Metoda
QH[W
zwraca z kolei to-
ken w postaci ciągu znaków, a
QH[W/LQH
— cały wiersz tekstu.
Przykład:
LPSRUWMDYDXWLO
SXEOLFFODVV0DLQ^
SXEOLFVWDWLFYRLGPDLQ6WULQJ
´DUJV>@^
6FDQQHUVFDQQHU QHZ
´6FDQQHU6\VWHPLQ
6\VWHPRXWSULQW:SURZDGĨZDUWRĞü
´FDáNRZLWą
ZKLOHVFDQQHUKDV1H[W,QW^
6\VWHPRXWSULQW7RQLHMHVW
´ZDUWRĞüFDáNRZLWD
6\VWHPRXWSULQWOQVFDQQHU
´QH[W
6\VWHPRXWSULQW:SURZDGĨ
´ZDUWRĞüFDáNRZLWą
`
LQWYDOXH VFDQQHUQH[W,QW
LQWUHVXOW YDOXH
6\VWHPRXWSULQWOQYDOXH
´ UHVXOW
`
`
Standardowy strumień wyjściowy
Dane można wyprowadzać (np. na ekran konsoli) za pomocą instrukcji
6\VWHPRXWSULQWOQ
lub
6\VWHPRXW
SULQW
, czyli przez wywołanie metody
SULQWOQ
lub
SULQW
obiektu
6\VWHPRXW
. Jest to obiekt klasy
3ULQW6WUHDP
.
Metody udostępniane przez tę klasę zostały zebrane w tabeli u góry po prawej.
S
S
ISBN: 978-83-246-4707-1
•
•
•
•
•
Wydawnictwo Helion
ul. Kościuszki 1c, 44-100 Gliwice
tel. 32 230 98 63
e-mail: helion@helion.pl
http://helion.pl
Informatyka w najlepszym wydaniu
Zapis do pliku
Przykład:
Zwraca zawartość katalogu spełniającą kryteria wskazane
przez
w postaci obiektów typu
Wyświetla wszystkie „korzenie” systemu plików
Tworzy nowy katalog
Tworzy nowy katalog z uwzględnieniem nieistniejących
katalogów nadrzędnych
Zmienia nazwę na wskazywaną przez argument
Ustawia prawo wykonywalności dla danego pliku lub
katalogu
Ustawia datę ostatniej modyfikacji pliku lub katalogu
Ustawia prawo do odczytu dla danego pliku lub katalogu
Ustawia atrybut
pliku lub katalogu
Ustawia prawo do zapisu dla danego pliku lub katalogu
Zwraca ścieżkę dostępu w postaci obiektu klasy
¡
¡
Przekształca ścieżkę dostępu na obiekt URI
Klasa RandomAccessFile
Klasa
pozwala na wykonywanie wszelkich operacji na plikach o dostępnie swobodnym, a także na
odczytywanie i zapisywanie danych z pliku i do niego oraz przemieszczanie się po pliku. Jest dostępna we wszystkich JDK,
począwszy od wersji 1.0. Wybrane metody udostępniane przez
zostały zebrane w poniższej tabeli.
Typ
Metoda
Opis
Zamyka strumień oraz zwalnia wszystkie związane z nim zasoby
¢
¢
Zwraca powiązany z plikiem unikatowy obiekt typu
¢
£ £
Zwraca deskryptor pliku powiązanego ze strumieniem
¤
Zwraca aktualną pozycję w pliku
Zwraca długość pliku
Odczytuje jeden bajt danych z pliku
Odczytuje z pliku liczbę bajtów, nie większą niż rozmiar tablicy
, i umieszcza je w tej tablicy. Zwraca faktycznie odczytaną
liczbę bajtów.
Odczytuje z pliku liczbę bajtów, nie większą niż wskazywana
przez
, i zapisuje je w tablicy
, począwszy od komórki
wskazywanej przez
. Zwraca faktycznie przeczytaną
liczbę bajtów.
Odczytuje wartość typu
Odczytuje wartość typu
¢
Odczytuje wartość typu
£
Odczytuje wartość typu
Odczytuje wartość typu
Odczytuje liczbę bajtów równą wielkości tablicy
. Zwraca
liczbę faktycznie odczytanych bajtów.
Odczytuje liczbę bajtów, wskazywaną przez
, i zapisuje je
w tablicy
, począwszy od komórki wskazywanej przez
.
Zwraca faktycznie przeczytaną liczbę bajtów.
Odczytuje wartość typu
Odczytuje wiersz tekstu
Odczytuje wartość typu
Odczytuje wartość typu
¡
Odczytuje 8-bitową wartość bez znaku
¡
Odczytuje 16-bitową wartość bez znaku
¡
Odczytuje tekst w kodowaniu UTF-8
Zmienia wskaźnik pozycji w pliku na
¥
Ustawia rozmiar pliku na
Pomija
bajtów
Zapisuje tablicę bajtów
do pliku
Zapisuje do pliku
bajtów z tablicy
, począwszy od
komórki wskazywanej przez
Zapisuje bajt
do pliku
Zapisuje do pliku wartość
w postaci jednego bajta
Zapisuje bajt
do pliku
Zapisuje do pliku ciąg znaków, wskazywany przez
, w postaci
ciągu bajtów
¢
Zapisuje do pliku wartość typu
w postaci dwóch bajtów
¢
Zapisuje do pliku ciąg wskazywany przez
w postaci ciągu
znaków
£
Konwertuje wartość
na typ
, korzystając z metody
klasy
£
, i tak powstałą
wartość zapisuje do pliku
Konwertuje wartość
na typ
, korzystając z metody
klasy
, i tak powstałą wartość
zapisuje do pliku
Zapisuje do pliku wartość typu
w postaci czterech bajtów
Zapisuje do pliku wartość typu
w postaci ośmiu bajtów
Zapisuje do pliku wartość typu
w postaci dwóch
bajtów
¡
Zapisuje do pliku ciąg znaków, wskazywany przez
,
w kodowaniu UTF-8
Odczyt pliku
Przykład:
Tablice informatyczne. Java. Wydanie III
Strumieniowe operacje na plikach
Odczyt danych
Podstawowe klasy odczytujące dane z plików to:
,
.
Pierwsza z nich powinna być stosowana podczas korzystania
ze strumienia znakowego, czyli dla plików tekstowych, druga
— podczas korzystania ze strumienia binarnego, czyli dla pli-
ków binarnych. Obie klasy mają po trzy przeciążone konstruk-
tory, których argumentami mogą być:
ciąg znaków zawierający nazwę pliku,
obiekt klasy
£
,
obiekt klasy
.
Metody odczytujące dane klasy
:
Typ Metoda
Opis
Odczytuje pojedynczy znak
Odczytuje liczbę znaków, nie
większą niż wskazywana przez
, i zapisuje je w tablicy
, począwszy od komórki
wskazywanej przez
.
Zwraca faktycznie przeczytaną
liczbę znaków.
Metody odczytujące dane klasy
:
Typ Metoda
Opis
Odczytuje jeden bajt danych
Odczytuje liczbę bajtów, nie
większą od długości tablicy
,
i zapisuje je w tablicy
. Zwraca
faktycznie odczytaną liczbę
bajtów.
Odczytuje liczbę bajtów, nie
większą niż wskazywana przez
, i zapisuje je w tablicy
, począwszy od komórki
wskazywanej przez
.
Zwraca faktycznie przeczytaną
liczbę bajtów.
Metod tych można używać bezpośrednio lub też wykorzy-
stać obiekty klas
i
jako argumenty dla konstruktorów klas dających więk-
szą funkcjonalność, np.
lub
.
Zapis danych
Podstawowe klasy zapisujące dane z plików to:
,
.
Pierwsza z nich powinna być wykorzystywana do zapisu plików
tekstowych, druga — do zapisu strumieni binarnych. Obie klasy
mają po pięć przeciążonych konstruktorów. Trzy z nich są jed-
noargumentowe i mogą przyjmować następujące argumenty:
ciąg znaków zawierający nazwę pliku,
obiekt klasy
£
,
obiekt klasy
.
Pozostałe konstruktory są dwuargumentowe. Pierwszy przyj-
muje ciąg znaków oraz wartość
, drugi — obiekt
klasy
i wartość
. W obu przypadkach drugi
argument ustawiony na
oznacza, że dane mają być do-
pisywane na końcu pliku, a ustawiony na
— że dane
mają być zapisywane od początku pliku (nadpisując jego wcze-
śniejszą zawartość).
Wszystkie konstruktory generują wyjątek
, jeśli:
podana nazwa wskazuje na katalog, a nie na plik;
podany plik nie istnieje i nie można go również utworzyć;
nie można z jakiegoś powodu otworzyć istniejącego pliku.
Metody zapisujące dane klasy
:
Typ zwracany Metoda
Opis
Zapisuje do stru-
mienia
znaków
z tablicy
,
począwszy od ko-
mórki wskazywanej
przez
Zapisuje do stru-
mienia znak
Zapisuje do
strumienia
znaków z ciągu
, począwszy
od znaku o indeksie
wskazywanym
przez
Metody zapisujące dane klasy
:
Typ zwracany Metoda
Opis
Zapisuje tablicę
bajtów
do
strumienia
Zapisuje do
strumienia
bajtów z tablicy
, począwszy
od komórki
wskazywanej
przez
Zapisuje bajt
do strumienia