KOHDELUOKAN MÄÄRITTELY Kohdeluokka, mitä se sisältää Luokan määrittely Olion ominaisuudet eli attribuutit Olion metodit Olion luonti Olion tuhoutuminen Metodin kutsu luokan ulkopuolelta Taulukon alkiona olio Luokkakohtaiset attribuutit ja metodit
KOHDELUOKKA on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä vrt. tiedonhallinta ja tietokannat opintojakson luokkakaavio, luokkakaavion luokat ovat kohdeluokkia Esim. Tuote-luokka, Asiakas-luokka, Oppilas-luokka, Opettaja-luokka, Opintojakso-luokka jne. 2
Mitä kohdeluokka sisältää? + Olion ominaisuudet eli attribuutit + Olion metodit eli toimenpidekokonaisuudet + Luokan attribuutit + Luokan metodit 3
Luokan määrittely näkyvyys class LuokanNimi { Näkyvyys: private luokkaa ei voi käyttää mistään public luokka on julkinen, sitä voi käyttää mistä vaan protected liittyy periytymiseen, ei käsitellä nyt puuttuu luokkaa voi käyttää vain siitä paketista, jossa se on määritelty valinnainen pakollinen 4
näkyvyys class LuokanNimi { Luokan nimi kirjoitetaan aina suurella alkukirjaimella Luokka talletetaan täsmälleen samalla nimelle kuin kirjoitetaan luokan nimi Tiedoston tietotyyppi on java 5
Olion ominaisuudet eli attribuutit Olion attribuutit kuvaavat sen ominaisuuksia Esim. Oppilas-luokka sisältää seuraavat olion ominaisuudet: oppilasnumero etunimi Sukunimi email puh Jokaisella Oppilas-luokan oliolla on samat attribuutit, mutta jokaisen olion attribuuteilla on eri arvot eli olion omat arvot 6
Olion ominaisuudet eli attribuutit jatkuu Olion attribuutit määritellään seuraavasti: public class Luokka { näkyvyys tietotyyppi attribuutinnimi; näkyvyys tietotyyppi attribuutinnimi; 7
näkyvyys tietotyyppi attribuutinnimi; Attribuutin näkyvyys määrittää attribuutin käyttöalueen eli mistä voi viitata ko. attribuuttiin Näkyvyys: private Tarkoittaa, että ko. attribuutti on piilotettu luokan sisään, eikä siihen voi viitata kuin luokan sisältä eli olion omista metodeista. public Tarkoittaa, että ko. attribuutti on julkinen, eli siihen voi viitata mistä tahansa luokasta. protected liittyy periytymiseen, ei käsitellä nyt puuttuu ko. attribuuttia voi käyttää vain siitä paketista, jossa se on määritelty 8
private tietotyyppi attribuutinnimi; Luokan attribuutit määritellään yleensä näkyvyydellä private Miksi? Vain luokka itse saa muuttaa attribuuttien arvoja luokka vastaa attribuuttien arvojen oikeellisuudesta Ylläpidettävyys helpottuu Mitä jos attribuutin näkyvyys on public? Kuka tahansa voi muuttaa attribuutin arvon arvoa ei tarkasteta ongelmia, miten löydän ohjelmasta virheen ylläpito, miten ymmärrän ohjelman toimivuuden, jos attribuutin arvoa voi muuttaa missä tahansa? 9
näkyvyys tietotyyppi attribuutinnimi; Jokaisella attribuutilla on tietotyyppi ja nimi Attribuutti on AINA käytettävissä luokan sisällä, eli olion metodeissa Esim. public class Aika { private int tunnit; private int minuutit; private int sekunnit; 10
Olion metodit Olion metodit määritellän luokan sisään public class Luokka{ näkyvyys tietotyyppi metodinnimi (parametrilista) { Metodin runko Näkyvyys: private metodia voi kutsua vain sen oman luokan metodeista public metodi on julkinen, sitä voi kutsua mistä vaan protected liittyy periytymiseen, ei käsitellä nyt puuttuu metodia voi kutsua vain siitä paketista, jossa se on määritelty 11
Kapselointi Luokan attribuutit ja metodit voidaan kapseloida eli piilottaa luokan sisään (private) tai antaa toisten olioiden käytettäväksi (public) Miksi? LUOKKA on valmis paketti, se ei ole (ei pitäisi olla) sidoksissa ympäristöönsä voidaan käyttää samaa luokkaa useissa sovelluksissa (UUDELLEENKÄYTETTÄVYYS) Jos olemassaolevan luokan kaikki ominaisuudet eivät riitä uudessa sovelluksessa käytetään vanhan luokan ominaisuuksia ja metodeja ja periytetään luokka siten, että uudet vaatimukset tulevat täytettyä ei tarvitse koodata samaa asiaa uudelleen vaan ainoastaan tarvittavat uudet asiat Entä jos sovellukseen tulee muutoksia (esim. henkilötunnuksen rakenne muuttuu) muutoskohta pystytään paikallistamaan ja rajallistamaan helposti (YLLÄPIDETTÄVYYS) 12
setattribuutti-metodit eli attribuuttien asetusmetodit Metodi vie uuden arvon ko. attribuutille, se tarkastaa attribuutin uuden arvon ja hyväksyy (sijoittaa attribuutin arvoksi) tai hylkää (ei sijoita attribuutin arvoksi) tämän public void setattribuutinnimi (tietotyyppi parametri) Metodin näkyvyys on public Metodin tyyppi on void se ei palauta mitään tietoja Metodin nimi alkaa sanalla set ja jatkuu attribuutin nimellä isolla alkukirjaimella Metodilla on yleensä yksi parametri, jonka tietotyyppi on sama kuin ko. attribuutilla 13
setattribuutti-metodit jatkuu Esim. public class Aika { private int tunnit; //Attribuutit: private int minuutit; private int sekunnit; // setattribuutti-metodit public void settunnit ( int h ){ tunnit = 0; if (h >= 0 && h < 24) tunnit = h; public void setminuutit ( int m ){ minuutit = 0; if (m >= 0 && m < 60) minuutit = m; public void setsekunnit ( int s ){ sekunnit = 0; if (s >= 0 && s < 60) sekunnit = s; // tunnit ϵ [0,24[ // minuutit ϵ [0,60[ // sekunnit ϵ [0,60[ 14
getattribuutti-metodit eli attribuuttien saantimetodit metodi palauttaa ko. attribuutin arvon kutsujalle public tietotyyppi getattribuutti() metodin näkyvyys on public metodin tietotyyppi on yleensä sama kuin ko. attribuuttilla metodin nimi alkaa sanalla get ja jatkuu attribuutin nimellä isolla alkukirjaimella metodilla ei ole parametreja 15
getattribuutti-metodit jatkuu Esim. public class Aika { //Attribuutit: private int tunnit; private int minuutit; private int sekunnit; //getattribuutti_metodit public int gettunnit() { return tunnit; public int getminuutit() { return minuutit; public int getsekunnit() { return sekunnit; 16
public String tostring () -metodi jokainen Java-luokka on periytetty Object-luokasta Object-luokalta olio perii tostring-metodin, mutta metodi ei toimi niin kuin ohjelmoija sen haluaa, eli ohjelmoidaan se itse Kun ohjelmoija itse määrittelee tostring-metodin: public class Aika { private int tunnit; private int minuutit; private int sekunnit; public String tostring (){ return tunnit + ":" +minuutit + ":" + sekunnit; Metodia käytetään olion tietojen tulostamisessa 17
Olion luonti Luokan ilmentymä (instance of class) eli luokan olio luodaan operaatiolla new () seuraavasti: tai Luokka ab= new Luokka ( ); Luokka ab= null; ab = new Luokka ( );, missä ab on muuttujan nimi Muuttuja ab, joka viittaa olioon, kuvataan seuraavasti: 18
Olion luonti jatkuu Todellisuudessa, oliolle on varattu tila tietokoneen keskusmuistista ja muuttujan sisältö on luodun olion keskumuistipaikan osoite eli Viittausmuuttuja alustetaan null arvolla, jollei sille heti luoda oliota. Eli Luokka ab = null; Myöhemmin kun oliota viittaavaa muuttujaa käytetään tulisi tutkia, viittaako muuttuja olioon vai ei. if ( ab!= null ) { ab.metodinkutsu(); 19
Olion tuhoutuminen Olio tuhoutuu automaattisesti, kun mikään muuttuja ei viittaa siihen. Harjoitus: Mitä tapahtuu? Piirrä! Luokka olio1 = new Luokka(); Luokka olio2; olio2 = olio1; 20
Metodin kutsuminen luokan ulkopuolta Olion metodia voidaan kutsua, kun olio on luotu Esim. Aika aika = new Aika(); aika.settunnit(15); aika.setminuutit(45); aika.setsekunnit(30); System.out.println(aika); // tai System.out.println(aika.toString()); Ks. Aika.java ja AikaOhjelma.java 21
Harjoitus Tee kohdeluokka Tuote, jonka attribuutteina ovat: tuotteen numero (>0), nimi (vähintään 2 kirjainta), hinta (desimaaliluku > 0). Toteuta luokkaan set- ja getattribuutti-metodit sekä tostringmetodi. Tee ohjelmaluokka TuoteOhjelma, joka luo yhden Tuote-olion, pyytää sen attribuuteille arvot ja tulostaa tuotteen tiedot. 22 Ismo Harjunmaa, Seija Lahtinen - Ohjelmointi
Taulukon alkiona olio Esim. Ohjelma, joka lukee 5 ajanhetkeä taulukkoon, lajittelee ajat järjestykseen ja tulostaa ne. public class PaivanOhjelma { private Scanner input; public void aja() { input = new Scanner(System.in); Aika [] ajat = new Aika[5]; for ( int i=0; i < ajat.length; i++) ajat[i] = pyydaaika(); lajittele (ajat); tulostaajat(ajat); 23 Ismo Harjunmaa, Seija Lahtinen - Ohjelmointi
Esim. jatkuu private Aika pyydaaika() { int tunnit, minuutit, sekunnit; Aika aika= new Aika(); System.out.println("Anna ajanhetki:"); do{ System.out.println("Anna tunnit (0-23):"); tunnit = input.nextint(); aika.settunnit(tunnit); while (tunnit!= aika.gettunnit()); do{ System.out.println("Anna minuutit (0-59):"); minuutit = input.nextint(); aika.setminuutit(minuutit); while (minuutit!= aika.getminuutit()); do{ System.out.println("Anna sekunnit (0-59):"); sekunnit = input.nextint(); aika.setsekunnit (sekunnit); while (sekunnit!= aika.getsekunnit()); return aika; 24
Esim. jatkuu private void lajittele (Aika [] taulu) { boolean vaihto=true; Aika apu; int i,viimeinenkohta; if (taulu!= null) { viimeinenkohta = taulu.length-1; while (vaihto) { vaihto = false; for (i = 0; i < viimeinenkohta; i++) { if (taulu[i].compareto(taulu[i+1]) > 0) { apu = taulu[i]; taulu[i] = taulu[i+1]; taulu[i+1] =apu; vaihto = true; viimeinenkohta--; Aika-luokkaan lisätty metodi public int compareto (Aika a) 25
Esim. jatkuu private void tulostaajat (Aika [] taulu) { if (taulu!= null) for ( int i=0; i < taulu.length; i++ ) System.out.println(taulu[i].toString()); public static void main(string[] args) { PaivanOhjelma p = new PaivanOhjelma(); p.aja(); // end of class PaivanOhjelma 26 Ismo Harjunmaa, Seija Lahtinen - Ohjelmointi
Esim. jatkuu Aika-luokkaan on lisätty metodi public int compareto(aika aika), joka palauttaa <0 : kun olion ajanhetki on ennen parametrin ajanhetkeä >0 : kun olion ajanhetki on parametrin ajanhetken jälkeen == 0: kun olion ajanhetki on sama kuin parametrin ajanhetki public int compareto (Aika aika ) { int paluu = 0; if (aika!= null) { if (tunnit==aika.tunnit && minuutit == aika.minuutit && sekunnit == aika.sekunnit) paluu = 0; else if (tunnit > aika.tunnit ( tunnit == aika.tunnit && return paluu; ( minuutit > aika.minuutit ( minuutit== aika.minuutit && sekunnit > aika.sekunnit) ) ) ) paluu = 1; else paluu = -1; 27
Harjoitus Aikaisemmin tehtiin Tuote-luokka, jonka attribuutteja olivat tuotteen numero, nimi ja hinta. Tee nyt ohjelma TuoteSovellus, joka pyytää viiden (5) tuotteen tiedot, tallentaa ne taulukkoon, lajittelee tuotteet hinnan perusteella kallein ensin ja tulostaa ne. Ismo Harjunmaa, Seija Lahtinen - Ohjelmointi 28
Luokkakohtaiset ominaisuudet ja metodit Luokka sisältää: ilmentymäattribuutteja = olion omat oliokohtaiset attribuutit, jotka saavat alkuarvonsa, kun olio luodaan (new-operaatio) Esim. public class Aika { private int tunnit; private int minutit; private int sekunnit; 29
Luokkakohtaiset ominaisuudet ja metodit jatkuu Luokka sisältää: ilmentymämetodeja = olion omat metodit, joissa käsitellään viestin saaneen olion ilmentymäattribuutteja Esim. public class Aika { public void settunnit ( int h ){ tunnit = 0; if (h >= 0 && h < 24 ) tunnit = h; 30
Luokkakohtaiset ominaisuudet ja metodit jatkuu Luokka sisältää: luokka-attribuutit = luokan kaikkien olioiden yhteiset attribuutit Esim. public class Asiakas{ // olion attribuutit private int numero; pivate String nimi; // luokka-attribuutit private static int seuraavanumero= 1; 31
Luokka-attribuutit jatkuu Luokka-attribuutti esitellään määreellä static voidaan antaa alkuarvo esittelyn yhteydessä saa alkuarvonsa, kun suorittava ohjelma viittaa luokkaan ensimmäisen kerran ( luokka ladataan muistiin) luokka-attribuuttiin viitataan luokan nimen avulla eli Esim. Asiakas.seuraavaNumero = 2; 32
Luokkakohtaiset ominaisuudet ja metodit jatkuu Luokka sisältää: luokka-metodit = luokkien kaikkien olioiden yhteiset metodit, joissa viitataan luokka-attribuutteihin Esim. public class Asiakas{ // seuraava käytettävä asiakasnumero private static int seuraavanumero = 1; // asetetaan alkuarvo seuraavanumero-attribuutille public static void setseuraavanumero( int nro ){ if (nro > 0) seuraavanumero = nro; 33
Luokka-metodit jatkuu // palautetaan seuraavanumero-attribuutin arvo ja // kasvatetaan attribuutin arvoa yhdellä public static int getseuraavanumero( ) { return seuraavanumero++; //käyttö ensin lisäys sitten /* tai int apu = seuraavanumero; seuraavanumero++; return apu; */ 34
Luokka-metodit jatkuu luokkametodi esitellään määreellä static luokkametodia voidaan kutsua, vaikka luokkaan ei olisi luotu yhtään ilmentymää kutsu on muotoa: Luokka.metodi ( parametrit ); Esim. Asiakas.setSeuraavaNumero (100); int numero = Asiakas.getSeuraavaNumero( ); luokkametodissa ei voi viitata olion attrbuutteihin jos metodissa viitataan olioon, tämä täytyy antaa metodille parametrina tai metodi luo itse olion nyt metodissa voidaan viitata myös olion private attribuutteihin Ks. Asiakas.java, AsiakasTesti.java 35