1
Mis on Java ?
Java — alates 1991. aastast Sun Microsystems poolt arendatav ja 23. mail 1995 avalikustatud
objektorienteeritud programmeerimiskeel. Esialgselt oli uue programmeerimiskeele nimetuseks Oak ja
seda loodi
koduelektroonika tarbeks, kuid hiljem nimetati see ümber Javaks ja seda hakati kasutama
rakendite (aplettide) (
ingl applet), rakenduste
( application ) ja servertarkvara loomiseks.
Põhivõimalused • eriolukordade töötlemise laiendatud võimalused;
• sisend/väljund filtrimisvahendite lai kogum;
• sisseehitatud lihtsad
klassid (
massiiv , loetelu,
stack jms);
• võrgurakenduste loomise
lihtsate vahendite olemasolu;
• http-päringute ja vastuste loomise klasside olemasolu;
• Sisseehitadud
keelevahendid mitmelõimeliste rakenduste loomiseks;
• unifitseeritud ligipääs JDBC- ja SQLJ-põhistele andmebaasidele
• jne.
Java-programmide põhikategooriad:
•
Rakendusprogramm (Application) – tavalise rakendusprogrammi analoog
•
Rakend , mõnes allikas
aplett (Applet) — piiratud võiimalustega spetsialiseeritud programm, mis
töötab
veebilehitseja juhtimisel veebidokumendi aknas.
•
Midlet (Midlet) — piiratud võiimalustega spetsialiseeritud programm, mis töötab mobiilseadmel.
•
Servlet (Servlet) – piiratud võiimalustega spetsialiseeritud programm, mis töötab
veebirakenduse serveri poolel.
•
Serveripoolne rakendus (Enterprise Application) – on määratud mitmekordsele kasuamisele
serveri poolel.
•
Java klasside teek (Java Class Library) – on ettenähtud mitmekordseks kasutamiseks Java
keeles kirjutatud programmides.
C++ vs Java•
Süntaks. Kuivõrd see võimalik on, C++s püütakse hoida järjepidevust ja ühilduvust C keelega.
Java on pealtvaadates sarnane C ja C++ keeltega, sest võttis nendelt üle suure osa
põhikonstruktsioone, jättes samas kasutamata vahendid, milleta läbi saab ja mis kirjutamise
keerulisemaks või veaohtlikumaks teevad. Tulemusena on Java C++ keelest lihtsam ja seega on
Javat kergem õppida ja sellele translaatoreid kirjutada.
•
Programmi täitmine. Java-kood kompileeritakse vahekoodi, seda nimetatakse baitkoodiks, mida
edaspidi kas täidetakse interpretaatoriga või kompileeritakse, C++ keeles oli aga esialgselt
määratud, et programm kompileeritakse antud platvormi masinakeelde. See määrab keelte
kasutamise alad: Java keelt ei kasutata seadmete draiverite ja madalatasemeliste süsteemsete
utiliitide kirjutamiseks. Java mehhanism aga lubab isegi baitkoodi kasutada erinevatel platvormidel
ja suvalises operatsioonisüsteemis ilma, et programmi peaks
muutma .
•
Mälu juhtimine. C++ kasutab klassikalist mälujuhtimise
tehnikat , kus
programmeerija ise eraldab
dünaamiliselt objektide jaoks vajaliku mälu, ning peab ise hoolitsema selle vabastamise eest. Java
keskkonnas töötab aga prahikoristaja, mis automaatselt jälgib objektide kasutust ja kui objekti
rohkem ei kasutata, siis vabastab sellega hõivatud mälu. Esimese
variandi eeliseid saab kasutada
2
süsteemses programmeerimises, kus programmeerijal peab olema täielik kontroll kasutatavate
ressursside üle, teist
varianti on mugavam kasutada rakendusprogrammeerimises, sest
programmeerija ei pea ressursse ise
haldama ja mälu kasutust jälgima, mis tõstab programmide
turvalisuse ja säästab programmeerija aega. Samas aga prahikoristaja töö hõivab süsteemseid
ressursse, mis võib aeglustada programmi tööd.
•
Standardiseerimine . Java keeles on kindlad
standardid sisend/väljund-, graafika-,
geomeetria -,
dialoogoperatsioonidele, juurdepääsule andmebaasidele ja muudele tüüpraksendustele. C++ on
selles mõttes vabam.
•
Viidad . C++ võimaldab teha tööd madalatasemeliste viitadega.
Javas viitasid ei ole. Viitade
kasutamine on tihti raskesti avastavate vigade tekkimise põhjuseks, kuid nende kasutamine on
vajalik riistvarapõhises programmeerimises. Kuigi põhimõtteliselt C++ keeles on olemas terve
rida vahendeid (konstruktorid ja destruktorid, standardsed mallid, viited), mis lubavad vältida
käsitsi mälu eraldamist ja ohtlikke viitade
operatsioonide kasutamist. Kuid siin peab juba olema
kõrge
programmeerimise kultuur, seevastu Javas on see realiseeritud automaatselt.
•
Programmeerimise paradigma . Keel Java on puhas objektorienteeritud keel. Seevastu C++
keeles on säilinud ka puhtprotseduurse programmeerimise võimalused (klassivabad funktsioonid ja
muutujad).
•
Tüüpide dünaamiline info. C++s puudub käitusajal tüüpide täisväärtuslik info RTTI (Run-time
type information - see on spetsiaalne objekti tüübi määramise mehhanism käitusajal).
•
Eelprotsessor. C++ on säilinud C eelprotsessor, sealhulgas on olemas võimalus lisada
kasutajasüntaks kasutades käsku #
define . See ei ole ohutu mehhanism, sest suurte programmide
pakettide moodulid võivad saada üksteisest liiga sõltuvaks, mis järsult vähendavad pakettide
turvalisust ja ühiskasutusega moodulite loomise võimalust. С++ keeles on piisavas koguses
vahendeid (konstandid, mallid, sisseehitatud funktsioonid) selleks, et praktikas vältida täielikult
#define kasutamise. Java lihtsalt eiras täielikult eelprotsessori kasutamise, millega sai ühe hoobiga
lahti sellega seotud kõikidest probleemidest,
ehkki kaotades sellega mõned võimalused.
3
Virtuaalne Java-masin, baitkood , JIT-kompileerimine
Paljud
rakendused töötavad ainult mõne ühe operatsioonisüsteemi juhtimisel. Kui programmi tööd juhib
operatsioonisüsteem, siis programmeerija ei pea arvestama konkreetse väljund- ja sisendseadmega – selle
eest vastutab OS. See annab nii programmeerijale kui ka kasutajale vabaduse mitte mõelda selle üle,
kuidas teostada andmevahetust välisseadmetega aparaattasemel. Näiteks, faili lugemisel on
programmeerija vaatevinklist ükskõik, kas need andmed tulevad kõvaketta, CD või DVD pealt. Kuid
tavaliste rakenduste puhul programmi töötavus on piiratud ühe operatsioonisüsteemiga. Näiteks
Windows -
rakendus ei hakka tööle
LINUX süsteemis ja vastupidi.
Saab vältida sõltuvust operatsioonisüsteemist, kui täita kõik välisseadmetega seotud
operatsioonid käituskeskkonnas –
programmis , mis kontrollib
rakenduse tööd ja täidab väljakutsed vastavalt
erinevatele operatsioonisüsteemidele. Java keeles kirjutatud
programmid täidetakse käituskeskkonnas –
Java-virtuaalmasinas, ning sellepärast ei sõltu operatsioonisüsteemist, vaid töötab igal pool, kus on
olemas vastav Javamasin. Sellepärast Java-rakendused ei ole mõne operatsioonisüsteemi rakendused, vaid
Java-rakendused.
Java keeles kirjutatud programmid on klasside kogud, neid hoitakse tekstifailides laiendiga
.java.
Programmitekst transleeritakse kahendfailidesse laiendiga
.class. .class-failid koosnevad baitkoodist, mis
on abstraktse Java-protsessori käskude kogu ja mis koosnevad selle protsessori käskude ja andmete sõnede
jadast. Selleks, et baitkood mõnel
arvutil täita, interpreteerib Javavirtuaalmasin iga käsu antud protsessori
käskudeks.
Esialgu baitkoodi interpreteerimine toimus nii, et iga baitkoodi jada viidi üle masinakoodi ja täideti. Selle
tagajärel Java-programmid töötasid aeglasemalt, kui teised operatsioonisüsteemisõltuvad programmid.
Nüüd aga kasutatakse keerulisemat süsteemi – selle nimeks on
JIT-kompileerimine (Just-In-Time) –
selles
variandis baitkood kompileeritakse käitusajal. Kui mõni instruktsioon oli korra kompileeritud, siis
see jäeti meelde spetsiaalses puhvris ja korduvalt kasutati juba valmiskoodi. Seega interpreteerimine
toimub ainult esimesel baitkoodi instruktsiooni
kasutamisel , mis kiirendab oluliselt programmi täitmist.
Tänu sellele, et Java-programmid tõlgitakse platvormist mittesõltuvasse baitkoodi, saab neid
programme ja kokku lingitud rakendusi kasutada erinevatel platvormidel töötavatel arvutitel. On selge, et arvutis peab
olema installitud
Javavirtuaalmasin (
Java Virtual Machine – JVM), mis on kompileeritud antud
protsessori koodi (
native code – platvormist sõltuv
kood). Ühes arvutis võib olla installitud mitu erineva
versiooniga või erinevatelt tootjatelt Javamasinat.
Java rakendust täidetakse Javavirtuaalmasinas, mis on
operatsioonisüsteemi osa. Seega esimesena stardid
Javamasin, saab parameetrina baitkoodis klassi faili
nime, otsib selles klassis meetodi nimega
main ja
käivitab programmi töö.
Virtuaalmasin peale baitkoodi interpreteerimise
kompileerib programmi masinakoodi ja täidab seda JIT-
kompileeritud koodi, täidab veel ka teisi funktsioone
(koostöö operatsioonisüsteemiga, juurdepääsu tagamine
failidele, graafikafunktsioonide tugi). Peale selle
teostab automaatse mäluvabastamise mittevajalike objektide alt,
mida nimetatakse
prahikoristamiseks (garbage
collection ). 4
Mis on JDK?
Virtuaalset Java-masinat tihti nimetatakse käituskeskkonnaks (
Java Runtime Enviroment – JRE). Java-
masina installimist kliendi serverile saab teostada kahel moel:
•
Installides
Java Development Kit (JDK) — Java
tarkvara arenduskomplekt
, kus
JRE on juba
sees. Sünonüümina saab kasutada ka terminit SDK – Software Development Kit.
•
spetsiaalne JRE variant veebiseiluris, mida nimetatakse Java
plugin.
JDK
viimased versioonid on vabalt laetavad Sun veebilehelt ht
tp: / /java.sun.com
JDK komplekte klassifitseeritakse lähtudes Java versioonist ja loodavate rakenduste tüübist. On olemas
versioonid JDK 1.0...1.6, ootab valgust
versioon 1.7. (2010. aasta). Iga versioon sisaldab mitut
alamversiooni, kus puuduvad programmeerimiskeele muudatused, kuid on parandatud vead või lisatud
väikesed muudatused teekidesse.
Ühe versiooni JDK arenduskomplektid erinevad nende abil arendatavate rakenduste tüübi poolest. Praegu
pakub Sun Java arenduskomplekte, mis jagunevad võimaluste ja kasutusvaldkondade järgi kolmeks:
•
Mikrokomplekt — Java Platform , Micro Edition (Java ME) - “minimalistlik” Java, mis on
mõeldud väheste ressurssidega seadmetele („kõhn
klient “) külmkappidest, kiipkaartidest,
pihuarvutitest mobiiltelefonideni. Sedametele, kus ressurss on piiratud.
•
Standardkomplekt — Java Platform, Standard Edition (Java SE) on mõeldud „paksu kliendi“
tarkvara loomiseks, st seadmetele, kus on piisavalt ruumi ja mälu –
tavalised arvutid ja
serverid .
•
Korporatiivne komplekt— Java Platform, Enterprise Edition (Java EE) vahendid suurte
hajussüsteemide
arendamiseks , kus Java töötab kliendi ja serveri rollis olevatel komponentidel
(Enterprise JavaBeans), mis asuvad erinevates süsteemides. On Java SE
laiend . Selle platvormi
SDK sisaldab võimsat serverit ning suurt arvu teisi Java
tehnoloogial põhinevaid käituskeskkondi
Pildil on toodud Java
platvormide standardklasside näiline jaotus.
JDK programmid ja klassid: põhilised osad (pildil on
toodud
paki jdk1.6.0_11 ja
kataloogi bin sisu):
•
kompilaator
javac tõlgib algteksti baitkoodi;
•
interpretaator
java, sisaldab JVM teostuse;
•
aplettide
läbivaatamise
programm
appletviewer, asendab veebilehitseja;
•
silur
jdb;
•
disassembler
javap;
•
varundusprogramm
jar;
•
dokumendikoostamise programm
javadoc;
•
C keele päisfailide genereerimise programm
5
javah ;
•
digiallkirja lisamise programm
javakey;
•
programm
native2ascii, mis konverteerib rahvuskeelse teksti Unicode sümbolite jadasse;
•
Java-klasside standardteegid;
•
näited;
•
dokumentatsioon ;
•
erinevad utiliidid;
•
Java programmide käituskeskkond (JRE).
Java rakenduste integreeritud arenduskeskkonnad
Kaasaegsed Java rakenduste integreeritud arenduskeskkonnad on järgmised:
NetBeans, Sun Java Studio
Creator, IntelliJ IDEA , Borland JBuilder, Eclipse , ja toetuvad JDK poolt pakutavatele teenustele
(
service ). Suurem osa neist kasutab Java-programmide kompileerimiseks JDKs sisalduvat kompilaatorit.
Sellepärast need keskkonnad kas juba sisaldavad komplektis mõnda JDK-versiooni, või nõuavad JDK
eelinstallimist arendaja
arvutisse .
NetBeans IDE — vaba integreeritud tarkvara arenduskeskkond (IDE) programmeerimiskeeltele Java,
JavaFX , Ruby,
Python , PHP,
JavaScript , C++ jm. Keskkond NetBeans toetab vaikimisi arendust
platvormide J2SE ja J2EE jaoks. Kvaliteedi ja võimaluste suhtes viimased NetBeans IDE versioonid ei jää
alla parimatele kommertsintegreeritavatele raamistikele Java keele jaoks, nagu IntelliJ IDEA. Sisaldab
palju võimalusi nagu refaktoring, profileerimine, värviga eraldatud süntaksilised
konstruktsioonid ,
automaatselt täiendatavad konstrultsioonid, palju koodimalle jms
http://netbeans.org/ Eclipse IDE — vaba raamistik (
framework ) mitmeplatvormiliste moodulrakenduste arendamiseks.
Arendatakse ja toetatakse Eclipse Foundation. Enimtuntud rakendused, mis põhinevad Eclipse Platform
— erinevad «Eclipse IDE» tarkvara arendamiseks paljude keelte jaoks (näiteks, kõige
populaarsem «Java
IDE»). Eclipse IDE on paljudes asutustes võetud rakenduste arenduse korporatiivseks standardiks. Eclipse
IDE (alates versioonist 3.0) ei ole monoliitne toetades IDE laiendusi, vaid koosneb laienduste kogumist.
Viimastes Eclipse versioonides pluginate lisamiseks on rakendatud mugav süsteem
Software Updates.
http://www.eclipse.org/ Lihtne programm Java keeles
1. Lihtsa konsoolrakenduse loomine lihtsa tekstiredaktori, näiteks NotePad, abil, kompilaatori
käivitamise ja rakenduse täitmisega käsurealt. Pakk JDK ei meenuta millegagi rakenduste loomise
integreeritud keskkonda. Kõik käsud käivitatakse käsurealt. Peale JDK installimist lisage kataloogi nimi
jdk/bin otsinguteede loetellu, mille järgi operatsioonisüsteem otsib käivitatavaid faile — keskkonna
süsteemne muutuja on
path . Kontrollida, kas kõik on õigesti tehtud, saab järgmiselt: trükkige
konsoolaknasse käsk java -version
6
N äide . Teate kuvamine
ekraanile , on võimalus käivitada programm
parameeter -argumentidega
class FirstSample
public static void main(
String [] args)
{
if(args.length>0)
System.out.
print ("Your text: ");
for(int i=0;iNew
Project ->Java Project.
Siis lisate Java klassi -
New Java Class. Erinevate parameetrite seas, mida saab kasutada klassi loomisel,
on ema-klassi nimi,
liideste nimed,
main-meetodi loomine.
Pange tähele, et klassi nimi algab alati suure tähega. Sama nimi peab olema failil, kuhu klass kuulub.
8
Edasi
loome rakenduse, mis kuvab teate ekraanile.
Rakenduse saab käivitada Run->Java Application
Keskkonna allosas kuvatakse tulemus.
9
Java keele üldkujutus
Java keeles andmetüübid jagunevad kahte leeri: lihttüübid ja struktuurtüübid (e viitetüübid). Lihttüüpi
(
primitive types ) andmed paiknevad ühes mälupesas. Viitetüüp on selline andmetüüp, kus mälupesades
asuvad mitte andmed ise, vaid nende andmete aadressid ehk viited. Juurdepääs
aadressile puudub.
Lihttüübid:
•
täisarvulised: byte, short, int, long, char;
•
ujukomaarvud float,
double ;
•
tõeväärtustüüp boolean.
Java struktuurtüüpe kasutatakse objektprogrammeerimisel — sõned, failid, kasutajaliidese elemendid,
kasutajatüübid (klassid).
Javas on kasutusel järgmised kokkulepped tähtede
registrite ja identifikaatorite kohta:
•
Klasside nimed algavad alati suure tähega – MinuKlass,
Jutukas •
Lihttüüpide nimed
kirjutatakse väikeste tähtedega — int, short, int, long, char, boolean ...;
•
struktuurtüüpide nimed on soovitatav kirjutada suure tähega. Siis on kirjutamise käigus hea
eristada, millega on tegu. Kui nimi koosneb mitmest osast, siis iga osa algab suure tähega. Teised
tähed on väikesed – Object, Collection, JButton
•
muutujate ja meetodite nimed kirjutatakse väikeste tähtedega. Kui nimi koosneb mitmest sõnast,
siis käik sõnad kirjutatakse kokku, kuid iga järgmine sõna algab suure tähega – i, j, object1,
myVariable, jButton2
•
pa
kkide nimed kirjutatakse väikeste tähtedega, kui nimi koosneb mitmest sõnast, siis neid võib
eraldada alakriipsuga «_» - mypackage, org.jdesktop.swingworker
•
konstantide nimed on vaja kirjutada suurte tähtedega, kui nimi koosneb mitmest sõnast, eraldada
alakriipsuga «_» - MIN_VALUE, INFORMATION_MESSAGE.
Java ideoloogia algselt oli mõeldud tööle arvutivõrkudes mis võimaldaks tööajal
laadida võrgust juurde
vajalikke
klasse ja ressursse. Java rakendusi arendatakse ja levitatakse suure hulga sõltuvate klasside näol.
Javas on ettenähtud klasside grupeerimisvahend
pakk —
pakid ( package ). Pakid tagavad sõltumatuid
nimeruume ja piiravad juurdepääsu klassidele.
Klassid kuuluvad alati mingisse
pakki . Pakid võivad paikneda hierarhiliselt. Igal pakil on vastavuses
kaust, kus asuvad klasside lähtekoodid. Et klass pakki lisada, tuleb pakk klassikoodis esimeses reas
deklareerida.
package имя_пакета;Kui pakk jäi deklareerimata ja seega puudub, siis loetakse, et klass asub
pakis default.
Sissepandud pakkidel on liitnimed, kus nimed eraldatakse
punktiga . Et pakkide nimed ei korduks Javas on
kasutusel metoodika, mis garanteerib nimede unikaalsuse — pakkidele antakse nimed, mis vastavad
domeenide WWW-aadressitele, kuid kirjutatud vastupidises järjekorras. Näiteks, web.vk.edu.ee –
ee.edu.vk.web.
username Kui klassi defineerimisel puudub piiritleja
public, siis juurdepääs klassile on lubatud ainult
nendest klassidest, mis on antud klassiga ühes pakis —
pakipõhine juurdepääs.
Failis laiendiga .java võib olla
a inult
ü ks klass üldjuurdepääsuga , e
avalik klass (
public) ja suvaline arv klasse pakipõhise
juurdepääsuga.
Klassis võib kasutada ka teiste pakkide avalikke klasse, kui kirjutada klassi täisnimi —
pkg1.pkg2.pkg3.MyClass või määrata
kasutatava klassi asukoht programmi nimeruumis operaatoriga
import pkg1.pkg2.pkg3.MyClass. Kui kasutatakse paljusid klasse ühest pakist, siis võib importida kõik
10
klassid järgmiselt
import pkg1.pkg2.pkg3.*
Etteantud Java pakkide nimed algavad nimest
java või
javax.
NäitedN äide 1 . Töö erinevat tüüpi muutujatega, konstandid, matemaatilised funktsioonid ja sõned
11
N äide 2 . Info sisestamine ja väljastamine
Enesekontrolli küsimused1. Mis on Java-
tehnoloogia ? Mis on Java virtuaalmasin? Mis on Java Plug-in?
2. Millega erinevad keskkond JRE ja
platvorm J2SE?
3. Mis on ühist ja erinevat C# ja Java vahel?
4. Mis on pakk (
package) ja milleks neid kasutatakse?
Harjutused
Õppige iseseisvalt — kuidas Javas käib töö massiividega. Valige
üks järgmistest ülesannetest:
1. On olemas
ühemõõtmeline massiiv, mis koosneb mittekorduvatest juhuarvudest. (10 punkti) On
vaja:
•
Lugeda paariskohtadel asuvate elementide summa
•
Lugeda minimaalse ja maksimaalse elemendivahel seisvate massiivielementide summa
•
Trükkida välja kõige pikem järjest
leiduv kasvavas järjekorras elementide jada.
2. On antud
täisarvuline ruutmaatriks (10 punkti)
•
Leida nende ridade elementide summa, kus puuduvad negatiivsed arvud
12
•
Igas reas leida suurim element ja vahetada see
kohtadega vastava peadiagonaali elemendi
vastu.
•
Maatriksi elementi loetakse lokaalmiinimumiks, kui ta on
rangelt väiksem kõigist
naaberelementidest. Lugege, mitu lokaalmiinimumi on antud maatriksis
3.
Hollandi rahvuslipu ülesanne (E.Deikstra). N-pikkusega massiivis juhuslikus järjekorras
paiknevad elemendid ‘p’ (punane), ‘v’ (valge) ja ‘s’ (sinine).
Reastage need ümber Hollandi
rahvuslipu värvide järjekorra järgi nii, et esialgu oleksid kõik punased, siis kõik valged ja lõpuks
kõik sinised. Lubatud operatsioonid olgu värvi kontroll ja kahe elemendi vahel
kohtade vahetamine. (10 punkti)
4.
Hoonestamise ülesanne. Ruudukujuline
plats mõõtudega N×N ruutmeetrit (N≤100) on jagatud
ruutudeks küljepikkusega 1 m. Ruut on kinni, kui seal kasvab puu. Puid langetada ei tohi. Leida
maja ehitamiseks maksimaalse pindalaga
puudest vaba ruut (10 palli). Keerulisem variant — Leida
suurim ristkülikukujuline plats (15 punkti).
Osalemine foorumis. Lisage materjal, mis täiendaks seda loengut (15-20 lauset). Juba enne lisatud ärge
korrake. Ärge unustage lähteinfoallika lisamist (5 punkti)
13
Kasutatud kirjandus ja viited1. Язык программирования Java и среда NetBeans. В. Монахов. БХВ-Петербург. 2009
2. Java 2. Том 1. Основы. 8 издание. Хорстман, Корнелл. Вильямс. 2009
3. ht
tp://wapedia.mobi/ru/Java_Development_Kit (08/01/2010)
4. ht
tp://ru.wikipedia.org/wiki/Eclipse (08/01/2010)
5. ht
tp://034.pfr.ru/sitepfr_1.8.18.htm (08/01/2010)
Document Outline
- Mis on Java?
- Virtuaalne Java-masin, baitkood, JIT-kompileerimine
- Mis on JDK?
- Java rakenduste integreeritud arenduskeskkonnad
- Lihtne programm Java keeles
- Java keele üldkujutus
- Näited
- Enesekontrolli küsimused
- Harjutused
- Kasutatud kirjandus ja viited
Kõik kommentaarid