Java
Java
Pagrindinės Java teigiamybės
Apžvelkime Java kalbos pagrindines teigiamybes ir trūkumus, lygindami
ją su kol kas populiariausia programavimo kalba C++.
Paprastumas
1) Java neturi adresų (rodyklių) aritmetikos. Java dirba tik su tais
objektais, su kuriais ryšys palaikomas per kintamuosius. Taigi Java
kintamasis savaime nėra objektas, bet tik nuoroda į objektą. Todėl
užrašas (sakinys)
String s;
reiškia, kad s yra nuoroda (kelias), bet ne pats objektas (tolesnėje
programoje panaudoję nuorodą s, vykdymo metu gautumėte klaidą, jog
bandote operuoti su „tuščia” vieta). Todėl prieš naudojant oobjektą,
būtina jį sukurti. Tam naudojamas specialus sakinys new:
String s = new String(„abcd“);
(String tipo objektą galima sukurti ir tiesiogiai:
String s = „abcd“;
2) Neturi goto sakinio (išskyrus praplėstus break ir continue sakinius).
3) Neleidžia metodo vardo perduoti parametrų sąrašu (skirtumas nuo C++),
bet leidžia perduoti objektą (o šis viduje turi metodų).
4) Neturi struct (įrašo) tipo. Bet tai čia atitinka class.
5) Neturi union ir bitinių laukų (bitiniai laukai, kaip grynai aparatinė
funkcija, nesiderina su Java principu „„nepriklausanti nuo kompiuterio
architektūros”).
6) Java neleidžia turėti metodų su kintamu parametrų sąrašu. Tai
nesiderina su principu “griežtai tipizuota”, kadangi neįmanoma
patikrinti busimųjų tipų. Tačiau tai leidžia metodų perkrovimo
galimybė (metodų vardai vienodi, bet skiriasi antraštės).
7) Neturi enum, typedef iir #define. Tai atitinka static final tipas.
8) Neturi void parametrų sąraše.
9) Java leidžia aprašyti kintamuosius bet kurioje kodo vietoje (tai
leidžia ir C++).
10) Java neturi globaliųjų kintamųjų (panašiai kaip static tipo
kintamasis, galiojantis visiems tos klasės objektams).
11) Neturi daugialypio paveldėjimo (C++ tai turi). Iš dalies tai
pasiekiama interfeisais.
12) Automatiškai atlaisvina nebenaudojamą atmintį (šiukšlių rinktuvas –
Garbage Collection). Šis šiukšlių rinktuvas kartkarčiais kviečiamas
automatiškai, tačiau programuotojas gali jį išsikviesti ir pats:
System.gc();
Objektų saugyklos
Pagrindinės informacijos saugyklos yra:
1. Registrai. Jie yra procesoriaus viduje, todėl tai pats sparčiausias
išrinkimo tipas. Deja, registrų skaičius labai ribotas. Jais pagal
poreikius manipuliuoja tik pats kompiliatorius.
2. Stekas. Yra RAM’e (tiesioginės kreipties atmintyje). Procesorius saugo
nuorodą į šį steką, ir, vaikštant “aukštyn”/”žemyn”, iinformacija įrašoma
ir paimama. Gana greitas būdas (antras po registrų). Šiaip jau Java pačių
objektų steke nesaugo, nes reikėtų nuolat perskaičiuoti objektų dydžius,
perstumiant steko nuorodą „aukštyn”/„žemyn”. C++ tai galima.
3. Krūva (heap – „netvarkusis masyvas”). Yra RAM’e. Tai ir yra ta vieta,
kur saugomi visi Java programos objektai. Pagrindinis privalumas tas, kad
kompiliatoriui nereikia žinoti kiek kiekvienas objektas užima vietos. Su
new sakiniu sukurtas objektas vykdymo metu automatiškai pateks į „krūvą”.
Aišku, operacijos sulėtės.
4. Statinė atmintis. Ji taip pat yra RAM’e, tik specialiai tam skirtoje
vietoje. „Krūvoje” esantys tuo momentu nebereikalingi objektai gali būti
šiukšlių rinktuvo automatiškai pašalinti, o statiniai objektų elementai
išlieka iki programos darbo pabaigos. Tokie elementai sukuriami naudojant
atributą static.
Paprastieji tipai. Vis dėlto elementariems aritmetiniems veiksmams
paspartinti Java turi ir paprastų duomenų tipų (byte, int, double, .).
Tai nėra objektai, todėl jiems sukurti nereikia new sakinio. Jų įvedimo
priežastis ta, kad tokiems elementariems objektams sukurti ir padėti į
„krūvą” būtų sugaištama per daug laiko. Paprastųjų tipų kintamieji saugomi
steke.
(Kiekvienam procesui Java turi atskirą steką.
Nepriklausymas nuo asmeninio kompiuterio (PC) architektūros
Daugumos programavimo kalbų galutinis produktas yra vykdomasis (.exe
tipo) modulis, susidedantis iš konkrečių instrukcijų PC procesoriui.
Tačiau Windows sistemos dažniausiai naudoja Intel firmos procesorius,
Macintosh sistema naudoja Motorola arba PowerPC procesorius ir t.t. Be to,
kiekviena sistema (Windows,Unix, Linux) naudoja savas papildomas
bibliotekas. Todėl klasikinė schema
Kodas(Kompiliatorius(Redaktorius(vykdomasis failas (*.exe)(PC
turi vieną gana didelį trūkumą – vienos sistemos produktas dažnai neveikia
kitoje sistemoje.
Šio trūkumo neturi programa, parašyta Java kalba. Esmė ta, kad čia
negeneruojamos instrukcijos procesoriui, bet programos tekstas (kodas)
kompiliuojamas į specialų objektinį kodą, vadinamą baitkodu. Šį kodą toliau
skaito ir vykdo Java abstrakti virtualioji mašina (JVM), kurią turi
kiekviena kompiuterinė sistema. Taigi turime tokią schemą:
Kodas ( Kompiliatorius ( bait-kodas ( JVM
Java abstrakti virtualioji mašina JVM
JVM – tai speciali Sun Microsystems firmos programa (bait-kodo
interpretatorius), parašyta kiekvienai operacinei sistemai atskirai. Tai
JRE (Java Runtime Environment). Ji itraukta į populiariausių naršyklių
sudėtį (Microsoft Internet Explorer, Netscape Navigator, Opera), į JDK
(Java Development Kit ). Ją galima įdiegti ir atskirai.
JVM jau gaminama ir atskiromis mikroshemomis. Taigi ją galima įdėti ne
tik į PC, bet ir į TV stotis, o ateityje ir į buitinius prietaisus.
Daugiaprocesė
Programa tuo pat metu gali vykdyti keletą procesų (thread).
Daugiaprocesiškumas yra organizuotas objektų lygmeniu – kiekvienas procesas
yra atskiras objektas. Panaudojant synchronized modifikatorių resursai
„užrakinami” (būtų blogai, jei keli procesai vienu metu rašytų informaciją
į tą patį failą).
Programų saugumas
Saugumas užtikrinamas keliais lygiais. Tai ypač svarbu apletams
(specialaus tipo taikomoji programa), nes jie plačiai naudojami interneto
puslapiuose. Tam yra net speciali klasė java.lang.SecurityManager su eile
metodų.
Programinis lygis:
– kadangi nėra adresų aritmetikos, tai neįmanoma programiškai
sugadinti atminties;
– neįmanoma perpildyti masyvo;
– negalima ne tik rašyti, bet ir skaityti informacijos už masyvo ir
eilutės ribų (todėl Java kalboje eilutė String nemodifikuojama).
Baitkodo tikrintojas patikrina:
– ar neperpildytas stekas;
– ar su objektais neatliekamos draudžiamos operacijos;
– ar tinkamai naudojami registrai;
– ar teisingai keičiami kintamųjų tipai.
„Smėlio dėžės” principas apletui: „įtartina” (neturinti skaitmeninio
parašo)
programa kaip vaikas įkeliama į smėlio dėžę ir negali :
– skaityti/rašyti failo iš/į jjūsų (kliento) PC;
– išmesti, pervardyti, kurti naujų failų ir t.t. kliento PC.
Vykdant apletą ne per tinklą, bet vietinėje failų sistemoje, didesnė
dalis šių apribojimų netaikoma. Dar didesnes teises turi apletų paleidimo
programa appletviewer.exe.
Situacijų valdymas (exception)
Nepageidautina situacija (klaida) – tai Java objektas, kuris
sužadinamas klaidos vietoje ir vėliau gali būti „pagautas” ir apdorotas
programoje. Taigi susidarius nepageidaujamai situacijai, pavyzdžiui, kai
indeksas yra už masyvo ribų, galima ją „sugauti”, apdoroti ir tolesnius
veiksmus jau nukreipti norima linkme. Tai nėra tas pats kaip tokių
situacijų „gaudymas” naudojantis grąžinamomis reikšmėmis ar papildomais
požymiais-kintamaisiais, kai galima tiesiog patingėti tai atlikti (arba
blogai atlikti). Privalumas tas, kad kai kurių situacijų Java praleisti
neleis – jas privalu kažkur apdoroti.
Objektinis programavimas Java kalba
Dar pačiai pirmajai objektinio programavimo kalbai Smalltalk Alan Kay
suformulavo šiuos penkis objektinio programavimo (OP) principus:
1. Viskas yra objektas. Objektas ir saugo duomenis, ir atlieka operacijas
su jais (duomenų ir metodų sujungimas į visumą).
2. Programa – tai grupė objektų, bendraujančių per pranešimus (pranešimu
galima laikyti ir objekto metodo iškvietimą).
3. Kiekvienas objektas turi savąją atmintį, susidedančią iš kitų objektų
(kompozicija – objekto viduje naudojami prieš tai sukurti objektai).
4. Kiekvienas objektas yra kurio nors tipo (klasės).
5. Tam tikros grupės objektai gali priimti tuos pačius pranešimus
(paveldėjimas).
Pabandykime perfrazuoti šiuos OP
principus Java kalbos požiūriu.
Duomenų ir metodų sujungimas į visumą (encapsulation)
Duomenų ir jų apdorojimo metodų sujungimas į visumą Java kalboje
atliekamas naudojant klasę. Taigi klasė yra tipas arba objekto šablonas,
kurį sudaro duomenys ir metodai. Objektas jau yra realus klasės
egzempliorius kompiuterio atmintyje. Objekto modelį galime pavaizduoti kaip
kapsulę:
Taigi sudarius A klasę, joks realus objektas atmintyje dar
nesukuriamas:
|class A { |
|// klasės turinys |
|} |
Objekto dar nėra ir paskelbus A klasės tipo kintamąjį x:
|A x; |
Objektas gali būt sukurtas ir sakiniu new:
|x == new A(); //Objektas sukurtas! |
|// arba iš karto: |
|A x = new A(); |
Taigi objektas sukuriamas dinamiškai programos vykdymo metu sakiniu new:
KlasėsVardas objektoVardas = new KlasėsVardas();
Arba dviem etapais :
KlasėsVardas objektoVardas;
ObjektoVardas = new KlasėsVardas();
Klasei galima sukurti neribotą skaičių objektų.
Grižkime prie kapsulės. Jis turi būti uždaras. Pirma, tai užtikrina
duomenų apsaugą, nes vartotojas gali atlikti su duomenimis tik tas
operacijas, kurias jam leidžia tam skirti metodai. Antra, programuotojas-
vartotojas gali rašyti programas „aukštesniu” lygiu, t.y. jis visiškai
pasitiki eesamais metodais ir jam nebereikia leistis į smulkmenas ir jų
tikrinti. Ir trečia, programų (metodų) pakeitimai ir atnaujinimai
programuotojui-vartotojui visai neturi reikšmės.
Paveldėjimas (inheritance) ir kompozicija
Tai klasės sugebėjimas paveldėti protėvių klasės duomenis ir metodus.
Literatūroje vartojama daug skirtingų terminų. Pagrindinė klasė vadinama
paveldimąja klase, ssuperklase, protėvių klase, bazine arbs tėvo klase.
Analogiškai naujoji klasė vadinama paveldinčiąja klase, subklase,
palikuonių klase, išvestine arba vaiko klase. Mes vartosime terminus tėvo
klasė ir vaiko klasė.
Taigi vaiko klasė paveldi visus matomus (ne private tipo) tėvo klasės
metodus ir kintamuosius. Visos Java klasės yra kilusios iš java.lang.Object
klasės ir automatiškai palaiko visus jos metodus. Java neturi daugialypio
paveldėjimo (netiesiogiai tai galima išspręsti naudojant interfeisus).
Nereikia painioti sąvokų „kompozicija” ir „paveldėjimas”. Kompozicija –
tai kitos klasės objekto panaudojimas naujai projektuojamoje klasėje.
Kompozicija naudojama tada, kai kuriama nauja klasė tiesiog naudoja kitos
klasės metodus. Paveldėjimas naudojamas tada, kai nauja klasė naudoja kitos
klasės struktūra (interfeisą).
Plačiau apie paveldėjimą aprašoma ketvirtame skyriuje.
Polimorfizmas (polymorphism)
Galime skirti dvi polimorfizmo rūšis. Tai metodų perkrova ir metodų
užklotis.
Metodų perkrova (overloading). Klasėje naudojama keletas metodų tuo
pačiu vardu. Būtina sąlyga – metodai turi skirtis savo antraštėmis
(parametrų skaičiumi arba parametrų tipais). Grąžinamos reikšmės tipas čia
įtakos neturi.
Metodo pasirinkimą nusako jo iškvietimo formatas. Tai atliekama jau
kompiliavimo metu (tai dar vadinama „ankstyvuoju susiejimu”).
Plačiau apie metodų perkrovą rašoma 3.5. skyrelyje „Metodų perkrova”.
Metodų užklotis (overriding). Tėvo ir vaiko klasės turi vienodus
metodus. Būtinos sąlygos: turi sutapti ne tik šių metodų vardai, bet ir jų
antraštes bei grąžinamų reikšmių tipai. Taigi vaiko klasės metodas gali
pakeisti (užkloti) tėvo klasės metodą.
Metodo pasirinkimą lemia objekto, kkuriam šis metodas kviečiamas, tipas
(jei objektas yra tėvo klasės tipo, tai bus kviečiamas jos metodas,
priešingu atveju – vaiko).
Metodas parenkamas vykdymo metu (tai dar vadinama „susiejimu vykdant”).
Plačiau apie metodų užklotį rašoma 4.2. skyrelyje “Metodų užklotis”.
1.3. Trys Java programų tipai
Pirmas. Taikomoji programa (application) su komandų eilutės sąsaja
Tai pats paprasčiausias ir kartu nevaizdžiausias programos tipas.
Programa paleidžiama main metodu. Taigi bent viena programos klasė privalo
turėti main metodą. Šiaip jau kiekviena klasė gali turėti po vieną main
metodą (tai patogu testuojant klases), tačiau vienu metu galima naudoti
tiktai vieną main metodą. Pasibaigus visiems main metodo sakiniams,
programa baigia darbą.
Parašykime tradicinę pirmąją Java programėlę, kuri juodame Command
Prompt (arba FAR Manager) lange išveda tekstą „Labas, Java”.
ETAPAI:
1. Bet kuriuo redaktoriumi (kad ir NotePad) parašome pirmosios programos
tekstą (visi Java kalbos žodžiai pajuodinti):
|// Pirmoji Java programa |
|public class Labas { |
|public static void main(String args[]) |
|{ |
|System.out.println(„Labas, Java“); |
|} |
|} |
ir įrašome į diską vardu „KlasėsVardas.java” (šiuo atveju vardu
„Labas.java”).
2. Kviečiame kompiliatorių javac.exe, kuris patikrina programos sintaksę,
perkoduoja jos tekstą į bait-kodą ir įrašo jį į diską vardu
„KlasėsVardas.class” (šiuo atveju vardu „Labas.class”):
>javac Labas.java
P.S. Jei jūsų kompiuteryje nėra nustatyto kelio į katalogą, kur yra
kompiliatorius javac.exe, tai reikia nurodyti visą kelią iki jo. PPvz.:
>D:jdk1.3binjavac Labas.java
Jei nėra klaidų, tai kompiliatorius paprastai jokių pranešimų ir
neišveda. Taip po kompiliacijos atrodo Far Manager langas (šiuo atveju
failas Labas.java įrašytas į katalogą D:JavaPavyzdziailabas):
[pic]
3. Kviečiama JVM java.exe vykdyti programą (failo tipas class
nenurodomas):
>java Labas
[pic]
Naudojant vizualias aplinkas (JBuilder, Visual Studio J++, VisualCafe
ar kitas), vykdymo scenarijus keičiasi.
Antras. Taikomoji programa su vartotojo sąsaja
Programa čia taip pat paleidžiama main metodu. Tačiau paleidimo tikslas
dažniausiai yra tik vienas – sukurti vartotojo sąsajos langą ir perduoti
jam visą valdymą. Toliau jau sąsajos elementais (meniu, mygtukais, teksto
laukais ir t.t.) atliekami norimi veiksmai ir programa veiks tol, kol
uždarysime šios sąsajos langą.
Vėlgi parašykime tą pačią programą, išvedančią tekstą „Labas, Java”.
Programos rašymo ir paleidimo scenarijus visiškai toks pat kaip ir pirmojo
tipo programos. Tiesa, programos tekstas atrodys truputėlį kitoks:
|// Pirmoji Java programa su vartotojo sąsaja. |
|import javax.swing.*; |
|import java.awt.*; |
|public class LabasSuSasaja extends JFrame { |
| public void paint(Graphics g) { |
| g.drawString(„Labas, Java“, 50, 60); |
| } |
| public static void main(String[] args) { |
| LabasSuSasaja langas = new LabasSuSasaja(); |
| langas.setDefaultCloseOperation |
|(JFrame.EXIT_ON_CLOSE); |
| langas.setSize(200, 100); |
| langas.setTitle(„Programa su sasaja“); |
| langas.setVisible(true); |
| } |
|} |
Vėl kompiliuojame ir vykdome programą:
>D:jdk1.3binjavac LabasSuSasaja.java
>java LabasSuSasaja
Tačiau dabar ekrane pamatysime tokį vvaizdą:
[pic]
Trečias. Apletas (applet)
Šio tipo taikomąją programą turi tiktai Java. Apletas – tai programa,
klaidžiojanti internete ir vykdoma „kliento” kompiuteryje. Ji nenaudoja
main metodo. Tačiau kaip ir taikomojoje programoje su vartotojo sąsaja,
apleto vykdymas paremtas įvykių apdorojimu. Naršyklė pati rūpinasi apleto
veikimu: stabdo jį pereinant į kitą langą, perpiešia keičiant lango dydį ir
t.t.
Parašykime tą pačią tradicinę programą, bet jau kaip apletą.
ETAPAI:
1. Naudodamiesi bet kuriuo redaktoriumi parašome programos-apleto tekstą:
|// Pirmasis Java apletas |
|import java.applet.*; |
|import java.awt.*; |
|public class LabasApletas extends |
|Applet { |
|public void paint(Graphics g) { |
|g.drawString(„Labas, Java“, 50, 60); |
|} |
|} |
ir įrašome į diską vardu „LabasApletas.java”.
2. Šis etapas analogiškas – kviečiame kompiliatorių javac, ir šis gautą
baitkodą įrašo į diską vardu „LabasApletas.class”:
>javac LabasApletas.java
3. Tačiau jis vykdomas visiškai kitaip negu taikomoji programa. Apletas
vykdomas naršykle (galima ir su appletviewer.exe), todėl bet kuriuo
redaktoriumi sukuriamas nedidelis HTML failas. Šį failą bet kuriuo
vardu įrašome ten pat, kur yra mūsų gautas LabasApletas.class failas:
| |
| |
| |
| |
P.S. a) Kabutės nebūtinos;
b) CODE = „tik paprastas failo vardas, be kelio!”;
c) Norint nurodyti kelią, naudojamas CODEBASE = URL.
4. Atidarome šį HTML failą bet kuria naršykle (Explorer, Netscape ar
Opera) arba pasinaudojame SDK sudėtyje esančia appletviewer programa
(appletviewer
xxx.html). Prisiminkime, jog naršyklė savo viduje turi
JVM, todėl ji pati ir vykdo šį apletą:
[pic]
Kai kurios vizualios aplinkos HTML failą generuoja automatiškai.
Naudojant aplete Swing elementus (pirmųjų sąsajų elementai buvo
vadinami AWT), anksčiau minėtos struktūros HTML failas kai kurioms
naršyklėms nebetinka (appletviewer niekas nepasikeitė). Esmė ta, kad Java 2
versijos nuorodos applet html faile buvo atsisakyta. Apletai dabar
paleidžiami naršyklių papildymo programomis Java Plug-in. Jos automatiškai
įtraukiamos į naršykles, bet jei jų nėra, tai galima ir atskirai atsisiųsti
(nemokamai) adresu
http://java.sun.com/products/plugin/index-1.html
HTML failą pagal ppavyzdžius galima susikurti ir rankiniu būdu, bet
galima pasinaudoti specialiu html failų konverteriu. Konverterį taip pat
galima parsisiųsti (nemokamai ) adresu
http://java.sun.com/products/plugin/1.3/docs/html_converter.html
Štai konvertuotas ankstesnis htm failas, galiojantis Explorer ir
Netscape aplinkose:
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
Keletas progamos rašymo taisyklių :
1. Visi Java raktažodžiai rašomi tik mažosiomis raidėmis.
2. Programos kodo failo vardas turi sutapti su public klasės vardu.
Jei faile public klasių nėra, tai jokių apribojimų failo vardui nėėra.
3. Tik viena failo klasė gali būti public.
4. Viename faile gali būti keletas klasių.
5. Klasė negali tęstis per kelis failus.
6. Kiek faile yra klasių, tiek kompiliatorius sukurs atskirų class tipo
failų (viename faile būna tik vienos kllasės baitkodas).
7. Vykdant programą, interpretatoriui nurodomas tos klasės vardas, kurios
main metodą norime naudoti.
Keletas progamos teksto apipavidalinimo rekomendacijų
Tai nėra privaloma, tačiau padeda lengviau suprasti Java
dokumentacijoje pateiktus pavyzdžius bei patiems lengviau susigaudyti
savose programose:
1. Klasės vardas pradedamas didžiąja raide. Jei šis vardas susideda iš
kelių žodžių, kiekvienas žodis taip pat pradedamas didžiąja raide
(TaiManoKlase).
2. Kintamojo ir metodo (funkcijos) vardas pradedamas mažąja raide. Jei
šis vardas susideda iš kelių žodžių, tai kiekvienas kitas žodis
pradedamas didžiąja raide (bankoKodas, keistiBankoKoda()).
3. Konstantų vardai rašomi didžiosiomis raidėmis (PI).
4. Skaitymo metodai prasideda get, keitimo – set (getName(), setName())
(aišku, žodelius get/set geriau pakeisti savais, lietuviškais, pvz.,
gauti/keisti)
5. Jei grąžinamas loginis tipas boolean, tai metodas prasideda is
(isEmpty(); lietuviškas variantas – yrraTuscias()).
JAR archyvų sudarymas
Komandos formatas :
jar parametrai failųVardai
Parametrai :
c – sukurti naują archyvą;
m – panaudoti aprašymo (manifest) failą; jo vardas yra antras sąraše;
M – nekurti aprašymo (manifest) failo;
t – parodyti archyvo turinį;
x – ištraukti (paimti iš archyvo) nurodytus failus; praleidus ištraukia
visus;
f – pirmas failas sąraše bus archyvo vardas;
0 – archyve failai nesuspaudžiami.
Pavyzdys:
jar cf archyvas.jar *.class Kadrai/*.gif
Programinė įranga
1. JDK (Java Development Kit); Sun Microsystems, iki 1.2 versijos;
SDK (Software Development Kit) nuo 1.2 versijos
http://java.sun.com
http://java.sun.com/products
Sąrašo laange „Product Shortcuts: ” pasirenkame norimą programinę
įrangą, pavyzdžiui:
Java 2 SDK, Standard Edition v1.3
j2sdk-1_3_1_02-win.exe užima apie 45 MB, įdiegta – apie 75 MB;
j2sdk-1_3_1-doc.zip (dokumentacija yra HTML formato; yra ir PDF)
užima 23 MB, įdiegta – apie 115 MB.
2. Jbuilder, Borland, 5.0/6.0 Fundation
(Personal)/Professional/Enterprise
http://www.borland.com/education/jbuilder
http://info.borland.com/jbuilder/personal
b5_windows.zip (41 MB, išskleistas – apie 206 MB)
jb6_windows.zip (53 MB)
3. Microsoft J++ 6.0
http://msdn.microsoft.com/visualj
———————–
Duomenys
MetodasN
. . .
Metodas2
Metodas1