Java alkeet

Mureakuha

Loikkaa: valikkoon, hakuun

Sisällysluettelo

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äskyt ovat samat kaikille muillekin alustoille.

Java JDK:n löydät osoitteesta Sun. 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 Borland. Vaihtoehtoisesti netistä löytyy Netbeans, jossa tulee Java mukana. 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(vaan se käännetään ns. välikielelle (Java ByteCode)) 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.

TyyppiAlarajaYläraja
Byte2727-1
Short215215-1
Int-231231-1
Long263263-1
Float2-149(2-2-23)·2127
Double2-1074(2-2-52)·21023
Booleanfalsetrue

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 );
Tämän dokumentin kopiointi, levittäminen sekä muokkaaminen on sallittua GNU Free Documentation Licensen version 1.2 tai uudemman Free Software Foundationin julkaiseman version mukaisesti, ilman muuttumattomuuslauseketta tai kansitekstejä. Tätä koskee vastuuvapaus.
Kopio lisenssistä (englanniksi) löytyy täältä.


Alkuperäinen (c) Petteri Hämäläinen

Henkilökohtaiset työkalut