Java kak centr arhipelaga Original etoj stat'i nahoditsya na WWW servere firmy Jet Infosystems ˇ http://www.jet.msk.su/koi/techno/intra/java.html Aleksandr Taranov, Vladimir Cishevskij Soderzhanie 1. Vvedenie 2. Internet, WWW i Intranet 3. Java, Joe, NEO 4. Java - yazyk i tehnologiya 4.1. YAzyk Java 4.1.1. Ob®ektnaya 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®ektnymi biz- nes-prilozheniyami 6. Zaklyuchenie 1. Vvedenie 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®emov 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®ektov 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®ektov. Iz obshchih soobrazhenij ochevidna ogranichen- nost' podobnogo podhoda. Dannyj nedostatok, razumeetsya, svyazan s pervym. Ob®ekt 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. 3. Java, Joe, NEO V uzkom smysle slova Java - eto ob®ektno-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®ektov ne tol'ko na lokal'noj mashine, no i na drugih komp'yuterah, dostup- nyh po seti (v chastnosti, na WWW-servere). Najdennye ob®ekty 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®ektov 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®ektov po seti. Iz etogo vytekaet takoe vazhnejshee dostoinstvo, kak nulevaya stoi- most' administrirovaniya klientskih sistem, napisannyh na Java. Dostatochno obnovit' versiyu ob®ekta 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®ektnuyu sredu. Na servernoj storone kompaniya Sun Microsystems imeet sootvetstvuyushchuyu tehno- logiyu - NEO (NEtworked Objects, setevye ob®ekty). 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®ektnyh 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®yavila 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  * 4.1. YAzyk Java Pri opisanii yazyka Java budet predpolagat'sya, chto chitatel', ho- tya by v obshchih chertah, znakom s yazykom C++.  4.1.1. Ob®ektnaya model' yazyka Java Kogda govoryat ob ob®ektno-orientirovannom yazyke programmirova- niya, predpolagayut podderzhku treh mehanizmov: - inkapsulyaciya - nasledovanie - polimorfizm. Inkapsulyaciya i nasledovanie v yazyke Java realizuyutsya s pomoshch'yu ponyatiya klassa.  4.1.1.1. Klassy Ponyatie klassa v yazykah Java i C++ ochen' blizki. Klass yavlyaetsya shablonom dlya sozdaniya ob®ektov; 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®ektom, sluzhit special'nyj metod finalize. |tot metod vyzyvaetsya sborshchikom musora v moment uti- lizacii pamyati, zanimavshejsya ob®ektom. 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®ektov 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®ekt klassa Class (pravda, sushchestvuyut i drugie klassy s etim svojstvom). Ssylki na ob®kt klassa Class mozhno poluchit' s pomoshch'yu metoda getClass, opredelennogo dlya ob- ®ektov klassa Object. Ob®ekty klassa Class ispol'zuyutsya dlya polucheniya vo vremya vypol- nenie informacii o "klassovyh" svojstvah ob®ekta. K ob®ektam 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).  4.1.1.2. Nasledovanie 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®ekty etogo klassa na doske (Blackboard) i vyvodit' ih opisanie v fajl. Dlya ob®ektov 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®ektov, 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®ekta Ob®ekty sozdayutsya s pomoshch'yu operatora new. Inicializaciya ob®ek- 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®ektov (krome operatora new) yazyk Java ne predostavlyaet. Ob®ekt 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®ektov. Posle togo, kak ob®ekt stal nedostupen, on okazyvaetsya kandida- tom dlya utilizacii sborshchikom musora. Ob®ekt 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®ekta 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®ektami. 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®ektov 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®ektami) v yazyke Java net, to est' net struktur, ob®edinenij i t.p. Net v Java i uka- zatelej. Otmetim, chto stroki simvolov yavlyayutsya ob®ektami tipa String (tekstovye konstanty) ili StringBuffer (izmenyaemye stroki). Primer, String hello = "Hello world!";  4.1.3. Pakety Klassy v yazyke Java ob®edinyayutsya 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®ekty 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®ektah mozhet soderzhat'sya i dopolnitel'naya informa- ciya. Naprimer, ob®ekty 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.  4.1.6. Mehanizm potokov 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®eme. 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®ekt 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®ekt ili massiv. Vypolnenie kriticheskogo intervala nachinaetsya tol'ko posle polu- cheniya potokom monopol'nogo dostupa k sootvetstvuyushchemu ob®ektu. 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- ®ektu v celom. "Razbuzhennyj" ob®ekt 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. Tehnologiya Java  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®ektov, 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 - par