![]() |
Oliot kehiin |
Ohjelmoini Java-kielellä perustuu täysin olio-ohjelmointiin. Ohjelmat toteutetaan siten, että valmiista oliokirjastoista (luokkakirjastoista) valitaan tarvittavat oliot ja luodaan nille ilmentymä. Näin saadaan tarvittavat ohjelmointikomponentit käyttöön.
Lisäksi voimme periyttää valmiista olioista uusia olioita ja kirjoittaa niihin tarvittavat lisäominaisuudet. On mahdollista myös luoda kokonaan uusia olioita.
Ennen kuin jatkamme eteenpäin, kertaamme vielä olio-ohjelmoinnin yleisiä perusteita ja käsitteistöä JAVA-ohjelmoinnin näkökulmasta.
Luokat:
Luokalla tarkoitetaan oliotyypin määrittelyä eli eräänlaista mallia. Eli luokka ei ole vielä itse olio vaan ainoastaan olion määrittely.
Java-kielessä luokka määritellään varatun sanan class avulla seuraavasti:
| muunnin class luokka extends kantaluokka implements rajapinta |
Muunnin kuvaa luokan ominaisuuksia. Yleisimmät muuntimet ovat:
| public | Luokka on periytyvä ja sen ominaisuuksia ja metodeja voidaan kutsua ulkoa |
| final | Luokka ei periydy. Luokan ominaisuuksia ja metodeja voidaan kutsua ulkoa |
| abstract | Luokasta voidaan tehdä olioita ainoastaan periyttämällä. Luokan metodit eivät sisällä ohjelmakoodia. |
Esimerkiksi uudet appletit periytetään luokasta Applet, jolloin uusi olioluokka perii kaikki Appletin tarvitsemat perusominaisuudet. Uusi luokka voidaan rakentaa oikeastaan mistä tahansa kokonaisuudesta.
Eli luokka kapseloi kaikki tiettyyn kokonaisuuteen liittyvän tiedon (ominaisuud "muuttujat") ja taidon (metodit) yhdeksi helposti hallittavaksi paketiksi.
Luokan ominaisuudet (muuttujat):
Luokka voi sisältää ominaisuuksia (muuttujia) joita käytetään luokkaan liittyvän tiedon tallentamiseen.
Luokan ominaisuudet voidaan määritellä joko yksityisiksi avainsanalla private tai julkisiksi avainsanalla public. Tämä tarkoittaa sitä, näkyykö ominaisuus (muuttuja) luokan (olion) ulkopuolelle vai onko se ainoastaan luokan (olion) sisäisessä käytössä.
Luokan metodit (funktiot):
Luokan taito puolestaan tallennetaan luokan sisäisiin funktioihin joita kutsutaan metodeiksi.
metodi määritellään luokassa seuraavasti:
| muunnin paluuarvo funktion_nimi (parametrit) |
Paluuarvona voidaan myös käyttää C-kielen tapaan arvoa void.
Metodin sisältämä ohjelmakoodi kirjoitetaan myöhemmin tulevan esimerkin mukaisesti heti metodin esittelyn yhteyteen luokan määrittelyn sisälle.
Yleisimmät muuntimet metodeille ovat:
| public | metodia voidaan kutsua olion ulkopuolelta |
| private | metodia voi kutsua vain luokan itsensä sisältä eli se ei näy ulospäin |
Olion ilmentymä:
Huomaa, että luokan määrittely on vasta oliotyypin kuvaus eikä sinällään tuo käyttöön yhtään oliota.
Kun haluamme käyttöömme luokan määrittelyä vastaavan olion, täytyy ko. oliolle määritellä ns. ilmentymä seuraavasti:
| luokka olio; // määrittely olio = new luokka(); // ilmentymän luonti |
tai suoraan
| luokka olio = new luokka(); |
Olion ominaisuuksia ja metodeja voidaan kutsua olion sisältä suoraan ja olion ulkopuolelta muodossa:
| olio.ominaisuus; tai olio.metodi(); |
Seuraava esimerkki havainnollistaa käytännössä olioiden määrittelyä ja käyttöä JAVA-ohjelmissa:



Muodostimen käyttö:
Muodostin on metodi, jota kutsutaan automaattisesti olion luomisen yhteydessä. Muodostimiin sijoitetaan yleensä olion alustamiseen liittyvät toimenpiteet.
Luokalle määritellään muodostin antamalle muodostimelle sama nimi kuin luokallakin on.
Huomaa, että hajoitinta ei JAVA-kielessä tarvita lainkaan, koska kielessä on automaattinen muistinvapautusmekanismi.
Seuraavassa esimerkissä toteutamme edelliseen esimerkkiin muodostimen:



Olioiden periytyminen:
JAVA-kielessä on toteutettu olioiden periytyminen aivan normaalin olio-ohjelmoinnin tavoin.
Mikäli luokka (olio) periytetään toisesta luokasta on määrittely muotoa:
| class luokan_nimi extends kantaluokka |
Uusi luokka perii kaikki kantaluokkansa ominaisuudet ja metodit.
Aikaisemmissa esimerkeissämme olemme periyttäneet mm. kaikki appletit luokasta Applet.
Seuraavassa jatkamme aiempaa esimerkkiä periyttämällä luokasta Joku aivan uuden luokan Joku2:




