Luokan aluussa on nyt siis määritelty kolme eri kenttää:
private String limsalaji; private int limsojenLkm; private int koko;
Konstruktorilla on nyt kaksi parametria, joiden avulla oliota luodessa kerrotaan, mitkä arvot annetaan luotavalle LimsaAutomaatti2-oliolle limsalaji- ja koko-kenttien arvoksi. Konstruktorin sisällä parametreja laatu ja maara voidaan käyttää samalla tavalla kuin mitä tahansa muuttujia.
public LimsaAutomaatti2(String laatu, int max) {
this.limsalaji = laatu;
if (max > 0)
this.koko = max;
else
this.koko = 0;
this.limsojenLkm = 0;
}
Konstruktori on kirjoitettu siten, että luotavan LimsaAutomaatti2-olion koko-kenttä ei voi saada negatiivista arvoa.
Metodi lisaaLimsoja on nyt monimutkaisempi kuin aikaisemmin. Automaattiin ei voida suoraan lisätä parametrina saatua määrää pulloja, vaan on ensin tarkistettava, montako pulloa automaattiin mahtuu. Tämä on laskettu vähentämällä automaatin koosta siinä jo olevien pullojen määrä. Saatu tulos on tallennettu muuttujaan mahtuu. Tämä on metodin paikallinen muuttuja, jota voidaan käyttää metodin suorituksen aikana. Metodin suorituksen jälkeen muuttujan arvo häviää eikä sitä enää muisteta. Huomaa ero verrattuna olion kenttiin: niiden arvot säilyvät niin kauan kuin olio on olemassa, ellei arvoja muuteta olion luokan metodeilla.
Metodia on myös muutettu niin, että se palauttaa kokonaislukuarvon, joka kertoo, montako pulloa automaattiin todellisuudessa lisättiin.
public int lisaaLimsoja(int maara) {
int mahtuu;
mahtuu = this.koko - this.limsojenLkm;
if (maara < 0)
return 0;
else if (maara <= mahtuu) {
this.limsojenLkm = this.limsojenLkm + maara;
return maara;
}
else {
this.limsojenLkm = this.limsojenLkm + mahtuu;
return mahtuu;
}
}
Jos metodille annettu parametri on negatiivinen, pullojen määrää automaatissa ei muuteta. Muuten verrataan parametrin arvoa siihen, paljonko automaattiin mahtuu. Jos lisättävä määrä on korkeintaan niin paljon kuin automaattiin mahtuu, lisätään koko määrä automaatin limsojenLkm-kentän arvoon. Tämän jälkeen metodi palauttaa lisätyn määrän. Jos lisättävä määrä on enemmän kuin automaattiin mahtuu, lisätään vain mahtuva määrä ja palautetaan se.
Metodit annaLimsa ja annaLimsojenMaara ovat samanlaisia kuin LimsaAutomaatti-luokassa. Metodin toString palauttama merkkijono on nyt pitempi, koska merkkijonoon on lisätty tieto uusien kenttien arvoista. Lisäksi luokkaan on lisätty uudet metodit annaLimsalaji ja annaKoko, joilla voidaan luokan ulkopuolelta selvittää jonkun LimsaAutomaatti2-olion limsalaji- ja koko-kenttien arvot.
Alla on vielä koko luokan koodi.
public class LimsaAutomaatti2 {
private String limsalaji;
private int limsojenLkm;
private int koko;
// --- konstruktori: ----
public LimsaAutomaatti2(String laatu, int max) {
this.limsalaji = laatu;
if (max > 0)
this.koko = max;
else
this.koko = 0;
this.limsojenLkm = 0;
}
// --- metodit
public int lisaaLimsoja(int maara) {
int mahtuu;
mahtuu = this.koko - this.limsojenLkm;
if (maara < 0)
return 0;
else if (maara <= mahtuu) {
this.limsojenLkm = this.limsojenLkm + maara;
return maara;
}
else {
this.limsojenLkm = this.limsojenLkm + mahtuu;
return mahtuu;
}
}
public int annaLimsa() {
if (this.limsojenLkm >= 1) {
this.limsojenLkm--;
return 1;
}
else
return 0;
}
public int annaLimsojenMaara() {
return this.limsojenLkm;
}
public int annaLimsalaji() {
return this.limsalaji;
}
public int annaKoko() {
return this.koko;
}
public String toString() {
return this.limsalaji + ": " + this.limsojenLkm + " pulloa, " +
"automaattiin mahtuu " + this.koko + " pulloa";
}
}
Alla on esimerkki pääohjelmasta, jossa luodaan LimsaAutomaatti2-olioita ja lähetetään niille viestejä:
public class Limsatesti2 {
public static void main(String[] args) {
LimsaAutomaatti2 raksanAutom, sahkonAutom;
int jaljella, saatiin, lisattiin;
raksanAutom = new LimsaAutomaatti2("Coca Cola", 50);
lisattiin = raksanAutom.lisaaLimsoja(40);
System.out.println("Raksan automaattiin lisättiin " + lisattiin +
" pulloa");
saatiin = raksanAutom.annaLimsa();
System.out.println("Automaatti antoi " + saatiin + " pulloa");
System.out.println(raksanAutom);
lisattiin = raksanAutom.lisaaLimsoja(25);
System.out.println("Raksan automaattiin lisättiin " + lisattiin +
" pulloa");
System.out.println(raksanAutom);
sahkonAutom = new LimsaAutomaatti2("Jaffa", 20);
lisattiin = sahkonAutom.lisaaLimsoja(3);
saatiin = sahkonAutom.annaLimsa();
System.out.println("Automaatti antoi " + saatiin + " pulloa");
lisattiin = sahkonAutom.lisaaLimsoja(25);
System.out.println("Sähkön automaattiin lisättiin " + lisattiin +
" pulloa");
System.out.println("Raksan automaatti: " + raksanAutom);
System.out.println("Sähkön automaatti: " + sahkonAutom);
}
}
Huomaa, kuinka uusia LimsaAutomaatti2-olioita luodessa konstruktorin parametreille annetaan arvot. Esimerkiksi
sahkonAutom = new LimsaAutomaatti2("Jaffa", 20);
saa aikaan sen, että luodaan uusi LimsaAutomaatti2-olio ja suoritetaan
LimsaAutomaatti2-luokan konstruktorissa olevat käskyt niin,
että parametrin laatu arvo on viite merkkijonoon "Jaffa" ja parmetrin
max arvo on kokonaisluku 20. Jos konstruktorilla (tai metodilla)
on useita parametreja, niiden arvot annetaan eri parametreille aina siinä
järjestyksessä, kun arvot esiintyvät konstruktorin (tai metodin) kutsussa.
Eli konstruktorin otsikossa ensimmäisenä oleva parametri saa kutsussa
ensimmäisenä luetellun arvon ja niin edelleen.
Kannattaa myös huomata, että esimerkiksi kutsussa
lisattiin = raksanAutom.lisaaLimsoja(25);käsiteltävän LimsaAutomaatti2-olion limsojenLkm-kentän arvo kasvaa vain 11:llä, koska kentän arvo on 39 ennen metodin kutsua ja käsiteltävään automaattiin mahtuu vain 11 pulloa.