Java kak centr arhipelaga
Original etoj stat'i nahoditsya na WWW servere firmy Jet Infosystems
Aleksandr Taranov,
Vladimir Cishevskij
1. Vvedenie
2. Internet, WWW i Intranet
3. Java, Joe, NEO
4. Java - yazyk i tehnologiya
4.1. YAzyk Java
4.1.1. Ob容ktnaya model' yazyka Java
4.1.2. Primitivnye tipy dannyh
4.1.3. Pakety
4.1.4. Upravlyayushchie konstrukcii
4.1.5. Isklyuchitel'nye situacii
4.1.6. Mehanizm potokov
4.2. Tehnologiya Java
4.2.1. Tehnologicheskij cikl obrabotki Java-programm
4.2.2. Java-mashina
4.2.3. Java i bezopasnost'
4.2.4. Java WorkShop
4.3. Svyaz' Java s okruzheniem: okonnyj instrumentarij
4.3.1. Obshchie polozheniya
4.3.2. Iz chego stroitsya graficheskij interfejs (komponenty i kontejnery)
4.3.3. Kak organizovat' interfejs
4.3.4. Sobytiya
4.3.5. Metody klassa Component, svyazannye s obrabotkoj sobytij
5. Joe - tehnologiya svyazyvaniya Java-programm s ob容ktnymi biz-
nes-prilozheniyami
6. Zaklyuchenie
Kogda govoryat i pishut o Java, samoj populyarnoj frazoj yavlyaetsya
"mir soshel s uma". Dejstvitel'no, i skorost', i harakter rasp-
rostraneniya (tak i hochetsya vspomnit' leksikon nedavnego proshlo-
go i skazat' o "pobednom shestvii") ne imeyut analogov. Pri poyav-
lenii al'fa-versii produkta vystraivaetsya ochered' na ego licen-
zirovanie (ris. 1).
Ris. 1. Oni hotyat licenzirovat' tehnologiyu Java (snimok sdelan
na ostrove YAva).
Beta-versiya stanovitsya instrumentom realizacii informacionnyh
sistem krupnyh kompanij. Akcii kompanij, imeyushchih prochnye pozi-
cii v Internet, rastut, kak na drozhzhah. Vse brosilis' realizo-
vyvat' WWW-navigatory s podderzhkoj Java i boryutsya za pravo pe-
redat' ih v besplatnoe ispol'zovanie kak mozhno bol'shemu chislu
klientov. Idet srazhenie za dolyu budushchego rynka, kontury kotoro-
go poka tol'ko namechayutsya, srazhenie s primeneniem sredstv, ko-
torye s tochki zreniya "zdravogo biznesa" inache kak dikimi i naz-
vat' nel'zya.
V chem prichina vseobshchego pomeshatel'stva i chto eto za produkt,
okoldovavshij mir? Popytaemsya sovsem korotko vyskazat' nekotorye
soobrazheniya po pervomu voprosu, posle chego perejdem na chisto
tehnicheskie rel'sy i sosredotochimsya na opisanii tehnologii i
yazyka Java i associirovannyh produktov.
Personal'nye komp'yutery sdelali informacionnye tehnologii
chast'yu massovoj kul'tury. Pri millionnyh tirazhah dazhe edinst-
vennyj "komp'yuternyj hit" sposoben prinesti ochen' bol'shie den'-
gi. Avtory mnogih podobnyh hitov, pomimo bogatstva, poluchayut
kolossal'noe vliyanie na lyudej, chto po sushchestvu yavlyaetsya istoch-
nikom ogromnogo dopolnitel'nogo obogashcheniya. I tem ne menee, uzhe
dovol'no dlitel'naya istoriya razvitiya personal'nyh komp'yuterov
ne znala nichego, podobnogo fenomenu Java. CHto izmenilos' v mire
v poslednie gody, pochemu etot fenomen stal vozmozhen?
Izmenilsya Internet. On stal dostupen millionam lyudej, dalekih
ot tehnicheskih problem. CHislo pol'zovatelej Internet po poryadku
velichiny uzhe ne otlichaetsya ot chisla pol'zovatelej personal'nyh
komp'yuterov i prodolzhaet vzryvoobrazno rasti. Odnovremenno In-
ternet obespechil takuyu skorost' rasprostraneniya novinok infor-
macionnyh tehnologij, kotoruyu ne mogli i nikogda ne smogut dat'
tradicionnye kanaly sbyta. Vremya spressovalos'. V Internete,
opozdav bukval'no na den', komp'yuternaya kompaniya, dazhe krupnaya,
riskuet ser'ezno oslabit' svoi pozicii srazu vo vsem mire.
2. Internet, WWW i Intranet
Informacionnye peregruzki - harakternaya cherta nashego vremeni.
Sozdany moshchnye mehanizmy, obespechivayushchie proizvodstvo ogromnogo
kolichestva informacii. Sushchestvenno men'she sdelano dlya oblegche-
niya ee polucheniya i ispol'zovaniya.
Tipichnoj yavlyaetsya situaciya, kogda iniciativa prinadlezhit pos-
tavshchiku, a ne potrebitelyu informacii. Postavshchik po opredelenno-
mu povodu sozdaet informaciyu i napravlyaet ee vsem, kto, po ego
mneniyu, v nej nuzhdaetsya (ris. 2).
Ris. 2. Dostavka informacii po iniciative postavshchika
Tak rabotayut sredstva massovoj informacii, izdatel'stva, rek-
lamnye agentstva. Tak rabotaet elektronnaya pochta. V bol'shinstve
sluchaev potrebitelyu eta informaciya, mozhet byt', i nuzhna, no ne
v dannyj moment, ne sejchas. Potrebitel' vynuzhden arhivirovat'
poluchennuyu informaciyu. Pri etom v luchshem sluchae velika veroyat-
nost', chto k momentu, kogda informaciya dejstvitel'no ponadobit-
sya, ona poteryaet aktual'nost'. Obychno zhe u potrebitelya prosto
nakaplivayutsya gory musora, v kotorom otyskat' nechto nuzhnoe poch-
ti nevozmozhno.
CHtoby informaciya byla aktual'noj dlya potrebitelya, ona dolzhna
dostavlyat'sya k nemu po zaprosu - v tochnosti togda, kogda v nej
voznikla neobhodimost'. Krome togo, postavshchik dolzhen sohranyat'
vozmozhnost' upravleniya informaciej, on dolzhen ne tol'ko sozda-
vat' ee, no i vovremya obnovlyat' i unichtozhat'.
Centralizovannye komp'yuternye sistemy, dominirovavshie eshche 10
let nazad, pozvolyali pol'zovatelyam sravnitel'no legko nahodit'
informaciyu v operativnom rezhime, odnako oni zatrudnyali upravle-
nie informaciej, poskol'ku ee istochniki, kak pravilo, raznorod-
ny i territorial'no razneseny. Eshche odin vazhnyj nedostatok cent-
ralizovannyh sistem - ih slozhnost' i dorogovizna (ris. 3).
Ris. 3. Vzaimodejstvie s centralizovannoj komp'yuternoj sistemoj
Podavlyayushchemu bol'shinstvu rossijskih organizacij oni prosto ne
po karmanu.
Seti personal'nyh komp'yuterov sushchestvenno deshevle centralizo-
vannyh sistem, oni ostavlyayut za postavshchikom neobhodimuyu svobodu
upravleniya informaciej, odnako potrebitelyam prihoditsya iskat'
neobhodimye dannye na mnozhestve mashin, sredi bol'shogo chisla
prilozhenij (ris. 4).
Ris. 4. Poluchenie informacii iz seti personal'nyh komp'yuterov
Ryadovomu pol'zovatelyu rabotat' v takoj raznorodnoj prikladnoj
srede krajne neudobno.
Sposob razresheniya ukazannyh problem, k kotoromu pribegayut vedu-
shchie kompanii, sostoit v postroenii informacionnoj struktury or-
ganizacii po obrazu i podobiyu Internet, s Web-servisom v ka-
chestve konceptual'noj osnovy (ris. 5).
Ris. 5. Universal'nyj klient Web-servisa
Vozmozhnost' hraneniya dannyh razlichnyh tipov (tekst, grafika,
audio, video) v sochetanii s mehanizmami svyazyvaniya informacii,
raspolozhennoj v raznyh uzlah komp'yuternoj seti, pozvolyayut rass-
redotachivat' informaciyu v sootvetstvii s estestvennym poryadkom
ee sozdaniya i potrebleniya, osushchestvlyat' edinoobraznyj dostup,
otpravlyayas' ot nebol'shogo chisla izvestnyh "kornej". Tem samym
postavshchik mozhet effektivno gotovit' i kontrolirovat' informa-
ciyu, a potrebitel' v sostoyanii bez truda najti neobhodimye dan-
nye imenno togda, kogda oni stali nuzhny.
Sredstva Web, pomimo svyazyvaniya raspredelennyh dannyh, osu-
shchestvlyayut eshche odnu ochen' vazhnuyu funkciyu. Oni pozvolyayut rassmat-
rivat' informaciyu s nuzhnoj stepen'yu detalizacii, chto sushchestven-
no uproshchaet analiz bol'shih ob容mov dannyh. Mozhno bystro otob-
rat' samoe interesnoe, a zatem izuchit' vybrannyj material vo
vseh podrobnostyah.
Takim obrazom, Web-servery i Web-navigatory mogut i dolzhny is-
pol'zovat'sya ne tol'ko v "mirovom masshtabe". Web - eto infrast-
rukturnyj servis, neobhodimyj kazhdoj organizacii so skol'ko-ni-
bud' zametnymi informacionnymi potokami.
V to zhe vremya, Web-servisu prisushchi i opredelennye nedostatki,
vytekayushchie iz otsutstviya sostoyanij v HTTP-protokole. Vo-pervyh,
klient po sushchestvu lishen sredstv upravleniya vneshnim predstavle-
niem ob容ktov na prosmatrivaemoj WWW-stranice (edinstvennoe,
chto on mozhet sdelat', eto smenit' WWW-navigator).
Vo-vtoryh, Web-stranicy statichny. Pri ispol'zovanii protokola
HTTP, na klientskuyu sistemu peredayutsya tol'ko passivnye dannye,
no ne metody ob容ktov. Iz obshchih soobrazhenij ochevidna ogranichen-
nost' podobnogo podhoda. Dannyj nedostatok, razumeetsya, svyazan
s pervym. Ob容kt sam dolzhen znat', kak sebya pokazyvat' - tochnee
govorya, on dolzhen eto vyyasnit', proanalizirovav klientskoe ok-
ruzhenie.
V-tret'ih, Web-servis obladaet ves'ma ogranichennymi interaktiv-
nymi vozmozhnostyami, kotorye svodyatsya k zapolneniyu pol'zovatelem
chisto tekstovyh form s posleduyushchej otpravkoj na server. Takaya
forma obshcheniya vpolne ustraivala pol'zovatelej terminalov ES |VM
let 15 nazad. Sejchas ee yavno nedostatochno.
Java-tehnologiya pozvolyaet ustranit' vse otmechennye nedostatki.
Kak imenno - budet yasno iz posleduyushchego izlozheniya. V rezul'tate
Web-servis, i bez togo imevshij ogromnuyu populyarnost', poluchil
kak by novyj impul's. |tot ekspress ponessya vpered s udvoennoj
skorost'yu, uvlekaya za soboj i Java.
V uzkom smysle slova Java - eto ob容ktno-orientirovannyj yazyk,
napominayushchij C++, no bolee prostoj dlya osvoeniya i ispol'zova-
niya. V bolee shirokom smysle Java - eto celaya tehnologiya prog-
rammirovaniya, iznachal'no rasschitannaya na integraciyu s Web-ser-
visom, to est' na ispol'zovanie v setevoj srede, Poskol'ku Web-
navigatory sushchestvuyut prakticheski dlya vseh apparatno-programm-
nyh platform, Java-sreda dolzhna byt' kak mozhno bolee mobil'noj,
v ideale polnost'yu nezavisimoj ot platformy.
S cel'yu resheniya perechislennyh problem byli prinyaty, pomimo in-
tegracii s Web-navigatorom, dva drugih vazhnejshih postulata.
- Byla specificirovana virtual'naya Java-mashina, na kotoroj
dolzhny vypolnyat'sya (interpretirovat'sya) Java-programmy. Oprede-
leny arhitektura, predstavlenie elementov dannyh i sistema ko-
mand Java-mashiny. Ishodnye Java-teksty transliruyutsya v kody
etoj mashiny. Tem samym, pri poyavlenii novoj apparatno-programm-
noj platformy v portirovanii budet nuzhdat'sya tol'ko Java-mashi-
na; vse programmy, napisannye na Java, pojdut bez izmenenij.
- Opredeleno, chto pri redaktirovanii vneshnih svyazej Java-prog-
rammy i pri rabote Web-navigatora prozrachnym dlya pol'zovatelya
obrazom mozhet osushchestvlyat'sya poisk neobhodimyh ob容ktov ne
tol'ko na lokal'noj mashine, no i na drugih komp'yuterah, dostup-
nyh po seti (v chastnosti, na WWW-servere). Najdennye ob容kty
zagruzhayutsya, a ih metody vypolnyayutsya zatem na mashine pol'zova-
telya.
Nesomnenno, mezhdu dvumya sformulirovannymi polozheniyami sushchestvu-
et tesnaya svyaz'. V kompiliruemoj srede trudno distancirovat'sya
ot apparatnyh osobennostej komp'yutera, kak trudno (hotya i mozh-
no) realizovat' prozrachnuyu dinamicheskuyu zagruzku po seti. S
drugoj storony, priem ob容ktov izvne trebuet povyshennoj osto-
rozhnosti pri rabote s nimi, a, znachit, i so vsemi Java-program-
mami. Prinimat' neobhodimye mery bezopasnosti proshche vsego v in-
terpretiruemoj, a ne kompiliruemoj srede. Voobshche, mobil'nost',
dinamizm i bezopasnost' - sputniki interpretatora, a ne kompi-
lyatora.
Prinyatye resheniya sdelali Java-sredu ideal'nym sredstvom razra-
botki klientskih komponentov Web-sistem. Osobo otmetim prozrach-
nuyu dlya pol'zovatelya dinamicheskuyu zagruzku ob容ktov po seti. Iz
etogo vytekaet takoe vazhnejshee dostoinstvo, kak nulevaya stoi-
most' administrirovaniya klientskih sistem, napisannyh na Java.
Dostatochno obnovit' versiyu ob容kta na servere, posle chego kli-
ent avtomaticheski poluchit imenno ee, a ne staryj variant. Bez
etogo real'naya rabota s razvitoj setevoj infrastrukturoj prak-
ticheski nevozmozhna. S drugoj storony, pri nalichii dinamicheskoj
zagruzki dejstvitel'no vozmozhno poyavlenie ustrojstv klassa
Java-terminalov, iznachal'no soderzhashchih tol'ko WWW-navigator, a
vse ostal'noe (i programmy, i dannye) poluchayushchih po seti.
Zdes' umestno otmetit' zamechatel'nuyu tochnost' v vybore osnovnyh
posylok proekta Java. Iz minimuma predpolozhenij vytekaet maksi-
mum novyh vozmozhnostej pri sohranenii praktichnosti realizacii.
V to zhe vremya, integraciya s WWW-navigatorom i interpretiruemaya
priroda Java-sredy stavyat vpolne opredelennye ramki dlya real'-
nogo ispol'zovaniya Java-programm (hotya, konechno zhe, yazyk Java
ne menee universalen, chem, skazhem, C++). Naprimer, izvestno,
chto interpretaciya, po sravneniyu s pryamym vypolneniem, primerno
na poltora poryadka medlennee. Trudno skazat', naskol'ko mogut
uluchshit' polozhenie kompilyaciya "na letu" i ispol'zovanie specia-
lizirovannyh Java-processorov, no poka ispol'zovanie Java na
servernoj storone predstavlyaetsya problematichnym.
Dalee, hotya tehnologiya Intranet, osnovannaya na ispol'zovanii
Web-servisa v kachestve informacionnoj osnovy organizacii, yavlya-
etsya ogromnym shagom vpered, sushchestvuyut i drugie servisy, kak
unasledovannye, tak i sovremennye (naprimer, relyacionnye SUBD),
kotorye obyazatel'no dolzhny vhodit' v sostav korporativnoj sis-
temy. Esli vsya svyaz' mezhdu klientami i upomyanutymi serverami
budet osushchestvlyat'sya cherez server WWW, poslednij stanet uzkim
mestom, a resheniya Intranet riskuyut lishit'sya takogo vazhnejshego
dostoinstva, kak masshtabiruemost'. Znachit, neobhodima pryamaya
svyaz' mezhdu klientskimi sistemami, napisannymi na yazyke Java, i
proizvol'nymi servisami (ris. 6).
Ris. 6. Pryamaya svyaz' mezhdu Java-klientami i korporativnymi ser-
verami.
Kak realizovat' takuyu svyaz'?
V obshchem vide otvet ocheviden - nuzhny sredstva dlya polnocennoj
integracii Java v raspredelennuyu ob容ktnuyu sredu. Na servernoj
storone kompaniya Sun Microsystems imeet sootvetstvuyushchuyu tehno-
logiyu - NEO (NEtworked Objects, setevye ob容kty). Tehnologiya
NEO udovletvoryaet specifikaciyam CORBA (Common Object Request
Broker Architecture), yavlyayushchimsya promyshlennym standartom. Pri
realizacii korporativnyh informacionnyh sistem s ispol'zovaniem
NEO naibolee estestvennym predstavlyaetsya ispol'zovanie trehu-
rovnevoj arhitektury s serverami prilozhenij, postroennymi na
ob容ktnyh principah, na vtorom urovne i s bazovymi i unasledo-
vannymi serverami na tret'em urovne (ris. 7).
Ris. 7. Trehurovnevaya arhitektura korporativnoj informacionnoj
sistemy.
K sozheleniyu, stol' obshchij otvet nikak ne pomogaet osushchestvlyat'
pryamuyu svyaz' mezhdu Java-klientom i NEO-serverom. Konechno, mozhno
vospol'zovat'sya standartnymi sredstvami programmirovaniya v se-
tevoj srede (a Java dopuskaet ispol'zovanie bibliotek, napisan-
nyh na C/C++, ravno kak i vstavku mashinnyh kodov), no esli eto
bylo by edinstvennoj vozmozhnost'yu, Java riskovala ostat'sya na
urovne "ozhivlyalok" dlya MS-Windows. V konce marta 1996 goda kom-
paniya SunSoft ob座avila o poyavlenii novogo produkta s imenem
Joe, kak raz i prednaznachennogo dlya sushchestvennogo oblegcheniya
vstraivaniya Java-klientov v informacionnye sistemy Intranet,
postroennye v trehurovnevoj arhitekture s ispol'zovaniem sredy
NEO (ris. 8).
Ris. 8. Raspredelenie rolej mezhdu Java, Joe i NEO.
Takim obrazom, slozhilas' polnaya i izumitel'no krasivaya kartina
organizacii sovremennyh Intranet-sistem. V dannoj stat'e my
udelim osnovnoe vnimanie tehnologii Java. Dalee budet kratko
rassmotreny vozmozhnosti, predostavlyaemye sistemoj Joe.
4. Java - yazyk i tehnologiya
Pri opisanii yazyka Java budet predpolagat'sya, chto chitatel', ho-
tya by v obshchih chertah, znakom s yazykom C++.
4.1.1. Ob容ktnaya model' yazyka Java
Kogda govoryat ob ob容ktno-orientirovannom yazyke programmirova-
niya, predpolagayut podderzhku treh mehanizmov:
- inkapsulyaciya
- nasledovanie
- polimorfizm.
Inkapsulyaciya i nasledovanie v yazyke Java realizuyutsya s pomoshch'yu
ponyatiya klassa.
Ponyatie klassa v yazykah Java i C++ ochen' blizki. Klass yavlyaetsya
shablonom dlya sozdaniya ob容ktov; on mozhet soderzhat' dannye i me-
tody. Privedem primer klassa, opisyvayushchego tochki v dvumernom
prostranstve (zdes' i dalee nomera strok ispol'zuyutsya dlya pos-
leduyushchih poyasnenij i ne yavlyayutsya chast'yu Java-programm).
1 class Point extends Object {
2 private double x;
3 private double y;
4 Point (double x, double y) {
5 this.x = x;
6 this.y = y;
7 }
8 Point () {
9 this (0.0, 0.0);
10 }
11 public void setX (double x) {
12 this.x = x;
13 }
14 public void setY (double y) {
15 this.y = y;
16 }
. . .
17 }
V yazyke Java nel'zya otryvat' opredelenie metoda (funkcii) ot
opisaniya zagolovka. Sintaksicheskaya konstrukciya class polnost'yu
vklyuchaet v sebya vsyu informaciyu o klasse. V chastnosti, realiza-
cii metodov obyazany soderzhat'sya vnutri etoj konstrukcii.
Dlya oboznacheniya nasledovaniya ispol'zuetsya klyuchevoe slovo
extends (stroka 1). Klass Object - eto koren' dereva nasledova-
niya. V Java ne byvaet klassov-"sirot": u vseh klassov, krome
Object, est' predshestvennik. Podrobnee nasledovanie i predopre-
delennye klassy budut rassmotreny dalee.
Rezhimy dostupa k elementam klassa (private, protected, public)
te zhe, chto i v C++, za odnim vazhnym isklyucheniem. Esli rezhim
dostupa opushchen, predpolagaetsya, chto sootvetstvuyushchij element
dostupen v predelah paketa (sm. dalee).
V stroke 9 priveden primer yavnogo vyzova odnogo konstruktora iz
drugogo.
Prochie privedennye vyshe stroki ne nuzhdayutsya v poyasneniyah krome
odnoj - otsutstvuyushchej. V yazyke Java ne byvaet destruktorov.
Prichina v tom, chto upravlenie pamyat'yu avtomatizirovano (v fono-
vom rezhime rabotaet sborshchik musora). Dlya vysvobozhdeniya prochih
resursov, associirovannyh s ob容ktom, sluzhit special'nyj metod
finalize. |tot metod vyzyvaetsya sborshchikom musora v moment uti-
lizacii pamyati, zanimavshejsya ob容ktom.
Klyuchevoe slovo this (sm., naprimer, stroki 5 i 9) ispol'zuetsya
dlya ssylki na samogo sebya. Analogichnuyu rol' po otnosheniyu k ro-
ditel'skomu klassu igraet slovo super:
1 class ThreePoint extends Point {
2 protected double z;
3 ThreePoint () {
4 super ();
5 z = 0.0;
6 }
7 ThreePoint (double x, double y, double z) {
8 super (x, y);
9 this.z = z;
10 }
11 }
V strokah 4 i 8 vyzyvayutsya konstruktory roditel'skogo klassa.
Privedennye primery pokazyvayut, chto v yazyke Java, kak i C++,
metody mogut byt' peregruzhennymi, to est' pod odnim imenem mo-
gut figurirovat' raznye metody s raznym naborom parametrov.
Kak i C++, s pomshch'yu klyuchevogo slova static mozhno opredelit'
dannye i metody, kotorye yavlyayutsya obshchimi dlya vseh ob容ktov
klassa. (Otmetim poputno, chto funkcij, ne prinadlezhashchih kakomu-
libo klassu, v yazyke Java ne byvaet.) Sleduyushchij primer soderzhit
fragmenty standartnogo paketa java.lang.
1 public final
2 class Character extends Object {
3 public static final int MAX_RADIX = 36;
4 static char downCase[];
5 static {
6 char down[] = new char[256];
7 for (int i = 0 ; i < 256 ; i++) {
8 down[i] = (char) i;
9 }
10 for (int lower = 'a' ; lower <= 'z' ; lower++) {
11 int upper = (lower + ('A' - 'a'));
12 down[upper] = (char)lower;
13 }
14 for (int lower = 0xE0; lower <= 0xFE; lower++) {
15 if (lower != 0xF7) { // multiply and divide
16 int upper = (lower + ('A' - 'a'));
17 down[upper] = (char)lower;
18 }
19 }
20 downCase = down;
21 }
22 public static boolean isLowerCase(char ch) {
23 return (upCase[ch] != ch);
24 }
25 }
Prokommentiruem etot primer s tochki zreniya otlichij Java ot C++.
Stroki s 5 po 21 predstavlyayut soboj inicializaciyu staticheskih
dannyh klassa, kotoraya osushchestvlyaetsya v moment zagruzki klassa
v Java-mashinu. Po suti etot kod igraet rol' konstruktora klassa
Character.
V strokah 1 i 3 vstrechaetsya klyuchevoe slovo final. V stroke 1
eto slovo oboznachaet zapret na nasledovanie ot klassa
Character. V stroke 3 ego smysl analogichen opisatelyu const v
C++.
Esli slovo final ispol'zovano v zagolovke metoda, to dannyj me-
tod ne mozhet byt' pereopredelen v klassah-naslednikah.
Kak i v C++, v yazyke Java klassy mogut byt' abstraktnymi, to
est' ne do konca konkretizirovannymi. |to oznachaet, chto v klas-
se opisany metody, opredeleniya kotoryh otsutstvuyut. Takie meto-
dy (kak i sam klass) dolzhny snabzhat'sya opisatelem abstract.
Abstraktnye metody dolzhny konkretizirovat'sya v proizvodnyh
klassah.
V yazyke Java imeetsya predopredelennaya ierarhiya klassov, soder-
zhashchihsya v pakete java.lang. Na ris. 9 eta ierarhiya predstavlena
graficheski.
Ris. 9. Ierarhiya predopredelennyh klassov yazyka Java.
V etoj ierarhii neskol'ko osobnyakom stoit klass Class. Program-
mist ne mozhet sozdat' ob容kt klassa Class (pravda, sushchestvuyut i
drugie klassy s etim svojstvom). Ssylki na ob峭t klassa Class
mozhno poluchit' s pomoshch'yu metoda getClass, opredelennogo dlya ob-
容ktov klassa Object.
Ob容kty klassa Class ispol'zuyutsya dlya polucheniya vo vremya vypol-
nenie informacii o "klassovyh" svojstvah ob容kta. K ob容ktam
klassa Class, pomimo prochih, primenimy sleduyushchie metody:
1 public native String getName();
2 public native Class getSuperclass();
3 public static native Class forName(String className)
throws ClassNotFoundException;
Metod forName pozvolyaet poluchit' ssylku na klass po ego imeni.
Opisatel' native svidetel'stvuet o tom, chto metod realizuetsya
sredstvami, vneshnimi po otnosheniyu k Java-sisteme (naprimer, pi-
shetsya na yazyke C).
Model' nasledovaniya v yazyke Java sushchestvenno otlichaetsya ot mo-
deli C++. Vo-pervyh, v Java net mnozhestvennogo nasledovaniya.
Vo-vtoryh, v yazyke predusmotreny sredstva dlya zapreta dal'nej-
shego nasledovaniya (klyuchevoe slovo final pered opredeleniem
klassa). V-tret'ih, v yazyke Java prisutstvuet novoe po otnoshe-
niyu k C++ ponyatie interfejsa.
Interfejs predstavlyaet soboj nabor opisanij metodov. Primer:
public interface Verbose {
public void drawOn (Graphics g);
public void printOn (OutputStream os);
}
public class Star extends Polygon implements Verbose {
public void drawOn (Graphics g) {
// Konkretnaya realizaciya otrisovki
}
public void printOn (OutputStream os) {
// Konkretnaya realizaciya pechati
}
}
public class Text extends StringBuffer implements Verbose {
public void drawOn (Graphics g) {
// Konkretnaya realizaciya otrisovki
}
public void printOn (OutputStream os) {
// Konkretnaya realizaciya pechati
}
}
public class Blackboard extends Canvas {
public void drawVerbose (Verbose d) {
Graphics g = getGraphics ();
d.drawOn (g);
}
}
Interfejs Verbose soderzhit dva metoda. Pervyj prednaznachen dlya
risovaniya v graficheskom kontekste, vtoroj - dlya raspechatki v
vyhodnoj potok.
Klass Star predstvlyaet soboj podklass mnogougol'nikov
(Polygon). Pomimo prochego, my hotim risovat' ob容kty etogo
klassa na doske (Blackboard) i vyvodit' ih opisanie v fajl.
Dlya ob容ktov klassa Text my hotim imet' vozmozhnost' nachertat'
tekst na doske i vyvodit' ego v fajl.
Klass Blackboard - naslednik klassa Canvas, special'no prednaz-
nachennogo dlya risovaniya. Kak my vidim, etot klass s pomoshch'yu
edinstvennogo metoda spravlyaetsya s risovaniem ob容ktov, ne ime-
yushchih obshchego predka (krome klassa Object).
Takim obrazom, s pomoshch'yu interfejsov mozhno kompensirovat' ot-
sutstvie mnozhestvennogo nasledovaniya. V kontekste nasledovaniya
interfejs mozhno rassmatrivat' kak abstraktnyj klass, ne soder-
zhashchij dannyh.
4.1.1.3. ZHiznennyj cikl ob容kta
Ob容kty sozdayutsya s pomoshch'yu operatora new. Inicializaciya ob容k-
ta proizvoditsya s pomoshch'yu sootvetstvuyushchego konstruktora. |ti
operacii razdelit' nel'zya - za new sleduet konstruktor. Primer.
Point myPoint = new Point ();
Drugih sposobov sozdaniya ob容ktov (krome operatora new) yazyk
Java ne predostavlyaet.
Ob容kt sushchestvuet do teh por, poka na nego est' ssylki (to est'
poka on pryamo ili kosvenno dostupen hotya by iz odnoj peremen-
noj). V yazyke otsutstvuyut yavnye sredstva udaleniya ob容ktov.
Posle togo, kak ob容kt stal nedostupen, on okazyvaetsya kandida-
tom dlya utilizacii sborshchikom musora.
Ob容kt mozhet stat' nedostupnym, esli hranivshej ego peremennoj
prisvoeno novoe znachenie ili esli eta peremennaya perestala byt'
dostupnoj (proizoshel vyhod iz bloka). Primer.
Point p = new Point (100.0, 100.0);
. . .
p = new Point (1.0, 1.0);
// Na tochku s koordinatami (100, 100) ssylok bol'she net
{
String s = new String ("Local string");
System.out.println (s);
}
// Na stroku "Local string" ssylok bol'she net
V moment utilizacii ob容kta sborshchikom musora budet vyzvan metod
finalize. Iz-za togo, chto sborshchik musora rabotaet v fonovom re-
zhime, vyzov finalize yavlyaetsya asinhronnym.
4.1.2. Primitivnye tipy dannyh
V yazyke Java sushchestvuet nabor vstroennyh tipov dannyh, kotorye
ne yavlyayutsya ob容ktami. Ih ne tak mnogo.
Predstavlenie chisel v yazyke Java fiksirovano i, tem samym, ne
zavisit ot apparatnoj platformy.
- celye chisla:
- - byte - 8 bit,
- - short - 16 bit,
- - int - 32 bita,
- - long - 64 bita.
Vse chisla so znakom, specifikator unsigned v yazyke otsutstvuet.
- chisla s plavayushchej tochkoj:
- - float - 32 bita,
- - double - 64 bita.
Predstavlenie dolzhno sootvetstvovat' standartu IEEE 754.
- char
Znachenie tipa char est' 16-razryadnoe chislo bez znaka (diapazon
0-65535). Kodirovka sootvetstvuet standartu Unicode. V rezul'-
tate s samogo nachala zakladyvaetsya zdorovaya osnova dlya resheniya
problemy lokalizacii Java-programm.
- boolean
Soderzhit znacheniya true i false, kotorye ne mogut byt' preobra-
zovany v drugoj tip.
V yazyke Java, razumeetsya, prisutstvuyut massivy. |ti massivy ti-
pizirovany. Deklaraciya
Point myPoints[];
opisyvaet peremennuyu myPoints kak massiv ob容ktov tipa Point.
Zavesti massiv opredelennogo razmera mozhno s pomoshch'yu instrukcii
vida
myPoints = new Point[10];
Znacheniya elementov massiva pri etom ustanavlivayutsya ravnymi
special'noj velichine null.
Razmer massiva mozhet byt' poluchen vo vremya vypolneniya program-
my:
howMany = myPoints.length;
Drugih strukturnyh tipov (ne yavlyayushchihsya ob容ktami) v yazyke Java
net, to est' net struktur, ob容dinenij i t.p. Net v Java i uka-
zatelej.
Otmetim, chto stroki simvolov yavlyayutsya ob容ktami tipa String
(tekstovye konstanty) ili StringBuffer (izmenyaemye stroki).
Primer,
String hello = "Hello world!";
Klassy v yazyke Java ob容dinyayutsya v pakety. Vse klassy, vhodyashchie
v odin paket, yavlyayutsya druzhestvennymi po otnosheniyu drug k dru-
gu, to est' imeyut vzaimnyj dostup k peremennym i metodam, esli
protivnoe ne ogovoreno yavno posredstvom specifikatorov private
ili protected.
Pakety razgranichivayut prostranstva imen. "Prosto global'nyh"
imen v yazyke Java ne byvaet.
Paket oformlyaetsya s pomoshch'yu sintaksicheskoj konstrukcii vida
package my_packages.pack1:
Instrukciya package dolzhna stoyat' pervoj v fajle s ishodnym
Java-tekstom. Ona dejstvuet do konca fajla.
Pakety mogut importirovat'sya drugimi paketami posredstvom inst-
rukcii import. Primery,
import java.util;
import java.util.HashTable;
import java.util.*;
Pervaya instrukciya import pozvolyaet obrashchat'sya k klassam paketa
util sleduyushchim obrazom:
util.Vector
util.HashTable
. . .
Vtoraya instrukciya importiruet lish' klass HashTable, pozvolyaya v
dal'nejshem obrashchat'sya k etomu klassu po korotkomu imeni, bez
prefiksa util.
Tret'ya instrukciya import pozvolyaet obrashchat'sya po korotkim ime-
nam ko vsem klassam paketa util.
4.1.4. Upravlyayushchie konstrukcii
Upravlyayushchie konstrukcii yazyka Java vpolne tradicionny, za isk-
lyucheniem sredstv vyhoda iz vlozhennyh blokov (v chastnosti, iz
vlozhennyh ciklov). Primer.
test:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (i > 3) {
break test;
}
}
}
Dlya peredachi upravleniya mozhno primenyat' kak konstrukciyu break,
tak i continue (perehod k sleduyushchej iteracii cikla).
Instrukciya goto v yazyke Java otsutstvuet.
4.1.5. Isklyuchitel'nye situacii
Dlya obrabotki isklyuchitel'nyh situacij, voznikayushchih vo vremya vy-
polneniya programmy, v yazyke Java ispol'zuetsya konstrukciya try/
catch/finally. Blok try soderzhit instrukcii, vypolnenie mozhet
privesti k vozniknoveniyu isklyuchitel'nyh situacij. Sleduyushchie za
nim odin ili neskol'ko blokov catch prednaznacheny dlya obrabotki
isklyuchitel'nyh situacij. Nakonec, blok finally soderzhit inst-
rukcii, kotorye budut vypolneny nezavisimo ot vozniknoveniya
isklyuchitel'noj situacii v bloke try. Pri vyhode iz try-chasti
posredstvom instrukcij peredachi upravleniya (break, return i
t.p.) blok finally takzhe budet vypolnen.
Dlya peredachi informacii ob isklyuchitel'noj situacii ispol'zuyutsya
ob容kty klassov - naslednikov klassa Throwable. Naprimer, klass
ArrayIndexOutOfBoundsException otvechaet za kontrol' vyhoda in-
deksov za granicy massivov, klass OutOfMemoryException - za re-
akciyu na ischerpanie svobodnoj pamyati, klass ClassCastException
- za oshibki pri preobrazovanii tipov, klass
InterruptedException - za obrabotku preryvaniya tekushchego potoka
i t.d. Komponentoj vseh etih klassov yavlyaetsya pole tipa String,
v kotoroe pomeshchaetsya tekst soobshcheniya ob oshibke. Metod
getMessage vozvrashchaet etot tekst.
V podobnyh ob容ktah mozhet soderzhat'sya i dopolnitel'naya informa-
ciya. Naprimer, ob容kty klassa InterruptedIOException soderzhat
pole, v kotoroe zanositsya chislo bajt, peredannyh do vozniknove-
niya isklyuchitel'noj situacii.
Sleduyushchij fragment programmy raspechatyvaet soobshcheniya iz massiva
messages. Pri etom my ne pytaemsya vyyasnit' razmer etogo massi-
va, a prosto polagaemsya na mehanizm obrabotki isklyuchitel'nyh
situacij. (Konechno, my ne sovetuem pisat' programmy v takom
stile).
try {
for (int i = 0; i < 100; i++) {
System.out.println (messages[i]);
}
}
catch (ArrayOutOfBoundException e) {
System.out.println ("No more messages");
}
catch (Exception e) {
System.out.println ("Unexpected exception");
System.out.println (e.getMessage());
}
finally {
System.out.println ("Work done");
}
Iskobchitel'nye situacii mogut vozbuzhdat'sya programmno pri pomo-
shchi instrukcij vida
throw new MyException ("Something's wrong");
Specifikacii yazyka Java podrazdelyayut isklyuchitel'nye situacii na
dve kategorii. K pervoj kategorii (klass Error) otnosyatsya situ-
acii, na kotorye programma ne obyazana reagirovat' (eto zavedomo
sdelaet Java-mashina). Ko vtoroj kategorii (klass Exception) ot-
nosyatsya situacii, kotorye programma dolzhna obrabatyvat' obyaza-
tel'no. Esli pri vypolnenii metoda mozhet voznikat' isklyuchitel'-
naya situaciya vtorogo tipa, on dolzhen libo obrabatyvat' ee sam s
pomoshch'yu konstrukcii try/catch/finally, libo v ego opredelenii
dolzhna figurirovat' konstrukciya
throws Exception1, Exception2, ...
Primer.
class Foo extends Object {
. . .
public void readFromFile (String fn) throws InvalidFormatException {
FileInputStream fis;
try {
fis = new FileInputStream (fn);
// CHitaem dannye iz fajla.
. . .
// Esli fajl imeet nepravil'nyj format,
// vozhbuzhdaem isklyuchitel'nuyu situaciyu:
throw new InvalidFormatException ("Wrong format");
. . .
}
catch (FileNotFoundException e) {
// Predprinimaem sootvetstvuyushchie dejstviya
}
finaly {
if (fis != null )
fis.close(); // vsegda zakryvaem fajl, esli on byl otkryt
}
}
. . .
}
V etom primere v metode readFromFile mogut vozniknut' dve iskl-
chitel'nye situacii. Pervaya svyazana s tem, chto nuzhnyj fajl ne-
dostupen. |ta situaciya obrabotyvaetsya vnutri metoda
readFromFile. Vtoraya isklyuchitel'naya situaciya mozhet voznknut',
esli fajl imeet nepravil'nyj format. |ta situaciya peredaetsya
dlya obrabotki naverh.
Mehanizm potokov - obyazatel'naya cherta sovremennyh operacionnyh
sred. Za schet potokov obespechivaetsya masshtabiruemost' programm-
nyh sistem, optimal'noe ispol'zovanie apparatnyh resursov, vy-
sokaya skorost' otklika na zaprosy pol'zovatelej. Poetomu net
nichego udivitel'nogo v tom, chto v yazyke Java mehanizm potokov
predstavlen s samogo nachala i v polnom ob容me.
V yazyke Java potoki predstavleny posredstvom klassa Thread, in-
terfejsa Runnable, specifikatora metoda synchronized i metodov
klassa Object wait i notify.
4.1.6.1. Klass Thread i interfejs Runnable
Potok (thread) predstavlyaet soboj otdel'nyj potok upravleniya v
predelah processa. Takim obrazom, u kazhdogo potoka est' nachalo,
posledovatel'nost' dejstvij, tekushchee sostoyanie i konec.
Potok zapuskaetsya s pomoshch'yu vyzova metoda start() klassa
Thread. Posledovatel'nost' dejstvij, vypolnyaemyh v ramkah poto-
ka, zadaetsya v metode run(). Podcherknem, chto metod run() is-
pol'zuetsya tol'ko dlya zadaniya pomledovatel'nosti dejstvij; yavno
vyzyvat' ego ne tol'ko ne nuzhno, no i prosto vredno.
Potok zakanchivaetsya libo pri zavershenii vypolneniya metoda
run(), libo s pomoshch'yu yavnyh vyzovov metodov klassa Thread
stop() ili destroy(). Vozobnovit' rabotu zavershennogo potoka
nevozmozhno.
Dlya vremennoj priostanovki raboty potoka s posleduyushchim vozob-
novleniem sluzhat metody suspend(), sleep() i yeild().
Obychno potok, priostanovlennyj s pomoshch'yu metoda suspend, vozob-
novlyaet rabotu posredstvom metoda resume().
Vyzov metoda sleep() privodit k priostanovke potoka na zadannoe
chislo millisekund.
Vyzov metoda yeild() oznachaet dobrovol'nuyu ustupku processora
drugomu potoku; pervonachal'nyj potok ostaetsya gotovym k vypol-
neniyu.
Java-potoki obladayut prioritetami. V specifikaciyah ogovarivaet-
sya, chto Java-mashina realizuet vytesnyayushchuyu mnogopotokovost'. |to
oznachaet, chto potok s bol'shim prioritetom mozhet prervat' vypol-
nenie menee prioritetnogo potoka. Odnako, specifikacii ne tre-
buyut nalichiya razdeleniya vremeni. |to znachit, chto dlya peredachi
upravleniya potoku s tem zhe prioritetom, voobshche govorya, trebuyut-
sya yavnye dejstviya so storony pervonachal'nogo potoka - vyzov me-
todov suspend(), sleep() ili yeild().
Na ris. 10 predstavlena diagramma sostoyanij potokov.
Ris. 10. Diagramma sostoyanij potokov.
Sleduyushchij primer soderzhit fragment odnogo iz mnogochislennyh va-
riantov resheniya zadachi "proizvoditel'/potrebitel'". On zaimst-
vovan iz pis'ma, kotoroe napisal Mark Tillotson v gruppu sete-
vyh novostej comp.lang.java.
class my_producer extends Thread
{
int items_to_do ;
my_buffer the_buffer ;
my_producer (my_buffer buf, int count)
{ super() ;
the_buffer = buf ;
items_to_do = count ;
}
public void run ()
{
while (items_to_do > 0)
{ System.out.println ("producer to_do = " + items_to_do) ;
Integer item = new Integer (items_to_do*items_to_do) ;
the_buffer.insert (item) ;
items_to_do-- ;
}
System.out.println ("producer exiting") ;
}
}
Dannyj proizvoditel' pomeshchaet v bufer kvadraty celyh chisel.
V privedennom prostom primere klass my_producer yavlyaetsya nas-
lednikom klassa Thread, chto delaet ego potokom s posledovatel'-
nost'yu dejstvij, zadannoj metodom run(). V real'nyh programmah,
kak pravilo, ob容kt dolzhen nasledovat' u kakogo-libo predshest-
vennika soderzhatel'nye svojstva, a vozmozhnost' paralell'nogo
vypolneniya emu predostavlyaetsya interfejsom Runnable. |tot in-
terfejs soderzhit edinstvennyj metod - run(). Primer.
1 class SomethingToRun extends BaseRunner implements Runnable {
2 private Thread aThread;
3 public void run () {
// vypolnyaemye dejstviya
. . .
4 }
5 SomethingToRun () {
6 aThread = new Thread (this);
7 aTread.start ();
8 }
9 }
V stroke 6 sozdaetsya novyj potok. Argumentom konstruktora yavlya-
etsya obekt klassa SomethingToRun, a, znachit, posledovatel'nost'
vypolnyaemyh dejstvij potoka budet opredelyat'sya metodom run()
etogo klassa. Vyzov metoda start() v stroke 7 stavit potok v
ochered' gotovyh dlya vypolneniya.
4.1.6.2. Sredstva sinhronizacii potokov
Kak i vo vsyakoj mnogoprocessnoj ili mnogopotokovoj srede, v
Java sushchestvuet problema sinhronizacii dostupa k razdelyaemym
resursam. Primerom takogo resursa yavlyaetsya bufer v zadache "pro-
izvoditel'/potrebitel'".
Dlya opytnyh programmistov otmetim, chto model' sinhronizacii,
prinyataya v yazyke Java, opiraetsya na koncepciyu monitora, predlo-
zhennuyu v 70-e gody Brink-Hansenom.
V Java-programmah mozhno vydelyat' kriticheskie intervaly, kotorye
oboznachayutsya klyuchevym slovom synchronized. Esli kriticheskim in-
tervalom yavlyaetsya metod, specifikator synchronized pomeshchaetsya v
ego (metoda) zagolovok. Dlya prevrashcheniya proizvol'noj instrukcii
(obychno eto blok) v kriticheskij interval sluzhit konstrukciya
synchronized (vyrazhenie) instrukciya;
gde rezul'tatom vyrazheniya dolzhen byt' ob容kt ili massiv.
Vypolnenie kriticheskogo intervala nachinaetsya tol'ko posle polu-
cheniya potokom monopol'nogo dostupa k sootvetstvuyushchemu ob容ktu.
Do nastupleniya etogo momenta potok blokiruetsya.
Vyzov wait() vnutri kriticheskogo intervala privodit k tomu, chto
tekushchij potok ustupaet monopol'noe pravo na kriticheskij inter-
val i priostanavlivaetsya do teh por, poka iz kakogo-libo drugo-
go potoka ne budet sdelan vyzov notify() ili notifyAll(). Horo-
shej illyustraciej ispol'zovaniya sredstv sinhronizacii potokov
yavlyaetsya upominavshayasya vyshe programma Marka Tillotsona.
class my_buffer
{
Object [] vec = new Object [8] ;
int ip = 0 ;
int ep = 0 ;
synchronized void insert (Object item)
{
do
{
if (ip-ep < 8)
{ vec [(ip++) & 7] = item ;
if (ip-ep == 1) notify () ; // Uvedomit', esli bufer byl pust
return ;
}
try wait () ; catch (InterruptedException e) ;
} while (true) ;
}
synchronized Object extract ()
{
do
{
if (ip > ep)
{ Object result = vec [(ep++) & 7] ;
if (ip-ep == 7) notify(); // Uvedomit', esli bufer byl polon
return result ;
}
try wait () ; catch (InterruptedException e) ;
} while (true) ;
}
}
class my_producer extends Thread
{
int items_to_do ;
my_buffer the_buffer ;
my_producer (my_buffer buf, int count)
{ super() ;
the_buffer = buf ;
items_to_do = count ;
}
public void run ()
{
while (items_to_do > 0)
{ System.out.println ("producer to_do = " + items_to_do) ;
Integer item = new Integer (items_to_do*items_to_do) ;
the_buffer.insert (item) ;
items_to_do-- ;
}
System.out.println ("Proizvoditel' zakanchivaet rabotu") ;
}
}
class my_consumer extends Thread
{
int items_to_do ;
my_buffer the_buffer ;
my_consumer (my_buffer buf, int count)
{ super() ;
the_buffer = buf ;
items_to_do = count ;
}
public void run ()
{
while (items_to_do > 0)
{ System.out.println ("consumer to_do = " + items_to_do) ;
Object item = the_buffer.extract () ;
System.out.println ("consumer got " + item) ;
items_to_do-- ;
}
System.out.println ("Potrebitel' zakanchivaet rabotu") ;
synchronized (this){
notify () ; // Posylaem uvedomlenie o zavershenii raboty
// (sm. con.wait() v main())
}
}
}
public class threaded3
{
public static void main (String [] args) throws InterruptedException
{
my_buffer the_buffer = new my_buffer () ;
my_producer prod = new my_producer (the_buffer, 40) ;
my_consumer con = new my_consumer (the_buffer, 40) ;
Thread.currentThread().setPriority (5) ;
prod.setPriority (4) ; // Proizvoditel' poluchaet bolee vysokij prioritet
con.setPriority (3) ; // po sravneniyu s potrebitelem
prod.start() ;
con.start() ;
synchronized (con)
{
con.wait() ; // ZHdem uvedomleniya ot proizvoditelya ob okonchanii
// ego raboty
}
System.out.println ("Proizvoditel' i potrebitel' zakonchili rabotu") ;
}
}
Privedennaya programma napisana v ochen' horoshem, ponyatnom stile.
My prokommentiruem lish' odin moment. V metodah insert() i
extract() klassa my_buffer vyzov wait() soderzhitsya vnutri bes-
konechnogo cikla. Delo v tom, chto vyzov notify() otnositsya k ob-
容ktu v celom. "Razbuzhennyj" ob容kt dolzhen proanalizirovat'
svoe sostoyanie i reshit', chto delat' dal'she. Tak, esli "zasnul"
metod insert(), to posle vozobnovleniya raboty neobhodimo prove-
rit', chto bufer uzhe ne polon i dobavlenie novogo elementa stalo
vozmozhnym. Esli eto ne tak, metod insert() zasnet vnov'.
4.2.1. Tehnologicheskij cikl obrabotki Java-programm
V principe, tehnologicheskij cikl podgotovki, translyacii, redak-
tirovaniya vneshnih svyazej, testirovaniya, otladki i vypolneniya
Java-programm tot zhe, chto i dlya drugih interpretiruemyh yazykov
programmirovaniya, no s odnim sushchestvennym otlichiem - pri redak-
tirovanii vneshnih svyazej trebuemye komponenty mogut dostavlyat'-
sya po seti (ris. xxx).
Ris. xxx. Tehnologicheskij cikl Java-programmy
Vazhno otmetit', odnako, chto Java-programmy mogut predstavat'
kak by v dvuh ipostasyah - kak samostoyatel'noe prilozhenie i kak
aplet, to est' sovokupnost' ob容ktov, vypolnyayushchihsya v srede
WWW-navigatora.
S tochki zreniya programmista, aplet i prilozhenie otlichayutsya v
pervuyu ochered' tochkami vhoda i zhiznennym ciklom.
Prilozhenie v kachestve tochki vhoda imeet metod
public static void main (String args[]);
etot metod dolzhen byt' opredelen v tom public-klasse, kotoryj soderzhitsya v
fajle, vypolnyaemom virtual'noj Java-mashinoj.
V parametr args peredaetsya massiv strok - parametrov komandnoj stroki.
Primer: programma, pechatayushchaya svoi argumenty
public class myTop {
public static void main (String args[]){
int argc = args.length;
for (int i = 0; i < argc; i++)
System.out.println (argc[i]);
}
}
Aplet vypolnyaetsya v kontekste navigatora i ego zhiznennyj cikl
opredelyaetsya sleduyushchimi metodami klassa Applet:
public void init () vyzyvaetsya navigatorom pri zagruzka apleta;
public void start (); vyzyvaetsya navigatorom pri pokaze stranicy;
public void stop (); vyzyvaetsya navigatorom, kogda tot uhodit s Web-stranicy;
public void destroy (); etot metod prednaznachen dlya osvobozhdenya
resursov; analog destruktora, no ne vyzyvaetsya avtomaticheski; vsegda
vyzyvaet stop(); vsegda vyzyvaetsya pri vyhode iz navigatora i pri
perezagruzke apleta.
Prostejshij aplet vyglyadit tak:
1 import java.awt.Graphics;
2 import java.applet.Applet;
3 class SimpleApplet extends Applet {
4 public void paint (Graphics g) {
5 g.drawString ("Hello world!", 10, 10);
6 }
7 }
Metod public void paint (Graphics g) (stroki 4-6) opredelyaet,
kak aplet pererisovyvaet sebya v tot moment, kogda okonnyj me-
nedzher posylaet WWW-navigatoru zapros na pererisovku.
Vklyuchenie apleta v WWW-stranicu proizvoditsya sleduyushchim obrazom.
V yazyke HTML 2.0 predusmotreny special'nye konstrukcii