Sissejuhatuseks
Ajalugu
1991 - P. Naughton, J. Gosling - projekt "Green", Sun(järjekordne) virtuaalmasin,1993 - Mosaic - graafiline veebilehitseja (Illinoisi Ülikool)
Oak ==> Java,
1992 - "*7" - video-, kaabelTV aparatuur==> HotJava veebilehitseja (P.Naughton, J.Payne), Java-põhine, 19951996 - JDK 1.02
Netscape 2.0 Java toetus 1996
1998 - Java 2 (JDK 1.2..)Omadusi
"Lihtsam" kui C++
Objektorienteeritud
Hajusa programmeerimise tugi, võrguvahendid
Arhitektuurisõltumatu (niivõrd kuivõrd...)
Interpreteeritav virtuaalmasina poolt (JVM) vs. JIT kompilaatorid
Paralleelsuse tugi, lõimed
...
Klass/liides, kompileerimisüksus, pakett
Kompileerimisüksus
Java-programmi tekst koosneb klasside (class) ja/või liideste (interface) kirjeldustest. Preprotsessorit teksti eeltöötluseks ei kasutata.
Kompileerimisüksus (ingl.k. compilation unit) on Java lähtetekst (faililaiendiga .java), mis reeglina sisaldab ühte avalikku (public) klassi või liidest. Selle klassi/liidese nimi on ühtlasi failinime prefiksiks. NB! Java puhul on suurte-väikeste tähtede erinevus oluline! On kombeks, et klassi/liidese nimi algab suurtähega (vastavalt siis ka failinimi).
Kompileerimisüksus kuulub mingi paketi koosseisu.Kompileerimine
Java kompilaatorile javac antakse ette kompileerimisüksus (näit. HelloApplet.java) ja kui vigu ei teki, siis on tulemuseks transleeritud klass(id) faililaiendiga .class (näit. HelloApplet.class). Transleeritud klasside formaadiks on platvormist sõltumatu Java virtuaalmasina baitkood.javac HelloApplet.javaKui kompileerimisüksus on jooksvas kataloogis, siis pole klassitee (ingl.k. class path) määramine tavaliselt vajalik. Kui kompilaatorile on tarvis kirjeldada teed vajalike transleeritud klassideni, siis võib seda teha käsurea parameetriga -classpath või läbi keskkonnamuutuja CLASSPATH . Kui transleeritud klassid tuleb paigutada mingisse muusse kataloogi, siis saab seda teha käsurea parameetri -d abil.Pakett
Pakett (ingl.k. package) on loogiliselt seotud kompileerimisüksuste hulk (n.ö. teek). Pakettide nimed on liitnimed, milles nimeosad kirjutatakse väiketähtedega ja nende eraldajana kasutatakse punkti (näit. java.awt.event). Üldisemad nimeosad paiknevad eespool.
Liitnimi on vajalik paketile viitamiseks failisüsteemis - Java keele seisukohalt on paketinimed kõik samal tasemel (puudub alampaketi mõiste). Paketid võimaldavad klasse grupeerida ja määrata meetodite nähtavuspiirkonda.
Nende klasside kasutamiseks, mis paiknevad mingi paketi koosseisus, nad imporditakse (import). Pakett java.langimporditakse vaikimisi.
Paketikirjeldus (package) määrab antud kompileerimisüksuse jaoks, millisesse paketti ta kuulub. Kõik need kompileerimisüksused, millel paketikirjeldus puudub, kuuluvad ühte suurde nimetusse paketti.Klass
Klass sisaldab klassimuutujaid, klassimeetodeid, algatajaid, konstruktoreid, isendimuutujaid ja isendimeetodeid (hetkel ei anna täpset definitsiooni, klassi omadused on reeglina static). Klass on alati mingi teise klassi alamklass (extends-täiend), kui sellekohane viide puudub, siis java.lang.Object alamklass. Java on ühese pärimisega ning hilise seostamisega keel. Klass võib realiseerida mingeid liideseid (implements-täiend).Liides
Liides (ingl.k. interface) on abstraktne klass - selle tegelikuks kasutamiseks on vajalik mingi konkreetne klass, mis nõutud omadused realiseerib. Liides kirjeldab ainult meetodite nimed ja parameetrite tüübid. Muus osas on liides kasutatav klassina - saab kirjeldada liidesetüüpi objekte ning liidesemeetodite abil nendega manipuleerida, luua alamliideseid jne. Programmi töötamiseks on muidugi vajalik abstraktsed omadused realiseerida, aga programmeerimiseks pole seda vaja. Ka liideste nimed kirjutatakse kokkuleppeliselt suure algustähega.Programmi käivitamine käsurealt
Käsurealt saab käivitada neid klasse, milles leidub klassimeetod, mille signatuur (nimi ja parameetrite tüübid) on:public static void main (String[] kasureaparameetrid)s.t. avaliku (public) klassimeetodi (static) nimi on main, tagastatav väärtus puudub (void) ja sisendparameetriks on stringide massiiv.
Interpretaator java peab paiknema käivitatavate programmide otsimisteel ning klass peab olema transleeritud ning paiknema klassiteel (jooksev kataloog on tavaliselt klassiteel). Näit.:java HelloWeb [kui vaja, siis siin järel parameetrid]Klassifaili laiendit .class ei kirjutata, suur- ja väiketähtede erinevus on oluline.
Klassiteed saab määrata käsurea parameetriga -classpath või keskkonnamuutujaga CLASSPATH .
Käivitamiseks peavad abstraktsed omadused olema realiseeritud.Rakend
Rakend (ingl.k. applet) on klassi java.applet.Applet alamklassi isend, mida saab paigutada veebilehele ja käivitada veebilehitsejas.
Veebilehel (s.t. vastavas html-failis) määrab rakendi omadused applet-märgis (ingl.k. applet-tag), mille kohustuslikeks parameetriteks on code (klassi nimi), width (rakendi akna laius pikselites) ning height (akna kõrgus).
Silumiseks saab kasutada ka programmi appletviewer veebilehitseja asemel.
Rakendi nähtavaks muutmisel on üheks võimaluseks üle katta meetod paint() signatuuriga:public void paint (java.awt.Graphics aken)Rakendite silumisel tuleb luua applet-märgistega veebileht, mis viitab silutavale klassile (s.t. transleeritud klassile laiendiga .class). Klassi transleerimine toimub tavalisel viisil javac abil.Objektide loomine ja teadete saatmine
Objektide loomine, konstruktorid
Objektide loomise kohta kasutatakse ka terminit isendiloome (ingl.k. instantiation). Avaldisenew Klassinimi (argumendid konstruktorile)toimel luuakse uus isend, mille osuti (ingl.k. reference) on selle avaldise väärtuseks (osuti ongi objekti identiteedi kandja). Isendiloomel pöördutakse klassi konstruktori poole (erikujuline klassimeetod), mis võib olla defineeritud erinevalt erinevat tüüpi argumentide korral (kompileerimisaegne üledefineerimine, ingl.k. overloading). Kui argumendid puuduvad, siis rakendatakse vaikekonstruktorit (ingl.k. default constructor).Näit. Frame raam = new Frame ("Minu tehtud raam");Konstruktoreid saab klassi defineerimisel ise programmeerida. Konstruktor on klassimeetod, mille nimi langeb kokku klassi nimega ning millel puudub tagastustüüp. Selleks, et pöörduda ülemklassi konstruktori poole (pole ju hea seda koodi alamklassis dubleerida), tuleb kasutada meetodi nime super(). Kui soovitakse pöörduda sama klassi üledefineeritud konstruktori poole, tuleb kasutada meetodi nime this().
Muutuja raam kirjeldatakse kui Frame-tüüpi muutuja ning algväärtustatakse avaldisega new Frame ("Minu tehtud raam"), mis loob uue klassi Frame isendi pealkirjaga "Minu tehtud raam".
Konstruktorite poole pöördumine klasside hierarhias toimub järgmise skeemi kohaselt:
- Kui konstruktori esimeseks lauseks ei ole ilmutatud kujul pöördumine this() või super() poole, siis toimub enne kõiki muid tegevusi pöördumine ülemklassi ilma parameetriteta vaikekonstruktori super() poole. Alles peale seda initsialiseeritakse muutujad jms.
- Kui esimeseks lauseks on this(), siis valitakse signatuurile vastav konstruktor (mis otseselt või kaudselt pöördub super() poole) ning sellest naasmisel jätkatakse antud konstruktori täitmist.
- Kui me soovime ülemklassi konstruktorile edastada parameetreid, siis peab esimeseks lauseks olema super (parameetrid).
Teadete saatmine
Avaldistes kasutatakse teate saatmise operatsiooni tähisena punkti (vasakult paremale):
objekt.teade (parameetrid);
Klass.teade (parameetrid);Näide. int i = Integer.valueOf("123").intValue();
String-objekti "123" teisendus täisarvuks i toimub siin kahes jaos:
- Klassile Integer saadetakse teade valueOf("123"). Tulemuseks on Integer-tüüpi objekt (mitte arv), mis sisaldab arvu 123.
- Sellele objektile saadetakse teade intValue(). Tulemuseks on täisarv 123.
Praktiline kasutamine
Käsurealt täidetav programm
// Fail HelloWeb.java
/**
* Na"ide ka"surealt ta"idetavast programmist.
* @author Jaanus Po"ial
* @version 0.1 kevad 2003
*/
public class HelloWeb {
/** Peameetod.
* @param parameetrid parameetrina etteantav tekst massiivina.
*/
public static void main (String[] parameetrid) {
System.out.println ("Tere, veeb!");
}
} // HelloWeb loppTransleerimine ja lahendamine
javac HelloWeb.javajava HelloWeb
Veebilehelt käivitatav rakend
// Fail HelloApplet.java
import java.applet.Applet;
import java.awt.Graphics;
/**
* Lihtne rakend, mida saab panne veebilehele.
* @author Jaanus Po"ial
* @version 0.1 kevad 2003
*/
public class HelloApplet extends Applet {
/** Joonistamine rakendis.
* @param ekraan etteantud graafiline kontekst.
*/
public void paint (Graphics ekraan) { //ylekaetud meetod
ekraan.drawString ("Tere, veeb!", 50, 25);
}
} // HelloApplet loppFail HelloApplet.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- fail HelloApplet.html autor: Jaanus Po"ial 2003 -->
<html>
<head>
<title>Algaja esimene katsetus</title>
</head>
<body>
<applet code="HelloApplet.class" width=300 height=100>
</applet>
</body>
</html>Transleerimine ja lahendamine
javac HelloApplet.javaappletviewer HelloApplet.html
Programm, mis töötab rakendina ja Windows-rakendusena
// Fail HelloFrame.java
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/**
* Na"ide programmist, mis to"o"tab nii rakendi kui ka rakendusena.
* @author Jaanus Po"ial
* @version 0.1 kevad 2003
*/
public class HelloFrame extends Applet {
/** Peameetod rakenduse jaoks, mis omakorda ka"ivitab rakendi.
* @param parameetrid ka"surea parameetrid massiivina.
*/
public static void main (String[] parameetrid) {
Frame raam = new Frame ("Minu tehtud raam");
raam.setSize (300, 100);
Applet rakend = new HelloFrame();
raam.add (rakend);
raam.setVisible (true);
raam.addWindowListener (new WindowAdapter() {
public void windowClosing (WindowEvent e) {
System.exit (0);
}
} );
}
/** Joonistamine rakendis.
* @param ekraan graafiline kontekst.
*/
public void paint (Graphics ekraan) {
ekraan.drawString ("Tere taas, veeb", 50, 25);
}
} // HelloFrame lopp
Fail HelloFrame.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- fail HelloFrame.html autor: Jaanus Po"ial 2003 -->
<html>
<head>
<title>Rakend raamis</title>
</head>
<body>
<applet code="HelloFrame.class" width=300 height=100>
</applet>
</body>
</html>Transleerimine ja lahendamine (kahel viisil)
javac HelloFrame.javajava HelloFrameappletviewer HelloFrame.htmlmozilla file:///....HelloFrame.html &
/* Mitu
rida
kommentaare */
/**
* Klassi kirjeldus.
* @author Jaanus Pöial
* @version 1.00, 03 Mar 1999
* @since JDK 1.2
*/
// rea lõpuni kommentaar
//=================================
// Selliseid eraldamisi hea teha
//=================================
Näit.
int o = intObjekt.intValue();//245
String s = String.valueOf(o);//"245"
Integer teineObjekt = Integer.valueOf(s);
Kõrgeima prioriteediga tehted (väärtustatakse vasakult paremale):
{ [kirjeldused ja direktiivid] }
;
identifikaator: direktiiv
avaldis;
return [avaldis];
if (tingimus) direktiiv;if (tingimus) direktiiv1; else direktiiv2;
Kombineerimine ja treppimine
if (tingimus) {
direktiivid ... ;
} else if (tingimus2) {
direktiivid2 ... ;
} else {
direktiivid3 ... ;
}
while (jätkamistingimus) {
direktiivid ... ;
}
do
direktiivid...;
while (jätkamistingimus);
for (int i = 0, j = 10; i < j; i++, j--) {
System.out.println ("i=" + i + "; j=" + j);
}
switch (intavaldis) {
case avaldis1:
direktiivid1;
case avaldis2:
direktiivid2;
...
default:
direktiivid;
}
Javas töödeldakse eriolukordi erilise juhtimismehhanismi - katsendidirektiivi (ingl.k. try/catch) abil. Eriolukorra tekkimise kohas tekitatakse spetsiaalsete omadustega objekt klassist java.lang.Throwable või mõnest selle alamklassist. Juhtimine antakse seda tüüpi eriolukordi töötlevale programmiosale (catch-haru e. püünis) või tagasi antud meetodit välja kutsunud meetodile, kui antud meetod ise eriolukordi ei töötle.
Throwable
Error
LinkageError
ClassCircularityError
ClassFormatError
IncompatibleClassChangeError
NoSuchMethodError
NoSuchFieldError
InstantiationError
AbstractMethodError
IllegalAccessError
NoClassDefFoundError
VerifyError
UnsatisfiedLinkError
UnsatisfiedError
AbstractMethodError
ExceptionInInitializationError
ThreadDeath
VirtualMachineError
InternalError
OutOfMemoryError
StackOverflowError
UnknownError
AWTError
Exception
ClassNotFoundException
CloneNotSupportedException
IllegalAccessException
InstantiationException
InterruptedException
NoSuchMethodException
TooManyListenersException
ParseException
AWTException
IOException
CharConversionException
EOFException
FileNotFoundException
InterruptedIOException
ObjectStreamException
InvalidClassException
InvalidObjectException
NotActiveException
NotSerializableException
OptionalDataException
StreamCorruptedException
WriteAbortedException
SyncFailedException
UnsupportedEncodingException
UTFDataFormatException
MalformedURLException
ProtocolException
SocketException
BindException
ConnectException
NoRouteToHostException
UnknownHostException
UnknownServiceException
RuntimeException
ArithmeticException
ArrayStoreException
ClassCastException
IllegalArgumentException
IllegalThreadStateException
NumberFormatException
FormatException
IllegalMonitorStateException
IllegalStateException
IndexOutOfBoundsException
ArrayIndexOutOfBoundsException
StringIndexOutOfBoundsException
NegativeArraySizeException
NullPointerException
SecurityException
EmptyStackException
MissingResourceException
NoSuchElementException
IllegalComponentStateException
Selleks, et erindeid ise tekitada, kasutatakse erindiseade direktiivi (throw-statement), mille argumendiks on Throwable (alam-)klassi isend. Tekitatud erind tuleb reeglina töödelda või delegeerida töötlemiseks "üles".
Näit.
catch (Erinditüüp1 muutuja) {
...
catch (Erinditüüp_n muutuja) {
finally {
Võtmesõna try järel olev põhiblokk täidetakse n.-ö. silumisrezhiimis. Kui selle bloki sees (s.h. meetodites, mille poole otseselt või kaudselt pöördutakse) tekib mingi eriolukord, siis suunatakse juhtimine esimesse niisugusesse püünisesse, mis vastab tekkinud erindi tüübile ning seejärel katsendidirektiivist välja. Seega on mõtet järjestada püünised nii, et spetsiifilisemad erindiklassid töödeldaks eespool. Kui esineb ka epiloog võtmesõna finally järel, siis see täidetakse igal juhul (isegi siis, kui püünis sisaldab naasmisdirektiivi).
Püünise päises esinev muutuja on formaalne parameeter, mis lubab viidata tekkinud erindile.
Näit.
Näit.
public Object nextElement()
throws
java.util.NoSuchElementException {
if
(votaJargmine() == null)
throw new
class minuErind extends Exception {
public minuErind () {
super();
}
public minuErind (String s) {
super (s);
}
}