next up previous contents
Next: Ilmaus this Up: Esimerkki yksinkertaisesta luokasta ja Previous: Luokan kirjoittaminen   Sisältö

Olioiden luonti ja käyttö

Seuraavaksi esitetään pääohjelma, jossa luodaan LimsaAutomaatti-olioita ja lähetetään niille viestejä. Pääohjelman voisi kirjoittaa LimsaAutomaatti-luokkaankin, mutta yleisempi tapa on kirjoittaa pääohjelma johonkin toiseen luokkaan. Määrittelemme pääohjelmaa varten luokan Limsatesti1 (sana testi tulee tässä siitä, että luokassa oleva pääohjelma on kirjoitettu oikeastaan sitä varten, että sen avulla pystyy testaamaan LimsaAutomaatti-luokan toimintaa).

Kun haluamme käsitellä ohjelmassa olioita, tarvitsemme muuttujia, joiden kautta pääsemme luotaviin olioihin käsiksi. Tällaisen muuttujan tyyppi on sama kuin sen luokan nimi, jonka oliota voidaan muuttujan avulla käsitellä. Esimerkissä määritellään pääohjelman alussa kaksi muuttujaa, joiden avulla voidaan käsitellä myöhemmin luotavia LimsaAutomaatti-olioita:

LimsaAutomaatti raksanAutom, sahkonAutom;

Tämä määrittely ei vielä luo yhtään oliota. Se vasta määrittelee kaksi muuttujaa, jotka voidaan yhdistää myöhemmin luotaviin olioihin.

Olio voidaan luoda käyttämällä new-operaattoria ja luokan konstruktoria seuraavasti:

new LimsaAutomaatti();

Tästä ei olisi kuitenkaan ohjelmassa paljon iloa, koska näin luotuun LimsaAutomaatti-olioon ei pääsisi enää myöhemmin ohjelmassa käsiksi. Tämän vuoksi meidän pitää yhdistää joku muuttuja luotuun olioon. Se voidaan tehdä sijoituskäskyn avulla:

raksanAutom = new LimsaAutomaatti();

Sijoituskäsky yhdistää muuttujan raksanAutom luotuun olioon. Tarkasti ottaen muuttujan raksanAutom arvoksi sijoitetaan tieto siitä, missä kohdassa tietokoneen muistissa luodun olion tiedot sijaitsevat. Sanotaan, että muuttujan raksanAutom arvona on viite luotuun olioon. Myöhemmin ohjelmassa voidaan tälle oliolle lähettää viestejä nimen raksanAutom avulla. Esimerkiksi voimme lähettää oliolle viestin lisaaLimsoja:

raksanAutom.lisaaLimsoja(5);

Viestin lähetys saa aikaan sen, että suoritetaan LimsaAutomaatti-luokassa olevan metodin lisaaLimsoja käskyt niin, että käsitellään juuri sitä LimsaAutomaatti-oliota, joka on yhdistetty muuttujaan raksanAutom. Viesti oliolle lähetetään siten, että ensin kirjoitetaan olioon viittaavan muuttujan nimi, tämän jälkeen piste ja sitten viestin (metodin) nimi. Sulkujen sisälle kirjoitetaan mahdollisten parametrien arvot. Metodilla lisaaLimsoja on yksi parametri, maara. Viestiä lähetettäessä kerrotaan, mikä arvo parametrille maara annetaan, kun metodia tällä kerralla suoritetaan. Yllä olevassa esimerkissä lähdetään siis suorittamaan metodia niin, että parametrin maara arvo on 5.

Metodi lisaaLimsoja ei palauta mitään arvoa eli se ei lähetä mitään vastausta viestin lähettäjälle. Sen sijaan metodi annaLimsa lähettää viestin lähettäjälle tiedon siitä, montako virvoitusjuomapulloa automaatista annettiin. Toisin sanoen, metodi annaLimsa palauttaa kokonaislukuarvon, joka kertoo virvoitusjuoma-automaatista annettujen pullojen määrän. Metodin palauttama arvo voidaan ottaa talteen siinä kohdassa, missä metodia on kutsuttu, esimerkiksi sijoittamalla arvo johonkin muuttujaan seuraavaan tapaan:

int saatiin;
saatiin = raksanAutom.annaLimsa();

Tässä on määritelty kokonaislukumuuttuja saatiin, kutsuttu sitten annaLimsa-metodia ja sijoitettu metodin palauttama arvo muuttujan saatiin arvoksi.

Metodin palauttamaa arvoa ei ole pakko sijoittaa johonkin muuttujaan. Se voidaan myös tulostaa suoraan niin, että metodia kutsutaan suoraan tulostuskäskyn sisällä:

System.out.println("Automaatti antoi " + 
                   raksanAutom.annaLimsa() + " pulloa");

Tässä kutsutaan metodia annaLimsa ja sen palauttama arvo tulostetaan, mutta metodin palauttamaa arvoa ei voida tämän jälkeen käyttää ohjelmassa, koska arvoa ei ole tallennettu minnekään.

Vastaavasti metodia voidaan kutsua keskellä mitä tahansa sellaista lauseketta, jonka arvo voidaan laskea.

Samassa ohjelmassa voidaan luoda ja käsitellä useita LimsaAutomaatti-olioita. Esimerkiksi alla olevassa ohjelmassa luodaan kaksi eri LimsaAutomaatti-oliota, joista toinen yhdistetään muuttujaan sahkonAutom ja toinen muuttujaan raksanAutom. Kun kutsutaan metodeja, esimerkiksi annaLimsa ja lisaaLimsoja, ne kohdistuvat aina siihen olioon, jolle viesti lähetetään. Esimerkiksi kutsu

sahkonAutom.lisaaLimsoja(3);

lisää limsojenLkm-kentän arvoa juuri siinä LimsaAutomaatti-oliossa, johon muuttuja sahkonAutom on yhdistetty. Sen sijaan metodin kutsu ei vaikuta mitenkään ohjelmassa olevaan toiseen LimsaAutomaatti-olioon.

Oliot toimivat tässä suhteessa ihan samoin kuin todelliset virvoitusjuoma-automaatit. Jos meillä on kaksi automaattia, joista ensimmäiseen lisätään pulloja, ei tämä vaikuta millän tavalla toisen automaatin sisältöön.

Lopuksi vielä kokonaisuudessaan pääohjelma, jossa luodaan LimsaAutomaatti-olioita ja lähetetään niille viestejä.

public class Limsatesti1 {
  public static void main(String[] args) {
    LimsaAutomaatti raksanAutom, sahkonAutom;
    int jaljella, saatiin;

    raksanAutom = new LimsaAutomaatti();
    raksanAutom.lisaaLimsoja(5);
    saatiin = raksanAutom.annaLimsa();
    System.out.println("Automaatti antoi " + saatiin + " pulloa");
    jaljella = raksanAutom.annaLimsojenMaara();
    System.out.println("Raksan automaatissa on " + jaljella + " limsaa");

    sahkonAutom = new LimsaAutomaatti();
    sahkonAutom.lisaaLimsoja(3);
    saatiin = sahkonAutom.annaLimsa();
    System.out.println("Automaatti antoi " + saatiin + " pulloa");
    jaljella = sahkonAutom.annaLimsojenMaara();
    System.out.println("Sahkon automaatissa on " + jaljella + " limsaa");
  }
}


next up previous contents
Next: Ilmaus this Up: Esimerkki yksinkertaisesta luokasta ja Previous: Luokan kirjoittaminen   Sisältö
Kerttu Pollari-Malmi 2003-03-23