Ülevaade keelest Java

Sissejuhatuseks

Ajalugu

1991 - P. Naughton, J. Gosling - projekt "Green", Sun
(järjekordne) virtuaalmasin,
Oak ==> Java,
1992 - "*7" - video-, kaabelTV aparatuur
1993 - Mosaic - graafiline veebilehitseja (Illinoisi Ülikool)
==> HotJava veebilehitseja (P.Naughton, J.Payne), Java-põhine, 1995
Netscape 2.0 Java toetus 1996
1996 - JDK 1.02
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
...

Java-programmi elutsükkel


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.java
Kui 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). Avaldise
new 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");
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".
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().
Konstruktorite poole pöördumine klasside hierarhias toimub järgmise skeemi kohaselt:
  1. 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.
  2. 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.
  3. 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:
    1. Klassile Integer saadetakse teade valueOf("123"). Tulemuseks on Integer-tüüpi objekt (mitte arv), mis sisaldab arvu 123.
    2. 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 lopp



Transleerimine ja lahendamine

javac HelloWeb.java

java 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 lopp

Fail  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.java

appletviewer 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.java
java HelloFrame
appletviewer HelloFrame.html

mozilla file:///....HelloFrame.html &


Java süntaks









Jaanus Pöial, 2004