Kirjoitetaan ohjelma, jonka avulla voidaan käsitellä virvoitusjuoma-automaatteja kuvaavia olioita. Yksinkertaisuuden vuoksi oletetaan, että käsiteltävät automaatit ovat hyvin yksinkertaisia: niistä voidaan ottaa yksi virvoitusjuomapullo kerrallaan, eikä pullosta tarvitse maksaa mitään. Ensimmäisessä versiossa automaattiin myös mahtuu mielivaltaisen monta pulloa. Se ei siis koskaan tule täyteen. Automaatti voi kuitenkin tulla tyhjäksi. Jos automaatti on tyhjä, siitä ei voi ottaa pulloja ennen kuin automaattiin lisätään niitä.
Seuraavassa esimerkikissä kirjoitetaan luokka LimsaAutomaatti kuvaamaan sitä, millaisia virvoitusjuoma-automaatteja kuvaavat oliot ovat. Jokainen ohjelmassa luotu LimsaAutomaatti-olio toimii edellä kuvatun automaatin tavoin. Oliolla on ominaisuus limsojenLkm, joka sisältää tiedon siitä, montako pulloa automaatissa on tällä hetkellä.
LimsaAutomaatti-luokkaa voisi verrata koneen piirustuksiin ja suunnitelmiin. Aivan samoin kuin elävässä elämässä voimme rakentaa piirustuksien avulla koneita, Java-ohjelmassa voidaan luoda olioita, joilla on LimsaAutomaatti-luokassa määritellyt ominaisuudet.
Aloitamme kirjoittamalla luokan otsikon
public class LimsaAutomaatti {
Otsikon jälkeen kerrotaan, mitä ominaisuuksia jokaisella LimsaAutomaatti-oliolla on. Tässä tapauksessa kerromme, että jokaisella LimsaAutomaatti-oliolla on tieto siitä, kuinka monta virvoitusjuomapulloa se tällä hetkellä sisältää. Virvoitusjuomapullojen määrää kuvaamaan tarvitaan kokonaislukuarvo. Kerromme, että jokaisella LimsaAutomaatti-oliolla on muuttuja limsojenLkm, joka voi saada arvokseen jonkun kokonaisluvun. Tälläistä muuttujaa sanotaan luokan kentäksi.
Kentän määrittely kirjoitetaan heti luokan otsikon jälkeen seuraavasti:
private int limsojenLkm;
Tämän jälkeen kerromme, mitä tehdään silloin, kun ohjelmassa luodaan uusi LimsaAutomaatti-olio. Tämä kerrotaan luokan konstruktorissa. Konstruktorissa olevat käskyt suoritetaan aina silloin, kun luodaan uusi LimsaAutomaatti-olio. Konstruktori on siis tavallaan malli siitä, mitä tapahtuu, kun luodaan uusi LimsaAutomaatti-olio. LimsaAutomaatti-luokan konstruktori näyttää seuraavalta:
public LimsaAutomaatti() {
limsojenLkm = 0;
}
Ensimmäinen rivi on konstruktorin otsikko. Siinä sana public määrittelee, että konstruktoria voidaan kutsua mistä tahansa luokasta. Tämän jälkeen tulee konstruktorin nimi, joka on aina sama kuin itse luokan nimi.
Otsikon jälkeen tulevat ne käskyt, jotka suoritetaan uutta oliota luodessa. Tyypillisesti konstruktorissa asetetaan alkuarvoja luotavan olion kentille. Tässä tapauksessa luotavan LimsaAutomaatti-olion limsojenLkm-kentän arvoksi asetetaan 0.
Kannattaa huomata, että kun konstruktorissa esiintyy luokan
kentän nimi, sillä tarkoitetaan aina sen olion kenttää, jota ollaan
juuri luomassa. Esimerkiksi konstruktorissa oleva käsky
limsojenLkm = 0 asettaa kentän limsojenLkm-kentän arvoksi 0
juuri siinä LimsaAutomaatti-oliossa, jota juuri luodaan. Sen sijaan
käsky ei vaikuta minkään muun LimsaAutomaatti-olion
limsojenLkm-kentän
arvoon. Jokaisella LimsaAutomaatti-oliolla on siis oma
limsojenLkm-kenttä, jonka arvo ei riipu mitenkään muiden olioiden
saman kentän arvosta.
Konstruktorin jälkeen seuraa joukko metodien määrittelyjä. Metodien avulla kerrotaan, millaisia viestejä luokan oliolle voidaan lähettää ja millaisia toimintoja viesti saa aikaiseksi. Tarkastellaan ensin metodin lisaaLimsoja koodia.
public void lisaaLimsoja(int maara) {
if (maara > 0)
limsojenLkm = limsojenLkm + maara;
}
Ylin rivi on metodin otsikko. Metodin otsikossa on tyypillisesti seuraavat osat: )
Metodin otsikon jälkeen seuraa metodin runko, joka sisältää ne käskyt, jotka suoritetaan silloin, kun oliolle lähetetään viesti lisaaLimsoja. Jos näissä käskyissä esiintyy luokan kentän nimi, sillä tarkoitetaan juuri sen olion kenttää, jolle viesti on lähetetty. Esimerkkitapauksessa on vain yksi if-käsky,
if (maara > 0) limsojenLkm = limsojenLkm + maara;
Tässä siis viestin saaneen olion limsojenLkm-kentän arvoa kasvatetaan maara-parametrin arvolla, jos maara-parametrin arvo on positiivinen. Jos parametrin arvo on 0 tai pienempi, ei tehdä mitään. Muutos vaikuttaa vain siihen olioon, jolle viesti on lähetetty. Kaikkien muiden olioiden limsojenLkm-kenttien arvot pysyvät samana metodin suorituksen ajan.
Seuraavan metodi annaLimsa kuvaa sitä, mitä tapahtuu, kun LimsaAutomaatti-oliosta halutaan ottaa virvoitusjuomapullo.
public int annaLimsa() {
if (limsojenLkm >= 1) {
limsojenLkm--;
return 1;
}
else
return 0;
}
Otsikossa oleva sana int kertoo, että tämä metodi lähettää viestin lähettäjälle vastauksena yhden kokonaisluvun. Tässä tapauksessa kokonaisluku kertoo, montako virvoitusjuomapulloa automaatti antoi. Sanotaan, että metodi palauttaa arvonaan kokonaisluvun. Palautettu arvo voidaan ottaa talteen ja sitä voidaan käyttää siinä kohtaa ohjelmassa, jossa LimsaAutomaatti-oliolle lähetetään viesti annaLimsa eli kutsutaan metodia annaLimsa.
Metodilla annaLimsa ei ole parametreja, joten otsikossa olevat kaarisulut ovat tyhjät.
Otsikon jälkeen seuraavat ne käskyt, jotka suoritetaan, kun oliolle lähetetään viesti annaLimsa. Aluksi tarkastetaan, onko limsojenLkm-kentän arvo viestin saaneessa oliossa vähintään yksi. Jos se on, vähennetään kentän arvoa yhdellä ja palautetaan viestin lähettäjälle kokonaislukuarvo 1 kertomaan siitä, että automaatti antoi yhden virvoitusjuomapullon. Jos kentän arvo ei ole vähintään 1, automaatti ei voi antaa virvoitusjuomapulloa, mitä metodi kuvaa sillä, että se palauttaa viestin lähettäjälle kokonaislukuarvon 0.
Metodi voi siis palauttaa arvon. Arvo palautetaan return-käskyllä. Sanan return jälkeen kirjoitetaan se arvo, jonka metodin halutaan palauttavan, esimerkiksi
return 1;aiheuttaa sen, että metodi palauttaa kokonaislukuarvon 1. Return-käskyssä ei tarvitse olla suoraan palautettavaa arvoa, vaan siinä voi olla esimerkiksi muuttujan nimi tai mikä tahansa lauseke, jonka arvo voidaan laskea. Tällöin lasketaan ensin käskyssä olevan lausekkeen arvo ja palautetaan sitten näin saatu arvo.
Lopuksi luokkaan on vielä kirjoitettu metodi annaLimsojenMaara. Tämän metodin avulla voidaan LimsaAutomaatti-luokan ulkopuolelta kysyä, montako virvoitusjuomapulloa jossain LimsaAutomaatti-oliossa on. Kenttä limsojenLkm on luokan yksityinen eikä sitä pääse käsittelemään (esimerkiksi sijoittamaan sille arvoja) suoraan luokan ulkopuolella, mutta annaLimsojenMaara-metodin avulla voidaan selvittää tämän kentän arvo. Metodin koodi on seuraava:
public int annaLimsojenMaara() {
return limsojenLkm;
}
Metodin otsikossa sana int kertoo jälleen, että metodi palauttaa arvonaan kokonaisluvun. Metodilla on ainoastaan yksi käsky, joka palauttaa käsiteltävän LimsaAutomaatti-olion limsojenLkm-kentän arvon.
Lopuksi vielä koko luokan koodi ilman ylimääräisiä selityksiä.
public class LimsaAutomaatti {
private int limsojenLkm;
// --- konstruktori: ----
public LimsaAutomaatti() {
limsojenLkm = 0;
}
// --- metodit
public void lisaaLimsoja(int maara) {
if (maara > 0)
limsojenLkm = limsojenLkm + maara;
}
public int annaLimsa() {
if (limsojenLkm >= 1) {
limsojenLkm--;
return 1;
}
else
return 0;
}
public int annaLimsojenMaara() {
return limsojenLkm;
}
}
Luokka siis kertoo millaisia LimsaAutomaatti-oliot ovat ja millaisia viestejä niille voi lähettää. Luokassa ei ole kuitenkaan luotu vielä yhtään LimsaAutomaatti-oliota eikä lähetetty yhtään viestiä.