Luokka muodostuu muuttujista ja metodeista, ja se kuvaa siitä luotavien olioiden rakenteen. Luokan muuttujat määrittelevät olion tietosisällön, kun taas luokan metodit tarjoavat keinot tietosisällön käsittelyyn.
Koodissa luokka määritellään seuraavasti:
public class [nimi] { ... }
Tässä kohtaan [nimi] tulee luokan nimi, joka on Java-kielessä tapana aloittaa isolla kirjaimella.
Seuraava koodi luo luokkaa vastaavan olion:
[nimi] olio = new [nimi]();
Tutustumme seuraavaksi luokan määrittelyyn käytännössä esimerkin avulla.
Esimerkissä tehdään luokka Tuote
, josta luodut oliot vastaavat
kaupan tuotteita. Kunkin olion tietosisältönä ovat tuotteen nimi ja hinta.
Ohjelmamme tulee sisältämään kaksi luokkaa:
Tuote
, josta muodostetaan tuoteoliot
Main
, joka on ohjelman pääluokka
Ohjelmassa on monta luokkaa, joten siitä kannattaa tehdä oma projekti
NetBeansissa. Tässä projektin nimeksi (Project Name) sopii vaikkapa
TuoteTesti
ja pääluokka (Main Class) on
Main
. Kokeile, että saat luotua ja suoritettua ohjelman
NetBeansissa.
Luokan Tuote
koodi on seuraava:
public class Tuote { private String nimi; private int hinta; public Tuote(String nimi) { this.nimi = nimi; this.hinta = 0; } public String haeNimi() { return this.nimi; } public int haeHinta() { return this.hinta; } public void asetaHinta(int hinta) { if (kelvollinenHinta(hinta)) { this.hinta = hinta; } } private boolean kelvollinenHinta(int hinta) { return hinta >= 0; } public String toString() { return this.nimi + " (" + this.hinta + " euroa)"; } }
Luokan Main
koodi on seuraava:
public class Main { public static void main(String[] args) { Tuote kirja = new Tuote("aapinen"); kirja.asetaHinta(15); System.out.println(kirja.haeNimi()); System.out.println(kirja.haeHinta()); System.out.println(kirja); kirja.asetaHinta(20); System.out.println(kirja); kirja.asetaHinta(-5); System.out.println(kirja); } }
Tässä Main
on pääluokka, joten ohjelman suoritus alkaa
luokan metodista main
. Ohjelman tulostus on seuraava:
aapinen 15 aapinen (15 euroa) aapinen (20 euroa) aapinen (20 euroa)
Seuraavaksi katsomme tarkemmin, mitä osia luokka Tuote
sisältää.
private String nimi; private int hinta;
Luokan alussa olevat muuttujat ilmaisevat, mitä tietoa olio tulee
sisältämään. Tässä tapauksessa luokkaan liittyy kaksi muuttujaa:
nimi
vastaa tuotteen nimeä ja hinta
vastaa tuotteen
hintaa.
Tässä muuttujien edessä on sana private
. Tämä tarkoittaa, että
muuttujia ei voi käsitellä suoraan luokan ulkopuolelta.
public Tuote(String nimi) { this.nimi = nimi; this.hinta = 0; }
Konstruktori suoritetaan silloin, kun luokasta luodaan olio. Konstruktorin tavallinen tehtävä on asettaa sopivat arvot olion muuttujille.
Konstruktorin nimi on sama kuin luokan nimi. Konstruktorin muoto vastaa muuten tavallista metodia, mutta siinä ei ilmoiteta lainkaan palautusarvon tyyppiä.
Konstruktorin parametrit määrittävät, mitä tietoa oliolle annetaan sen
luontivaiheessa. Tässä konstruktorilla on parametri nimi
, mikä
tarkoittaa, että olion luonnin yhteydessä ilmoitetaan tuotteen nimi.
Tuotteen hinnaksi konstruktori asettaa aina arvon 0.
Luokasta Tuote
voidaan luoda olio seuraavasti:
Tuote kirja = new Tuote("aapinen");
Tällöin tuloksena on seuraava olio:
nimi | hinta |
---|---|
aapinen | 0 |
Huomaa, että konstruktorissa on kahdenlaisia muuttujia:
this.nimi
ja this.hinta
viittaavat olion muuttujiin,
kun taas nimi
on konstruktorin parametri. Nimi täytyy kopioida
konstruktorin parametrista olion muuttujaan, jotta se säilyy tallessa
oliossa.
public String haeNimi() { return this.nimi; } public int haeHinta() { return this.hinta; } private boolean kelvollinenHinta(int hinta) { return hinta >= 0; } public void asetaHinta(int hinta) { if (kelvollinenHinta(hinta)) { this.hinta = hinta; } }
Luokkaan liittyy kolme julkista (public
)
metodia: haeNimi
palauttaa tuotteen nimen, haeHinta
palauttaa tuotteen hinnan ja asetaHinta
muuttaa tuotteen hintaa.
Hinta muuttuu vain, jos uusi hinta ei ole negatiivinen.
Lisäksi luokassa on yksityinen (private
) metodi
kelvollinenHinta
, jonka avulla metodi asetaHinta
tarkistaa, että uusi hinta on kelvollinen eli se ei ole negatiivinen.
Julkiset metodit muodostavat luokan rajapinnan: niiden avulla olion tietosisältöä voi hakea ja muuttaa. Yksityinen metodi on luokan sisäinen apumetodi, jota ei voi kutsua luokan ulkopuolelta.
public String toString() { return this.nimi + " (" + this.hinta + " euroa)"; }
Metodi toString
on erityisasemassa luokassa: se määrittää,
millaisen merkkijonoesityksen olio antaa itsestään tulostuskomennossa ja
silloin, kun se liitetään osaksi merkkijonoa.
Tässä esimerkissä olion merkkijonoesitys on "X (Y euroa)", jossa X on tuotteen nimi ja Y sen hinta.
Pääluokassa oleva koodi alkaa seuraavasti:
Tuote kirja = new Tuote("aapinen"); kirja.asetaHinta(15);
Tämä saa aikaan seuraavan olion:
nimi | hinta |
---|---|
aapinen | 15 |
Seuraavaksi tulostetaan olion tiedot ensin hakumetodien avulla ja sitten
toString
-metodin merkkijonoesityksinä:
System.out.println(kirja.haeNimi()); System.out.println(kirja.haeHinta()); System.out.println(kirja);
aapinen 15 aapinen (15 euroa)
Sitten tuotteelle annetaan uusi hinta:
kirja.asetaHinta(20);
Nyt olion sisältö on seuraava:
nimi | hinta |
---|---|
aapinen | 20 |
Lopuksi tuotteelle yritetään antaa negatiivinen hinta:
kirja.asetaHinta(-5);
Metodi asetaHinta
on toteutettu niin, että se ei salli tuotteen
hinnan muuttamista negatiiviseksi. Niinpä olion sisältö säilyy ennallaan:
nimi | hinta |
---|---|
aapinen | 20 |