Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1
Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus Siihen koodataan jokin rajattu tehtävä Se suoritetaan itsenäisesti omana toimenpidekokonaisuutenaan 2
Metodi on siis koodattu looginen kokonaisuus Esimerkki: metodi piirräkolmio, joka tulostaa kuvaruudulle seuraavan kuvion: x xxx xxxxx xxxxxxx 3
Metodin määrittely: näkyvyys paluutyyppi metodinnimi( parametrilista ) { metodin runko pakollinen valinnainen 4
näkyvyys paluutyyppi metodinnimi( parametrilista ) { metodin runko Näkyvyys määrittää, kuka voi kutsua metodia: private, metodi on piilotettu ja sitä voi kutsua vain sen luokan metodit, jossa se on määritelty tai protected, public, puuttuu, liittyy periytymiseen (ei käsitellä tällä kurssilla) tai metodi on julkinen ja sitä voi kutsua minkä tahansa luokan metodista tai metodia voi kutsua luokat, jotka on määritelty samaan pakettiin (=hakemisto) kuin metodin luokka 5
näkyvyys paluutyyppi metodinnimi( parametrilista ) { metodin runko Metodin paluutyyppi ilmaiseen, minkä tyyppisen arvon metodi palauttaa: perustietotyyppiä, esim. int, double, float, boolean jne. tai viittaus olioon, esim. String tai void, jolloin metodi ei palauta arvoa 6
näkyvyys paluutyyppi metodinnimi( parametrilista ) { metodin runko Metodin nimi kuvaa metodin toimintaa: alkaa aina pienellä kirjaimella yhdistelmänimien jälkiosat isolla alkukirjaimella esim. public int pyydäluku() public void piirräkolmio() 7
näkyvyys paluutyyppi metodinnimi( parametrilista ) { metodin runko Parametrilista kuvaa metodille vietyjä tietoja: voi puuttua, jolloin sulkujen väliin ei kirjoiteta mitään jos ei puutu se määritellään seuraavasti tietotyyppi 1 parametri 1, tietyyppi 2 parametri 2,..., tietotyyppi n parametri n, missä tietotyyppi on ko. parametrin tietotyyppi (perustietotyyppiä esim. int, double, jne. tai viittaus olioon, esim. String) ja parametri on parametrin nimi 8
näkyvyys paluutyyppi metodinnimi( parametrilista ) { metodin runko Metodin runkoon koodataan metodin toiminta: runkoon voidaan määritellä ns. paikallisia muuttujia, joihin voi viitata vain rungon sisällä jos metodille on määritelty paluuarvo, rungon viimeinen lause tulee olla return-lause eli return paluuarvo;, missä muuttujan paluuarvo tietotyyppi on sama kuin metodille määritelty paluutyyppi 9
esimerkki Metodin palauttaman arvon tyyppi Metodille viety tieto, mitä metodi käsittelee private double laskeosamaara(double a, int b) { double osamaara = 0; // paikallinen muuttuja if (b!= 0) osamaara = a / b; return osamaara; // palauta osamaara 10
Metodin suorittaminen eli kutsu metodin suoritus tapahtuu kutsumalla metodia suoritettavaksi tällöin ohjelman kontrolli (ohjelman kulku) siirtyy metodiin suorittamaan kirjoitetut toimenpiteet kun metodi on suoritettu, kontrolli palaa takaisin kutsukohtaan Nyt käsitellään metodin kutsu luokan sisällä, kutsu luokan ulkopuolelta käsitellään myöhemmin. 11
Metodin kutsu, kun metodi ei palauta mitään eikä sille välitetä parametreja: metodinnimi(); Esim. piirräkolmio-metodin kutsu: piirräkolmio(); Kun metodi on määritelty seuraavasti: private void piirräkolmio(){ System.out.println( " X ); System.out.println( " XXX ); System.out.println( " XXXXX ); System.out.println( " XXXXXXX ); Ks. PiirrosOhjelma.java 12
private double laskeympyranala(){ double ala=0, sade; // paikalliset muuttujat // pyydetään kolmion säde, kunnes saadaan positiivinen arvo do { System.out.println("Anna kolmion säde (>0):"); sade = input.nextdouble(); // Scanner input määritelty while (sade <= 0); ala = Math.PI*sade*sade; return ala; // palauta arvo Metodin kutsu: double ala = laskeympyranala(); Metodin kutsu, kun metodi palauttaa arvon, mutta sille ei välitetä parametreja // aikaisemmin luokassa // tai System.out.println( Ympyrän ala on %2.f,laskeYmpyranAla()); Ks. LaskeAlat.java 13
Metodin kutsu, kun sillä on parametreja, eli metodi saa kutsujaltaan tietoa: Metodin nimen perään luetellaan parametrit samassa järjestyksessä, kun ne on määritelty metodiin, joko literaalisina vakioina, nimettyinä vakioina tai muuttujina: Esim. private void tulosta (int a, double b, char c, String d){ System.out.println("int a = " + a); System.out.println("double b = " + b); System.out.println("char c = " + c); System.out.println("String d = " + d); Metodin kutsu: tulosta (23, 56.78, Ö, kissa ); Hypätään metodiin tulosta ja tämän parametrit saavat arvot: int a =23; double b = 56.78; char c = Ö ; String d= Kissa ; tulostuu: int a = 23 double b = 56.78 char c = Ö String d = kissa 14
Metodin kutsu, kun sillä on parametreja, eli metodi saa kutsujaltaan tietoa: jatkuu String mjono = Abc kissa kävelee ; int x = 78; double y = 34.56; char merkki = L ; // metodin kutsu tulosta (x, y, merkki, mjono); Hypätään tulosta-metodiin ja parametrit saavat arvot: int a = 78; double b = 34.56; char c = L ; String d = Abc kissa kävelee ; tulostuu: int a = 78 double b = 34.56 char c = L String d = Abc kissa kävelee Ks. LaskeAlennusB.java 15
Harjoitus: Tee ohjelma, LaskePalkka, joka pyytää käyttäjältä tuntipalkan ja tehdyt tunnit ja tulostaa henkilön palkan. Toteuta ohjelmaan aja()-metodin lisäksi seuraavat metodit: private double annatuntipalkka()-metodi, joka pyytää henkilön tuntipalkan (>0 ja <100 eur) private int annatunnit () -metodi, joka pyytää tehdyt tunnit (>=0) private double laskepalkka(double tuntipalkka, int tehdyttunnit) metodi, joka laskee palkan 16
Muuttujan näkyvyys eli missä ohjelman kohdassa siihen voi viitata Kun muuttuja määritellään luokassa, siihen voidaan viitata kaikissa luokan metodeissa. Kun muuttuja määritellään metodissa, siihen voidaan viitata vain ko. metodin sisällä ei sen ulkopuolella. Kun metodissa määritellään samanniminen muuttuja kuin luokassa on määritelty, ko. metodissa viitataan metodissa määritettyyn muuttujaan. Ks. MuuttujanNakyvyys.java 17
Metodin kuormittaminen Tarkoittaa, että ohjelmassa voi olla useita samannimisiä metodeita. Miten kääntäjä sitten tietää, mitä metodia kutsutaan, kun samannimisiä metodeita on useita? Samannimiset metodit erotetaan toisistaan parametrien avulla, eli eri tyyppiset parametrit ja/tai eri määrä parametreja 18
Esim. public class MetodinKuormittaminen { public int laske (int x, int y) { return x+y; public int laske (int x, int y, int z) { return x+y+z; public int laske (int x, int y, int z, int k) { return x+y+z+k; // jatkuu. 19
Esim. jatkuu public void aja(){ int summa; summa = laske(3,4); // public int laske(int x, int y) System.out.println("3+4="+summa); summa = laske(3,4,5); // public int laske (int x, int y, inx z) System.out.println("3+4+5="+summa); // public int laske(int x,int y,inx z, int k) summa = laske(3,4,5,6); System.out.println("3+4+5+6="+summa); public static void main(string[] args) { MetodinKuormittaminen a = new MetodinKuormittaminen(); a.aja(); ks. KolmioPiirtäminen.java 20
Harjoitus Tee ohjelma, HipHop, joka tulostaa hiphop -sanaa ensin viisi kertaa. Tämän jälkeen se kysyy käyttäjältä, montako kertaa hiphop -sanaa tulostetaan vielä, jonka jälkeen ohjelma tulostaa käyttäjän määräämän määrän sanaa hiphop. Kutsu alla olevia metodeja. Kuormita metodi hiphop seuraavasti: Metodi tulostaa hiphop-tekstin näytölle viisi (5) kertaa. Metodi tulostaa näytölle hiphop-sanan siten, että se saa parametrina kokonaisluvun, joka määrää montako kertaa hiphopsanaa tulostetaan näytölle. 21