LUOKAN MÄÄRITTELY Luokka, mitä se sisältää Luokan määrittely Olion ominaisuudet eli attribuutit Olion metodit Olion muodostimet ja luonti Olion tuhoutuminen Metodin kutsu luokan ulkopuolelta Olion kopioiminen
LUOKKA on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä vrt. tiedonhallinta ja tietokannat opintojakson luokkakaavio, luokkakaavion luokat ovat luokkia/kohdeluokkia Esim. Tuote-luokka, Asiakas-luokka, Oppilas-luokka, Opettaja-luokka, Opintojakso-luokka jne. 2
Mitä luokka sisältää? + Olion ominaisuudet eli attribuutit + Olion metodit eli toimenpidekokonaisuudet + Luokan attribuutit + Luokan metodit 3
Luokan määrittely näkyvyys class LuokanNimi { olion attribuutit olion metodit valinnainen pakollinen 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 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 luokan ominaisuuksia, mitä luokan tietoja halutaan käsitellä 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 Ohjelman 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 Ohjelman ylläpito hankalaa, 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 Tili { private String numero; private double saldo; 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 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 Tili { private String numero; private double saldo; public void setnumero(string numero) { this.numero = numero; public void setsaldo(double saldo) { this.saldo = saldo; 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. attribuutilla metodin nimi alkaa sanalla get ja jatkuu attribuutin nimellä isolla alkukirjaimella metodilla ei ole parametreja 15
getattribuutti-metodit jatkuu Esim. public class Tili { private String numero; private double saldo; public String getnumero() { return numero; public double getsaldo() { return saldo; 16
public String tostring () -metodi jokainen Java-luokka on periytetty Object-luokasta Object 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 Tili { private String numero; private double saldo; Tili numero saldo public String tostring () { return "Numero = " + numero + " saldo = " + saldo ; Metodia käytetään olion tietojen tulostamisessa 17
Muita metodeita public class Tili { private String numero; private double saldo; Luokkaan voidaan koodata muita tarpeellisia metodeita! public void pano (double maara){ saldo = saldo + maara; public boolean otto (double maara){ boolean ok = false; if (saldo >= maara){ saldo = saldo - maara; ok = true; return ok; 18
Ohjelma, jossa käytetään Tili-luokkaa public class TiliKokeilua { public static void main(string[] args) { Tili tili = new Tili(); // luodaan Tili-olio ensin tili.setnumero ("Fi29292"); // anna tilille tilinumero tili.setsaldo (156.23); // anna tilille saldo System.out.println(tili.toString()); // tulosta tilin tiedot // tai System.out.println (tili); tili.pano(200); // lisää saldoa 200:lla System.out.println("Tilin saldo nyt " + tili.getsaldo()); if (tili.otto ( 500 )) { // yritetään ottaa tilitää 500 System.out.println("Tilin saldo oton jälkeen " + tili.getsaldo()); else { System.out.println("Tilillä ei ole katetta"); System.out.println("\nTilinumero: " + tili.getnumero()); System.out.println("Saldo: " + tili.getsaldo()); 19
Muodostimet (Constructor) Muodostin (konstruktori) on luokkaan tehty metodi, jota kutsutaan automaattisesti, kun luokan olio luodaan new operaattorilla Muodostimessa attribuuteille annetaan alkuarvot Kun luokkaan ei ole tehty muodostinta ja olio luodaan, kutsutaan automaattisesti Object-luokan oletusmuodostinta, jolloin attribuutit saavat seuraavat alkuarvot: numeerinen attribuutti (int, double, ) saa tyyppinsä mukaisen nollan char: ns. null-merkki \u0000 boolean: false viittaustyyppinen attribuutti saa arvon null 20
Muodostimet (Constructor) jatkuu Muodostimia on kahdenlaisia eli muodostin on metodi ja se voidaan kuormittaa: oletusmuodostin ( 1 / luokka ) eli parametriton konstruktori parametrillinen muodostin ( useita / luokka) eli parametrillinen konstruktori KÄÄNTÄJÄ KUTSUU AUTOMAATTISESTI MUODOSTINTA MITÄ MUODOSTINTA KUTSUTAAN ON SIDOKSISSA SIIHEN, MITEN OLION LUODAAN (LUONTILAUSE ON KIRJOITETTU). 21
Oletusmuodostin (Default Constructor) Luokassa voi olla vain yksi oletusmuodostin Oletusmuodostimen tehtävänä on asettaa olion attribuuteille sellaiset arvot, jotka ymmärretään oletusarvoiksi Kun ohjelmoija tekee oletusmuodostimen, muodostimen nimi on LUOKAN NIMI, sillä EI ole TYYPPIÄ, EIKÄ PARAMETREJA ja näkyvyys pitää olla public. public class Luokka { public Luokka() { // oletusmuodostin Oletusmuodostimen kutsu tapahtuu automaattisesti, kun olio luodaan seuraavasti: Luokka olio = new Luokka(); 22
Oletusmuodostin esimerkki public class Tili { // piilotetut attribuutit private String numero; private double saldo; // oletusmuodostin, oletusarvot numero= ja saldo = 0.0 public Tili() { numero = ; saldo = 0.0; OLETUSMUODOSTIMEN KUTSU tapahtuu automaattisesti, kun olio luodaan seuraavasti: Tili tili = new Tili(); // tai Tili tili = null; tili = new Tili() ; 23
Parametrillinen muodostin Kun luokassa on parametrillisen muodostimen (ohjelmoija tekee aina itse), olion attribuutit saavat olion luojan antamat alkuarvot. Parametrillisia muodostimia voi olla useita riippuen käyttötarpeesta Jos ohjelmoija tekee parametrillisen muodostimen, Object-luokan oletusmuodostin ei ole enää käytettävissä, joten oletusmuodostin on ohjelmoijan tehtävä itse, mikäli hän haluaa sitä käyttää. Kun ohjelmoija tekee parametrillisen muodostimen, muodostimen nimi on LUOKAN NIMI, sillä EI ole TYYPPIÄ, näkyvyys pitää olla public ja sillä ON PARAMETREJA public class Luokka { public Luokka(int a, double b) { // parametrillinen muodostin 24
public class Tili{ private String numero; private double saldo; Parametrillinen muodostin esimerkki // parametrillinen muodostin public Tili(String numero, double saldo){ this.numero = numero; this.saldo = saldo; Esim. kutsu: Tili tili = new Tili( Fi003, 245,00); Kun parametrin nimi on sama kuin attribuutin nimi, Attribuutti erotaan parametrista this -määreen avulla 25
Olion luonti Luokan ilmentymä (instance of class) eli luokan olio luodaan operaatiolla new () riippuen halutaanko kutsua oletus- vai parametrillista muodostinta Tili tili = new Tili( ); -- tili olion attribuutin numero arvo on ja saldo on 0.0 tai Tili tili = null; tili = new Tili ( Fi0303, 234.23 ); -- tili olion attribuutin numero arvo on Fi0303 ja saldo on 234.23 Muuttuja tili, joka viittaa olioon, kuvataan seuraavasti: tili: 26
Olion luonti jatkuu Todellisuudessa ohjelman suoritusaikana, oliolle varataan tila tietokoneen keskusmuistista ja muuttujan sisältö on luodun olion keskumuistipaikan osoite eli Keskusmuisti: tili: 1000xx01 1000xx01 Viittausmuuttuja alustetaan null arvolla, jollei sille heti luoda oliota. Eli Luokka tili = null; Myöhemmin kun oliota viittaavaa muuttujaa käytetään tulisi tutkia, viittaako muuttuja olioon vai ei. if ( tili!= null ) { tili.metodinkutsu(); 27
Olion tuhoutuminen Olio tuhoutuu automaattisesti, kun mikään muuttuja ei viittaa siihen. Harjoitus: Mitä tapahtuu? Piirrä! Luokka olio1 = new Luokka(); Luokka olio2; olio2 = olio1; 28
Harjoitus ratkaisu Luokka olio1 = new Luokka(); olio1: Luokka olio2; olio2 = olio1; olio2: 29
Olion metodin kutsuminen luokan ulkopuolta Olion metodia voidaan kutsua, kun olio on luotu Esim. Tili tili = new Tili(); tili.setnumero("ab123456"); tili.setsaldo(2345.5); System.out.println(tili); // tai System.out.println(tili.toString()); // tai System.out.println(tili.getNumero() + " " + tili.getsaldo()); 30
Olion kopioiminen tili1: numero: saldo: Fi030303 100.00 tili2: numero: saldo: Fi22222 200.00 tili1 = tili2; tämä aiheuttaa tilanteen jossa tili1 viittaa samaan olioon kuin tili2 numero: Fi030303 tili1: numero: Fi22222 saldo: 100.00 tili2: saldo: 200.00 31
Olion kopioiminen jatkuu.. Jos halutaan että muuttujat tili1 ja tili2 viittaavat omiin olioihinsa: Kun tili1 viittaa olioon, voidaan vaihtaa olion attribuuttien arvot: Tili tili1 = new Tili ( Fi030303, 100.00); Tili tili2 = new Tili (Fi22222, 200.00); tili1.setnumero(tili2.getnumero()); tili1.setsaldo(tili2.getsaldo()); Kun tili1 ei viittaa olioon, luodaan uusi olio: Tili tili1 = null; Tili tili2 = new Tili (Fi22222, 200.00); tili1 = new Tili(tili2.getNumero(),tili2.getSaldo()); 32
public class OpiskelijaSovellus { Harjoitus: Tee Opiskelija-luokka, jotta OpiskelijaSovellus-ohjelma toimii public static void main( String [] args) { Opiskelija op1, op2, op3, op4; op1 = new Opiskelija(); System.out.println(op1.toString()); op2 = new Opiskelija(1001, "Uolevi", "Ulfsson"); System.out.println(op2.toString()); op3 = new Opiskelija(1010); op3.setetunimi("bertil"); op3.setsukunimi("jansson"); System.out.println(op3.toString()); Opiskelija-luokan attribuutit ovat: numero, etunimi, sukunimi op4 = new Opiskelija (op3.getnumero(), op3.getetunimi(), op3.getsukunimi()); System.out.println(op4.getEtunimi()+ " " + op4.getsukunimi() + " : " + op4.getnumero()); 33
ratkaisu public class Opiskelija { private int numero; private String etunimi; private String sukunimi; public Opiskelija(){ // op1 = new Opiskelija(); numero = 0; etunimi = sukunimi = null; // op2 = new Opiskelija(1001, "Uolevi", "Ulfsson"); public Opiskelija (int nro, String etu, String suku){ numero = nro; etunimi = etu; sukunimi = suku; public Opiskelija (int nro){ // numero = nro; etunimi = sukunimi = null; op3 = new Opiskelija(1010); Seija Lahtinen - LUOKKA 34
ratkaisu jatkuu public int getnumero() { return numero; public String getetunimi() { return etunimi; public String getsukunimi() { return sukunimi; public void setnumero(int numero) { this.numero = numero; public void setetunimi(string etunimi) { this.etunimi = etunimi; public void setsukunimi(string sukunimi) { this.sukunimi = sukunimi; public String tostring(){ return numero + " " + etunimi + " " + sukunimi; 35