|
|
|
| Javan alkeet |
| Alkupuhe |
|
Java-kieli on jo
tuttu kaikille. Siitä kirjoitetaan netissä paljon ja kännyköiden yhteydessä se on jo standardi sovellusten kirjoituskieli.
Javasta onkin monta eri toteutusta eri käyttökohteisiin.
Java-ohjelmien tekemiseen JDK, selaimissa pyöriviin ohjelmiin
appletit, www-sivujen animointiin ja yksinkertaisiin lomakkeisiin
JavaScript, kännyköihin MIDP sekä PersonalJava. Sama koodi
(periaatteessa) pyörii useissa eri alustoissa ja käyttöjärjestelmissä.
Käytännössä sama ohjelma ei toimi joka paikassa, sama ohjelma ei
välttämättä pyöri edes Windowsin eri versioissa. Tästä on pitänyt
huolen jatkuvasti laajeneva Java API sekä Microsoft heittämällä
kapuloita Java yhteisön rattaisiin. Tämä artikkeli kuvaa Javaa JDK:n
suunnalta mutta peruskäkyt ovat samat kaikille muillekin alustoille.
Java JDK:n löydät osoitteesta
java.sun.com. Javasta löytyy pelkkää
ohjelmien ajoa varten JRE (Java runtime environment) joka vaaditaan
pystyäkseen ajamaan Javalla tehtyjä ohjelmia. Java ohjelmien
kehitykseen tarvitaan JDK (Java development kit) joka sisältää
JRE:n, kääntäjän, API kirjaston, API dokumentaation ja Java
lähdekoodin. Nämä kaikki tarvitaan ohjelmointiin. Tämän lisäksi olisi
hyvä olla jokin editori jolla koodia voidaan kirjoittaa. Tähän sopii
Windowsista löytyvä Noteped mutta itse käytän Borlandin JBuilder
editoria josta löytyy ilmainen personal versio osoitteesta
www.borland.com. Muitakin on,
eikä editorin merkillä ja mallilla ole ohjelman toiminnan kannalta
väliä mutta hyvä editori helpottaa ohjelmointia. |
| Virtuaalikone |
|
Java pyörii laiteriippumattomasti koska
se on tulkattava kieli. Tämä tarkoittaa, ettei kirjoitettua
ohjelmakoodia käännetä käyttöjärjestelmäkohtaisesti kuten C++
ohjelmille tehdään, vaan sama käännös voidaan ajaa
käyttöjärjestelmäkohtaista virtuaalikonetta (virtual machine) vasten.
Javan ja virtuaalikoneen rajapinta on sama kaikilla alustoilla mutta
virtuaalikoneen ja itse käyttöjärjestelmän välinen rajapinta on
natiivi.
Virtuaalikoneita on saatavissa uselta
valmistajilta. Ainakin Microsoftilla, Sunilla ja IBM:llä on omansa.
Aito ja originaali on Sunin virtuaalikone ja se tulee myös JDK:n
matkassa, sitä kannattaa mieluiten käyttää. Ohjelmia testatessa
muutkin virtuaalikoneet pitäisi kokeilla jotta pystyy lupaamaan tuen
joka ympäristöön. |
| Javan ja C++
kielen eroja |
|
Java on puhtaasti olio-ohjelmointia.
C++:lla vielä pystyi ohjelmoimaan ilman, että loi ainuttakaan olioa
mutta Javassa se ei enään onnistu. Javassa puhutaan metodeista,
C++:ssa funktioista. Java on
tulkattava kieli, C++ käännettävä. Siksi Java on huomattavasti
hitaampaa kuin natiivikielet.
Javassa ei ole esikäsittelijää eikä
siis esikäsittelijän #-alkuisia käskyjä ja makroja mitä C-kielestä
löytyy.
Javassa ei tarvitse esitellä luokkia
tai metodeja ennen niiden määrittelemistä. Siispä Javassa ei ole
C-kielestä tuttuja otsikkotiedostoja. Sen sijaan API luokkia tuodaan
ohjelmaprojektiin mukaan importoimalla niinkutsuttuja paketteja. Yksi
paketti on hakemisto Javan path määrittelyssä. Asentamalla JDK:n path
osoittaa valmiiksi oikein joten API-kirjastoja voi käyttää suoraan
ilman kummempia asetuksia.
Javakoodi kirjoitetaan aina
pakettipolkuun joka määritetään yrityksen nettiosoitteesta.
Esimerkiksi Sunin omat API laajennukset ovat pakettipolussa com / sun
/ abc / ... Tämä ei kuitenkaan ole vaatimus mutta koodit voidaan
eritellä muiden kirjoittamasta koodista yksityisellä polulla.
Pakettipoluksi kelpaa myös ohjelman nimi mutta tehtävissä olen
pitäytynyt kokonaan käyttämästä pakettipolkua lyhentääkseni koodia.
Jokainen luokka kirjoitetaan
tiedostoon, jonka tiedostonimi on oltava sama kuin luokan nimi. Yhteen
tiedostoon voi siten kirjoittaa vain yhden luokan (paitsi inner
classeja mutta se on toinen asia).
Java kooditiedosto päättyy aina .java
tunnisteeseen sekä käännetty koodi .class tunnisteeseen. Java kääntäjä
kuitenkin muuttaa tiedoston nimeä siten, että java-päätteinen tiedosto ei ole
välttämättä saman niminen class-päätteinen tiedosto.
Javassa ei ole destruktoria eikä
delete käskyä, koska muistin vapautus tehdään automaattisesti roskien
kerääjällä (garbage collector). Java itse osaa vapauttaa kaiken
ylimääräisen varatun muistin kunhan ohjelma itse vain ei ylläpidä
viittauksia käyttämättömiin olioihin.
Periyttäminen tehdään varatulla
sanalla extends (vastaa C++ ::-operaattoria)
Java tuo termin rajapinta
(interface). Rajapinnan määrittely on C++:n luokan esittelyn tapainen
mutta rajapinta pyrkii kuvaamaan jonkin itsenäisen komponentin
käyttöliittymän. Siis komponentti näkee toisesta luokasta vain
rajapinnan, jota kautta se kertoo omasta toiminnastaan. Esimerkiksi
hiiren toiminta on toteutettu jonnekin Javan syövereihin mutta
toteuttamalla hiirirajapinnan ohjelma pystyy tietämään mitä toimintoja
hiirellä on tehty (napautus, tuplanautus, liikkuminen jne.). Rajapinta
toteutetaan varatulla sanalla implements (puuttuu C++ kielestä).
Javassa ei ole metodien parametreillä
oletusarvoja. C++:ssa on mahdollista antaa oletusarvo jollekin
funktion parametrille, jolloin sitä ei ole pakko antaa
funktiokutsussa.
Javassa ei ole osoittimia kuten C++
kielessä.
Java ei tue moniperintää. Yksi luokka
ei voi periä kuin yhden yliluokan. C++-kielessä luokan on
mahdollista periä usea toinen luokka. |
| Kirjoitusäännöt |
|
Luokka sekä jokainen sana luokan nimessä
aloitetaan isolla kirjaimella. Esimerkiksi OmaTestiLuokka. Tiedosto,
johon tämä luokka kirjoitetaan on nimeltään OmaTestiLuokka.java.
Isoilla ja pienillä kirjaimilla on eroa.
Metodi aloitetaan pienellä kirjaimella
mutta jokainen muu sana metodin nimessä aloitetaan isolla kirjaimella.
Esimerkiksi omaTestiMetodi.
Luokan sisäiset muuttujat aloitetaan
sanalla my ja perään tulee muuttujan nimi. Esimerkiksi myTestVariable.
Tietotyyppiä ei ilmaista nimessä.
Itse tykkään kirjoittaa väliliyönnin vähän joka paikkaan mutta
muuten voit käyttää samoja sääntöjä kuin olet käyttänyt C-kielen
kanssa. |
| Kääntäminen |
|
Vaikka Java on tulkattava kieli koodi on
myös käännettävä enne ajamista. Tämä on erittäin mielenkiintoinen
ratkaisu koska kääntäminen ei hävitä kirjoitettua koodia vaan
ainostaan muokkaa koodin virtuaalikonetta varten. Tämä mahdollistaa
koodin takaisinkääntämisen (reverse engineering) siten että
ajettavasta ohjelmasta saadaan varsinainen ohjelmakoodi esille.
Kääntäminen tosin sotkee koodia sen verran ettei takaisinkäännetty
koodi ole kovin lukukelpoista. Tässä vaiheessa koodi voidaan myös
obfuskoida, eli vaihtaa luokkien, metodien ja muuttujien nimet
mitäänsanomattomiin kirjainlyhenteisiin. Esimerkiksi metodista
lueSalasana( int pituus ) voidaan obfuskoinnilla tehdä metodi
x7js9(int asa8) joka virtuaalikoneen mielestä on aivan yhtä
käyttökelpoinen kuin alkuperäinenkin.
Kääntäjä on nimeltään yksinkertaisesti
Javac (Java compiler). Kun olet saanut kirjoitettua koodin ja haluat
testata sitä, annat komentorivillä käskyn javac TestiLuokka.java (tai
javac *.java jos luokkia useampia). Kääntäjä tuottaa tarvittavat
class-tiedostot. Ohjelman voit ajaa käskyllä java TestiOhjelma, jossa
TestiOhjelma on luokka joka sisältää main-metodin. Yksi Java ohjelma
voi sisältää useitakin luokkia joissa on samainen main-metodi.
Ohjelmaa pystyy siis testaamaan esimerkiksi komponentti kerrallaan jos
jokaiseen kompponenttiin rakennetaan käynnistyksen tarvitsema koodi. |
|
Kommentointi |
|
C++ kielesta tuttut /* ... */ ja
//-merkinnät toimivat myös Javan kanssa. Ei niistä sen enempää,
mutta Javassa on erityinen Javadoc kommentointitapa. Javadoc on
itseasiassa ohjelma joka tulee JDK:n matkassa. Sen tarkoitus on
kerätä koodin joukosta javadoc-merkinnät ja tehdä niistä
www-sivusto. Tämä onkin myös tapa jolla Javan API on dokumentoitu,
kts
java.sun.com. Javadoc merkintä
aloitetaan aina merkillä /** ja lopetetaan merkkiin */. Se toimii
täysin C++ kielen kommenttina kaikille muille paitsi Javadoc
ohjelmalle. Kommettimerkkien väliin kirjoitetaan tiettyjä
koodisanoja jotka javadoc tulkitsee. Tällaisia ovat luokan kuvauksen
yhteydessä käytetyt @author ja @since sekä luokan kuvauksen
yhteydessä käytetyt @param ja @return. Luokan tai metodin kuvaus
kirjoitetaan aina ensimmäiseksi. Se saa olla niin pitkä kuin on
tarpeen, ainoastaan jonkin javadoc koodisanan löytyminen lopettaa
kuvauksen. Seuraava esimerkki selventää tätä.
/**
* Tähän kirjoitetaan luokan kuvaus. Ensimmäinen lause on aina
* tärkein ja ilmenee lyhyenä kuvauksena paketin yhteenvedossa.
* @author Tekijän nimi esim. Aku Ankka
* @since Ohjelmaversio 0.0.1
*/
public class TestiLuokka
{
/**
* Tähän kirjoitetaan metodin kuvaus. Ensimmäinen lause on aina
* tärkein ja ilmenee lyhyenä kuvauksena luokan yhteenvedossa.
* @param args tässä kuvataan kyseinen parametri
*/
public static void main( String args[] )
{
System.out.print( "Anna nopeus: " );
try
{
int nopeus;
System.in.read( nopeus );
System.out.println( "Nopeus on: " +
hidasVaiNopea( nopeus ) );
} catch( Exception e ) { System.out.println( "Virhe" ); }
}
/**
* Tähän kirjoitetaan metodin kuvaus.
* @param nop tässä kuvataan kyseinen parametri
* @return tässä kuvataan paluuarvo
*/
public String hidasVaiNopea( int nop )
{
if ( nop < 10 )
return "Hidas";
else
return "Nopea";
}
} |
|
Javaohjelman yleisrakenne |
|
Otetaan esimerkkinä edellinen
ohjelmanpätkä täydennettynä kokonaiseksi ohjelmaksi. Siitä löytyy
ensimmäisenä käsky import, jolla kerrotaan kääntäjälle, että luokassa
halutaan käyttää tästä paketista löytyviä toisia luokkia. AWT
(abstract window toolkit) on Javan perusikkunointisysteemi joka on
pakko importoida lähes aina. Jos haluaisit importoida vain yhden
tietyn luokan voi *-merkinnän paikalle kirjoittaa koko luokan nimen.
Suosittelen käyttämään *-muotoa koska se vähentää tarvittujen import
rivien määrää eikä yksittäisen luokan importoiminen oikeastaan tuo
mitään etua *-muotoon verrattuna. Java.lang paketti on aina
automaattisesti importoitu jokaiseen tiedostoon. Kaikki muu koodi pitää kirjoittaa
luokan sisään. Toisella rivillä määritellään TestiLuokka niminen
luokka ja sen sisällä siihen kuuluvaksi kaksi metodia, main ja
hidasVaiNopea.
Main metodi on mukana koska tämä
luokka on tarkoitus ajaa suoraan komentoriviltä. Main metodin
parametrinä tulee aina käynnistysparametrit merkkijonotaulukkona.
Metodin määritykset public static void ovat myös pakollisia juuri
siitä syystä että tämä metodi on tarkoitus pystyä ajamaan. Metodi
hidasVaiNopea on tässä vain esimerkin vuoksi.
import java.awt.*;
public class TestiLuokka
{
public static void main( String args[] )
{
System.out.print( "Anna nopeus: " );
try
{
int nopeus;
System.in.read( nopeus );
System.out.println( "Nopeus on: " +
hidasVaiNopea( nopeus ) );
} catch( Exception e ) { System.out.println( "Virhe" ); }
}
public String hidasVaiNopea( int nop )
{
if ( nop < 10 )
return "Hidas";
else
return "Nopea";
}
} |
|
Tunnukset |
| Tunnuksien käytössä
pätee samat säännöt kuin C-kielen kanssa. |
|
Tietotyypit |
|
Kokonaislukutyyppejä ovat short,
int ja long. Nämä ovat myös primitiivityyppejä mutta vastaavat tyypit
löytyvät myös luokkina Integer, Long, Short. Tämän lisäksi on luokat
BigInteger ja BigDecimal joita on tarpeen käyttää vasta todella
suuria lukuja käsiteltäessä.
Reaalilukutyyppejä ovat float ja
double. Vastaavat tyypit löytyvät myös luokkina Float, Double.
Boolean tietotyyppi on tietenkin
boolean tai luokkana Boolean.
Merkki-tietotyyppi on byte tai
luokkana Byte. Merkkijonon käsittelyyn on vain
yksi luokka, String. Se ei varsinaisesrti ole tietotyyppi mutta
käyttäytymisen ja yleisyytensä puolesta laskettakoon sellaiseksi.
| Tyyppi |
Alaraja |
Yläraja |
| Byte |
27 |
27-1 |
| Short |
215 |
215-1 |
| Int |
-231 |
231-1 |
| Long |
263 |
263-1 |
| Float |
2-149 |
(2-2-23)·2127 |
| Double |
2-1074 |
(2-2-52)·21023 |
| Boolean |
false |
true |
Nämähän ovat samat kuin mitä C++
kielestä löytyy mutta ala- ja ylärajat ovat niin korkealla että
kukaan tuskin pystyy vääntämään ohjelmaa jolle ne eivät riittäisi. |
|
Näkyvyysalue |
|
Näkyvyysalueella tarkoitetaan sitä
aluetta koodissa missä muuttuja on käytössä. Näkyvyysalueen määrää
määrittelypaikka ja muuttujan määritteet. Javassa näkyvyysalueita on
neljä, paikallinen, luokka, paketti ja kaikkialla.
C-kielestä tuttu näkyvyysalue on lohko
eli paikallinen näkyvyys kun muuttuja määritellään metodin tai vaikka
if-rakenteen sisällä. Esimerkiksi seuraavassa muuttuja nop on käytössä
vain ja ainostaan tämän metodin sisällä. Näkyvyyden määrää
määrittelypaikka. Muuttujalle ei voi tässä tapauksessa antaa
lisämääreitä joita alla käytetään.
public String hidasVaiNopea( int nop )
{
if ( nop < 10 )
return "Hidas";
else
return "Nopea";
}
Muuttuja voi olla käytössä koko
luokan sisällä jos se määritellään metodien ulkopuolella. Esimerkiksi
seuraavassa muuttuja testi on käytössä näin. Näkyvyyden määrää
määrittelypaikka ja määrite private. Määrite voisi olla myös protected
jolloin muuttuja olisi näkyvissä myös tästä luokasta periytyvissä
toisissa luokissa. Olen tässä opuksessa laskenut nämä kaksi
periaatteessa erilaista näkyvyysaluetta samaksi.
public class TestiLuokka
{
private int testi;
public static void main( String args[] )
{
// testi on käytössä täällä
}
public void metodi()
{
// testi on käytössä myös täällä
}
}
Javan erikoisuus on paketti
näkyvyysalue. Muuttuja voi olla käytössä koko paketin sisällä jos se
määritellään luokka näkyvyysalueelle mutta sen periytymismäärite
jätetään antamatta. Sanotaan että se on packet private muuttuja.
Esimerkiksi seuraavassa muuttuja testi on käytössä koko paketin
sisällä ja siis myös muissa luokissa kuin TestiLuokka. Näkyvyyden
määrää määrittelypaikka ja määritteen puuttuminen.
public class TestiLuokka
{
int testi;
public static void main( String args[] )
{
}
}
Laajin näkyvyysalue on kaikki.
Muuttuja on käytössä kaikkialla jos se määritellään luokka
näkyvyysalueelle mutta sen periytymismääritteeksi annetaan public.
Esimerkiksi seuraavassa muuttuja testi on käytössä kaikkialla.
Näkyvyyden määrää määrittelypaikka ja määrite public. Huomaa että
luokan periytymismääritteellä voidaan vaikuttaa muuttujan näkyvyyteen
eikä muuttuja voi näkyä laajemmalle kuin itse luokka. Jos luokka
määritetään protected määritteellä ja muuttuja public määritteellä on
muuttujalla käytännössä protected näkyvyysalue.
public class TestiLuokka
{
public int testi;
public static void main( String args[] )
{
}
}
|
|
Muuttujat ja sijoitus |
|
Javasta löytyy useita muuttujia koskevia
lisämääritteitä. Näkyvyysalueen kohdalla niistä käytiinkin läpi jo
periytymiseen vaikuttavat public, private ja protected. Jokin näistä
määreistä voidaan laittaa minkä tahansa muuttujan eteen, tai jättää
laittamatta. Yleensä kaytetään public määrettä.
Muistin säästämiseksi ja yleisten,
kaikille luokille samojen muuttujien tekemiseen on olemassa varattu
sana static. Sillä voidaan määrittää mikä tahansa oliokin
staattiseksi. Staattinen muuttuja on Javassa sama kuin C-kielessäkin.
Staattista muuttujaa ei ole olemassa kuin yksi kappale riippumatta
siitä, kuinka monta oliota, jonka jäsen tämä staattinen muuttuja on,
on. Esimerkiksi jos tehdään luokka jossa on staattinen muuttuja ja
tästä luokasta tehdään sata olioa, jokainen olio käsittelee yhtä ja
samaa muuttujaa. Jos joku olioista muuttaa staattisen muuttujan
tietoa, näkyy muuttunut tieto jokaiselle oliolle. Esimerkki staattista
muuttujasta olisi
static float PII = 3.14;
Jos jonkin muuttujan tietoa ei saa
muuttaa vaan halutaan tehdä vakio käytetään varattua sanaa final. Se
estää asettamasta muuttujaan uutta arvoa ohjelman aikana. Kääntäjä
varoittaa mikäli tällaista yritetään. Huomaa, että sijoitus onnistuu
ensimmäisellä kerralla eikä sitä ole pakko tehdä määrittelyn
yhteydessä. Esimerkki vakiosta
final float PII;
PII = 3.14;
Javassa ei pysty tekemään C-kielen
tapaan kirjainvakioita (#define). Jos vastaavia vakioita halutaan
tehdä käytetään tähän kahta varattua sanaa, static final. Tämä tekee
muuttujasta staattisen sekä lukitsee muuttujan arvon siten ettei sitä
voi enään muuttaa. Esimerkki staattisesta vakiosta olisi
static final float PII = 3.14;
|
|
Yksinkertainen syöttö ja
tulostus |
Java.lang paketissa on olemassa olio
System jolta löytyy syöttö- ja tulostusvirta. System.in lukee merkkejä
näppäimistöltä ja System.out kirjoittaa merkkejä ruudulle. Esimerkiksi
System.in.read(); // lukee
yhden merkin
byte bufferi[] = new byte[100]; // bufferi johon voidaan lukea 100
merkkiä
System.in.read( bufferi ); // lukee max 100 merkkiä koska enempää ei
mahdu
System.out.println( "Heippa" ); // tulostaa merkkijonon ja vaihtaa
riviä
System.out.print( "Heippa" ); // tulostaa merkkijonon ilman
rivinvaihtoa
Java osaa yhdistää merkkijonoja
keskenään sekä numeroita merkkijonoon + operaattorilla. Tätä voi
käyttää suoraan tulostuksessa. Myös muuttujan sisällön voi tulostaa
vastaavasti. Esimerkiksi
System.out.print( "Heip" + "pa"
); // tulostaa Heippa
System.out.print( "Heippa " + 1
); // tulostaa Heippa 1
System.out.print( nimi + " " +
313 ); // tulostaa esim Aku Ankka 313
|
|
Valintalauseet
|
|
Javassa on samat valintalauseet
kuin C-kielessäkin, if-else- ja switch-rakenne. Seuraavassa nämä
lyhyesti.
If-lauseen yleinen muoto on alla. Jos lauseke1 on tosi, suoritetaan lause1, muuten
testataan lauseke2. Jos se on tosi, suoritetaan lause2, jos ei
suoritetaan lause3. Else-if-haaroja voi olla useita, lukumäärää ei
ole rajoitettu.
if ( lauseke1 )
lause1;
else if ( lauseke2 )
lause2
else
lause3;
Jos jossain haarassa halutaan
suorittaa useita lauseita, ne kootaan yhteen lohkosulkeilla {}. Jos ohjelman suoritus etenee tähän
haaraan, suoritetaan kaikki ko. haarassa oleva lauseet. Ne voivat
sisältää uusia if-lauseita, funktiokutsuja jne. Toisinsanoen hyvinkin
monimutkaisten lauseiden rakentaminen on mahdollista. Esimerkki:
if ( x < 0 )
laskuri = laskuri - 1;
else
{
if ( x < 10 )
pieni_arvo( x );
else
suuri_arvo( x );
laskuri = laskuri + 1;
}
Monimutkaisia if-lauseita
käytettäessä täytyy käyttää lohkosulkeita selventämään mitä koodia
suoritetaan missäkin haarassa. Seuraavassa esimerkissä on vaikea
sanoa mihin else-haara kuuluu.
if ( x < 10 )
if ( x < 0 )
System.out.println( "x on negatiivinen." );
else
System.out.println( "mitä x on?" );
Switch-lausetta käytetään kun
tiedetään kaikki mahdolliset arvot ja jokainen arvo aiheuttaa
jotenkuten poikkeuksellisen tilanteen toteutuessaan. Switch-lauseen yleinen muoto on
alla. Muuttujan arvo etsitään case haaroista ja se kohta mikä on
juuri oikea, suoritetaan. Mikäli yksikään ei ole oikea, suoritetaan
default-haara.
Switch ( muuttuja )
{
case arvo1:
lause1;
break;
case arvo2:
lause2;
break;
default:
lause;
break;
}
Huomaa, että switch-lauseella ei
voi testata arvoalueita kuten x<0 tai liukulukuja (float, double),
koska niiden arvot eivät ole täysin vakioita. Siis case haarassa ei
voi olla kuin yksi tietty kokonaisluku jota verrataan muuttujan
arvoon. Esimekiksi
Switch ( laskuri )
{
case 1:
System.out.println( "Arvo on 1" );
break;
case 10:
System.out.println( "Arvo on 10" );
break;
default:
System.out.println( "Arvo ei ole 1 eikä 10" );
break;
}
Case-haaroja voi olla niin paljon
kuin on tarpeen, niiden lukumäärää ei ole rajoitettu. Break-käsky
täytyy olla jokaisen case-haaran lopussa koska juuri se aiheuttaa
poistumisen switch-case-lauseesta. Jos sen jättää pois, suoritetaan
myös seuraava case-haara samaan syssyyn. Toisinaanhan tämä voi olla
jopa haluttu toiminto. |
|
Toistolauseet
|
|
Javassa on myös samat toistolauseet
kuin C-kielessä, while-, do- ja for-rakenteet. Seuraavassa nämä
lyhyesti.
while-lause toistaa lausetta niin
kauan, kuin ehtolauseke on tosi. Jos while-lauseen lauseke on heti
alussa epätosi, niin lausetta ei suoriteta lainkaan. Lauseen yleinen
muoto on seuraava.
while( lauseke )
lause;
Jos toistettavia lauseita on useita, ne kootaan lohkosulkujen sisään. Seuraava koodi tulostaa kymmenen riviä.
int i = 0;
while ( i < 10 )
{
System.out.println( "Muutuja on: " + i );
i = i + 1;
}
do-lause on hyvin samantapainen
kuin while-lause. Siinä silmukan jatkamisehto testataan vasta
silmukan lopussa, eli silmukka suoritetaan aina vähintään
kerran. Do-lauseen yleinen muoto on seuraava.
do
lause
while ( lauseke );
Silmukkaa suoritetaan niin kauan, kuin lausekkeen arvo on tosi.
Esimerkki:
int i = 0;
do
{
System.out.println( "Muutuja on: " + i );
i = i + 1;
} while ( i < 10 );
Myös for-lause on
toiminta-ajatukseltaan samantapainen kuin while-lause. Se on vain
hieman kompaktimpi esitysmuodoltaan.
for( lauseke1; lauseke2; lauseke3 )
lause;
Ennen toistoa lasketaan lausekkeen 1 arvo, joka
tyypillisesti sisältää
tarvittavan kierroslaskurin alustuksen. Toistettavaa lausetta
suoritetaan niin kauan kuin lausekkeen 2 määrittämä ehto on voimassa
ja jokaisen toiston jälkeen lasketaan lausekkeen 3 arvo.
For-lausetta käyttämällä edellinen esimerkki näyttää seuraavalta,
tehokasta.
for ( int i=0; i<10; i=i+1 )
System.out.println( "Muutuja on: " + i );
|
|