Super-muuttujan avulla voidaan kutsua olio-hierarkian ylemmän tason muodostinta hoitamaan aiemmat alustukset.
| Huomasit varmaan, että näiden olio-esimerkkien kääntäminen on tuottanut useampia .class -tiedostoja. Java-kääntäjä kääntääkin jokaisen luokan omaan tiedostoonsa ja kaikkien näiden täytyy olla mukana, jotta sovellus toimisi. |
Metodien ylikirjoittaminen ja ylikuormittaminen:
Metodin ylikirjoittamisella tarkoitetaan olio-ohjelmoinnissa sitä, että uudessa oliossa voidaan määritellä samanniminen metodi jonkun perityn metodin kanssa. Tällöin peritty metodi kirjoitetaan yli uudella metodilla.
Kun metodi ylikirjoitetaan, täytyy uudella metodilla olla täsmälleen sama nimi ja samat parametrit (syöttöparametrit ja palautusparametri) kuin ylikirjoitettavalla metodilla.
Jos parametrit eroavat, on kysymyksessä metodin ylikuormittaminen eikä ylikirjoittaminen.
Eli ylikuormittamisella tarkoitetaan sitä, että luokkaan voidaan kirjoittaa useita samannimisiä metodeja erilaisilla parametreillä ja kutsutapa ratkaisee, mihin metodiin kutsu kulloinkin kohdituu.
Seuraava esimerkki havainnollistaa metodien ylikirjoittamista ja ylikuormittamista:





Ylikuormitettaessa metodia kääntäjä etsii parhaiten kutsuun sopivan metodin ja yhdistää kutsun siihen.
Javan luokkakirjastoista:
Koko Java-ohjelmointi perustuu olioiden käyttöön.
Java-kielessä on C-kielen include-lauseen tavoin käytettävissä import-lause, jonka avulla sisällytettän kulloinkin tarvittavat luokkakirjastot ohjelmaan mukaan.
Luokkien käyttö on ainoa tapa saada ohjelma tekemään jotain järkevää, sillä kaikki toiminnallinen koodi kirjoitetaan normaalisti olioiden metodeihin.
Huomaa, että jokaiseen ohjelmaan ei tarvitse liittää kaikkia luokkakirjastoja mukaan vaan ainoastaan tarpeelliset.
Javan luokkakirjastot ovat hierarkisia, mikä mahdollistaa koko kirjaston tai vain vaikkapa yhden luokan tuomisen ohjelmaan mukaan.
Aikaisemmissa esimerkeissä olemme mm. liittäneet Javan Graphics-luokan (hoitaa tulostuksen) ohjelmaan mukaan seuraavasti:
| import java.awt.Graphics; |
Jos olisimme vastaavasti halunneet linkittää koko näytönhallinta-kirjaston (awt) , olisimme kirjoittaneet seuraavan lauseen.
| import java.awt.*; |
Tällöin ohjelman käyttöön olisi saatu kaikki awt-kirjaston luokat
Java-kielen luokkakirjastoja kutsutaan paketeiksi (packages). Luokkakirjastot ovat javassa puhtaita eli ne sisältävät ainoastaan olioluokkia, eivätkä siis esimerkiksi erillisiä muuttujia tai funktioita.
Sunin JDK-paketissa tulee mukana kaikkiaan 22-luokkakirjastoa jotka on tarkoitettu sovelluskehittäjien käyttöön.
Seuraavassa on lueteltu ohjelmoijan kannalta tärkeimmät paketit (kirjastot):
| java.applet | Java-applettien perusluokka. Tarvitaan kaikissa appleteissa |
| java.awt | Javan perus GUI eli tämän kirjaston luokkien avulla toteutetaan ohjelman peruskäyttöliittymät (grafiikka, painonapit, edit-kentät, listat jne.) |
| java.awt.Event | Käsittelee käyttöliittymän tapahtumat (käyttäjän aiheuttamat) |
| java.awt.image | Tarkoitettu GIF- ja JPG-kuvien käsittelyyn |
| java.io | Java-kielen I/O-toiminnto (mm. tiedostojen- ja hakemistojen käsittely). Tosin WWW-selaimet eivät salli tämän luokan olioiden käyttöä |
| java.lang | Eri tietotyyppejä vastaavat oliot (esim. String) |
| java.Math | Sisältää matemaattisia toimintoja |
Harjoituksia:
| 1. | Tee aikaisemman esimerkin mukaisesti vaikkapa auton
(voit myös valita jonkin muun kohteen) ominaisuuksista
oma olioluokka. Sisällytä olioluokkaan ominaisuuksien
lisäksi metodit tietojen lukemiseen/kirjoittamiseen
ominaisuuksiin. Tee pieni Java-appletti, joka käyttää ko. olioluokkaa edellisen esimerkin tavoin hyväkseen eli sijoittaa ominaisuuksiin arvoja ja tulostaa niitä. |
| 2. | Kuvitellaan tilanne, että autoon (tai muuhun kohteeseen) tarvittaisiin kaksi ominaisuutta lisää (keksi itse ominaisuudet). Periytä olio-ohjelmoinnin periaatteita kunnioittaen edellisen tehtävän olioluokasta uusi luokka sekä kirjoita sinne tarvittavat lisäominaisuudet sekä metodit ominaisuuksien käsittelemiseksi. |