Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

19. Olio-ohjelmointia Javalla

Samankaltaiset esitykset


Esitys aiheesta: "19. Olio-ohjelmointia Javalla"— Esityksen transkriptio:

1 19. Olio-ohjelmointia Javalla

2 Sisällys Olioiden esittely ja alustus. Metodit Attribuutit.
Yleistä metodeista. Mihin metodeja tarvitaan? Metodien määrittely. Omat metodit: nimeäminen, paikka, kutsuminen, parametrit ja paluuarvo. Metodin kutsuminen yleisesti. Attribuutit. Rakentajat.

3 Yleistä Olio-ohjelmointia käsitellään hyvin yleisellä tasolla:
Tarkastellaan vain yhtä luokkaa. Attribuutit sivuutetaan maininnalla. Keskitytään metodeihin. Aihepiiriin palataan tarkemmin kolmannessa periodissa järjestettävällä Olio-ohjelmoinnin perusteet (Oope, 5 op) -kurssilla.

4 Olioiden esittely ja alustus
Javan oliot eivät ole oliotyyppiä vaan viitetyyppisiä (tarkemmin luokkatyyppisiä) muuttujia. Luokkatyyppisiä muuttujia ei voi yleensä ottaen käsitellä kuten alkeistietotyyppisiä muuttujia. Viite “osoittaa” jonkin muistipaikan kautta varsinaiseen dataan keskusmuistissa. Tästä syystä luokkatyyppisen muuttujan esittely varaa muistia vain viitteen tallentamiseen, ei olion tietojen tallentamiseen.

5 Olioiden esittely ja alustus
Olion tarvitsema muistitilavaraus tehdään alustuksen yhteydessä new-operaatiolla, joka palauttaa viitteen ja varaa keskusmuistista yhtenäisen muistialueen olion datalle. Yleisesti: LuokanNimi olionNimi; olionNimi = new LuokanNimi(); tai LuokanNimi olionNimi = new LuokanNimi();

6 Olion luominen Koira teukka = null; teukka = new Koira(); teukka null
Olion viitteen esittely ja alustaminen tyhjäksi. olio Lauseke new Koira(); luo olion ja palauttaa paluu-arvona olioon liittyvän tunnuksettoman viitteen. teukka olio Sijoituksen seurauksena teukka-viite viittaa samaan olioon kuin paluuarvona saatu viite.

7 Yleistä metodeista Metodi (method) on luokkaan ohjelmoitu operaatio.
Metodi eristää jonkin luokan osan nimettyyn lohkoon. Metodia kutsutaan luokan ulkopuolelta metodin nimellä, pistenotaatiota käyttäen. Metodin tunnistaa suluista. Metodille voidaan tarjota tietoja eli parametreja. Esim. System.out.println("Moikka!"); int luku = In.readInt();

8 Yleistä metodeista Metodikutsun kohdalla ohjelman suoritus siirtyy metodiin, josta palataan kutsukohtaa seuraavaan ohjelman vaiheeseen. Metodi voi muiden tekemiensä asioiden lisäksi palauttaa arvon. Metodin lohkossa esitellyt tunnukset eivät näy metodin ulkopuolelle. Metoditkaan eivät välttämättä näy luokan ulkopuolelle.

9 Mihin metodeja tarvitaan?
Ohjelmassa toistuva toiminnallisuus voidaan sijoittaa metodiin, jolloin koodia ei tarvitse “monistaa” eri paikkoihin ja samalla koodin ylläpito helpottuu. Metodeilla pitkä ohjelma voidaan jakaa “palasiin”, jolloin koodia voi helpommin hallita, ymmärtää ja ylläpitää. (Modulaarinen ohjelmointi.) Mahdollistavat tiedonkätkennän.

10 Metodien määrittely Koostuu otsikkosta (signature) ja rungosta (body):
// Otsikossa määreitä, metodin nimi ja parametrilista. määreet nimi(parametrilista) { // Runko on koottu lause (lohko), joka kirjoitetaan // luokkamäärittelyn sisään aina sulkeita käyttäen. } Määreillä otetaan kantaa metodin näkyvyyteen ja sen mahdollisesti palauttamiin tietoihin. Parametrilista määrittelee metodille välitettävät tiedot. Lista pilkuin erotettuja parametrimäärittelyjä. Pelkillä suluilla ilmaistaan ettei metodille välitetä tietoja.

11 Metodien määrittely /* Tervehditään ohjelman käyttäjää. */
public static void tulostaTervehdys() { … /* Korottaa kantaluvun a potenssiin b. public static int laskePotenssi(int a, int b) { … Parametrit ovat metodin lohkon tunnuksia: Nimetään ja esitellään kuten muuttujat. Toisinaan käytetään lyhyitä tunnuksia, koska parametreista kerrotaan otsikkoon liittyvässä kommentissa. Mikäli parametrilla ja metodin muuttujalla on sama nimi, tapahtuu nimikonflikti, eikä ohjelma käänny.

12 Metodien määrittely Metodin tyyppi voi olla mikä tahansa Javan tietotyyppi, jolloin metodi palauttaa arvon. void-määre tarkoittaa ettei paluuarvoa ole. Yleisimmät näkyvyysmääreet private ja public sopivat attribuuttien, metodien ja luokkien näkyvyyden asettamiseen. private-määritelty metodi (tai attribuutti) on yksityinen eli sitä voi käyttää vain luokan omissa metodeissa. public-määritelty metodi (tai attribuutti) ovat julkisia. Sitä voidaan käyttää pistenotaatiolla myös luokan ulkopuolelta. Yleensä metodit ovat julkisia ja attribuutit yksityisiä, jotta tiedonkätkennän periaate toteutuisi.

13 HelloWorld-ohjelma Jatketaan HelloWorld-ohjelman analyysiä.
Aikaisemmilta luennoilta muistetaan, että ajokelpoisessa Java-ohjelmassa on oltava main-operaatio eli niin sanottu pääohjelmametodi, main-metodin otsikon on oltava aina tietyn muotoinen, jotta ohjelman suoritus onnistuisi, main-metodi sijaitsee luokkamäärittelyn sisässä, main-metodin lohko sijaitsee luokan lohkon sisässä.

14 HelloWorld-ohjelma public class HelloWorld {
public static void main (String[ ] args) { System.out.println("Hello World!"); } main-metodi on julkinen (public) eikä sillä ole paluuarvoa (void). main-metodia kutsutaan automaattisesti. Tästä nimitys pääohjelmametodi. Nimi Parametri(t) Määreet

15 Omat metodit: nimeäminen
Metodit kuvaavat toimintoja – tunnukset usein käskymuotoisia verbejä. Esim. public void hauku(String s) { … } public static void sayHello() { … } Tunnukset yleensä muuttujien tunnuksia pitempiä. Tunnus aloitetaan pienellä alkukirjaimella. Useasta sanasta koostuvassa tunnuksessa ensimmäinen sana pienellä ja muut isolla alkukirjaimella. (Yhdyssanat ovat poikkeus.)

16 Omat metodit: sayHello-metodi
/* Tervehditään maailmaa * englanniksi. Huomaa static- * määre metodin otsikossa. */ public static void sayHello() { // Tekstiä näytölle. System.out.println("Hello World!"); } Ennen oman metodin otsikkoa kirjoitetaan aina yleisluonteinen kommentti metodin tarkoituksesta sekä mahdollisista parametreista ja paluuarvoista. Oheinen metodi ei palauta arvoa (void-tyyppi). Metodille ei myöskään voi antaa parametreja (parametrilista on tyhjä).

17 Omat metodit: paikka luokassa
public class HelloWorld { /* Tervehditään maailmaa englanniksi. */ public static void sayHello() { System.out.println("Hello World!"); } public static void main(String[] args) { // Kuinka sayHello voidaan suorittaa? Omat metodit kirjoitetaan Laki-kurssilla samaan luokkaan kuin main-metodi. Otsikoihin on siksi muistettava liittää static-määre. Koodi ei käänny, jos static-määre puuttuu.

18 Omat metodit: kutsuminen
public class HelloWorld { /* Tervehditään maailmaa englanniksi. */ public static void sayHello() { System.out.println("Hello World!"); } public static void main(String[] args) { // Metodi suoritetaan metodikutsulla. sayHello();

19 Omat metodit: kutsuminen
Metodia kutsuttiin luokan sisällä toisesta metodista nimellä ilman pistenotaatiota. Metodille ei välitetty parametreja: Kutsulause koostuu metodin nimestä ja “tyhjistä” suluista. Suoritus palasi main-metodiin automaattisesti. Metodi ei palauttanut arvoa (void-tyyppi). Metodi olisi voitu sijoittaa myös main-metodin jälkeen. Metodeja ei siis ole pakko määritellä ennen kuin niitä kutsutaan.

20 Omat metodit: parametrit
Metodeille välitettävät tiedot määritellään parametrilistan avulla. Esimerkiksi potenssin ab laskevan operaation otsikossa: public static int laskePotenssi(int a, int b) määritellään int-tyyppiset parametrit a ja b. Parametri saa arvonsa metodin kutsun yhteydessä. Oikea määrä oikean tyyppisiä arvoja oikeassa järjestyksessä. Edellä määriteltyä metodia kutsuttaessa on annettava kaksi int-tyyppistä arvoa (myös byte- ja short-arvot käyvät) siten, että kantaluku on ensimmäinen arvo ja eksponentti toinen arvo. laskePotenssi(2, 3); // Kaksi potenssiin kolme. laskePotenssi(3, 2); // Kolme potenssiin kaksi. laskePotenssi(2.5, 2); // Virhe, 1. parametriarvo väärää tyyppiä.

21 Omat metodit: parametrit
Parametriksi voidaan antaa arvo sellaisenaan (literaali), muuttuja, vakio tai lauseke. int kantaluku = 2, eksponentti = 3; laskePotenssi(kantaluku, eksponetti); short i = 10; laskePotenssi(i - 1, i + 1); Java luo parametrille annetusta arvosta kopion ja sijoittaa sen automaattisesti parametrin tunnukseen liittyväksi arvoksi (pass-by-value, call-by-value). Koska metodi käsittelee kopiota, eivät metodin saamaansa arvoon tekemät muutokset välity alkuperäiseen arvoon.

22 Omat metodit: parametrit
public class HelloWorld { /* Tervehditään maailmaa metodin * kutsujan antamalla viestillä . */ public static void say(String message) { System.out.println(message); } public static void main(String[] args) { // Parametrille arvo metodikutsussa. String viesti = "Hello World!"; say(viesti); Otsikossa määritellään, että metodilla on String-tyyppinen parametri. Metodille annetaan kutsuttaessa String-tyyppinen muuttuja, jonka arvo "Hello World!" kopioidaan ja sijoitetaan parametrin arvoksi automaattisesti.

23 Omat metodit: parametrit
Parametrien arvot on syytä tarkistaa metodin aluksi, jos tiedetään arvojen voivan olla virheellisiä, koska näin saadaan aikaiseksi vakaampia ohjelmia. Loogiset operaatiot ovat tarkistuksissa hyvin hyödyllisiä.

24 Omat metodit: parametrit
/* Tervehditään n (> 0) kertaa. */ public static void sayHello(int n) { // Tarkistuksella vältetään ikuinen silmukka. if (n > 0) // Tulostetaan tervehdyksiä silmukan avulla. for (int i = n; i > 0; i--) System.out.println("Hello World!"); }

25 Omat metodit: parametrit
/* Tulostaa näytölle annetulla merkillä n riviä korkean * ja m saraketta leveän suorakaiteen. */ public static void piirraSuorakaide(int n, int m, char merkki) { int i, j; // Parametrien oltava järkevät, jotta edes yritetään piirtämistä. if (n > 0 && m > 0) for (i = 0; i < n; i++) { // Tulostetaan n riviä. for (j = 0; j < m; j++) // Tulostetaan yksittäinen rivi System.out.print(merkki); // eli m merkkiä. System.out.println(); }

26 Omat metodit: arvon palauttaminen
Metodin tyyppi määrää palauttaako metodi arvon vai ei. void-tyyppinen metodi ei palauta arvoa. Ohjelman suoritus palaa automaattisesti kutsupaikkaan, kun metodin viimeinen lause on suoritettu. Muun tyyppiset metodit palauttavat arvon return-lauseella. return-lause palauttaa ohjelman suorituksen kutsupaikkaan. Yleisesti: return arvo; Paluuarvo voidaan tallentaa normaaliin tapaan muuttujaan. Paluuarvon ja muuttujan tyyppien tulee olla yhteensopivat.

27 Omat metodit: arvon palauttaminen
Esimerkiksi potenssin ab laskevan operaation otsikossa: public static int laskePotenssi(int a, int b) määritellään metodin tyypiksi int, jolloin metodin on aina palautettava return-lauseella int-tyyppinen arvo. Sijoitetaan eri tavoin kutsutun metodin paluuarvo muuttujaan: int kantaluku = 2, eksponentti = 3; short i = 10; int potenssi = laskePotenssi(2, 3); potenssi = laskePotenssi(kantaluku, eksponetti); potenssi = laskePotenssi(i - 1, i + 1);

28 max-metodi /* Palauttaa suurimman luvuista a, b ja c. */
public static int max(int a, int b, int c) { int m; if ((a > b) && (a > c)) m = a; else if (b > c) m = b; else m = c; return m; } Parametrilistassa määritellään, että metodille on annettava kolme int-tyyppistä arvoa. Arvojen järjestyksellä ei ole väliä. Metodi on int-tyyppinen. Metodissa on oltava arvon palauttava return-lause.

29 max-metodi /* Palauttaa suurimman luvuista a, b ja c. */
public static int max(int a, int b, int c) { if ((a > b) && (a > c)) return a; else if (b > c) return b; else return c; } Tässä max-metodin versiossa arvo palautetaan jokaisessa päätös-haarassa saman tien.

30 max-metodin kutsuja main-metodista
public static void main(String[] args) { int k = 1, l = 3, m = 2; // Parametriarvoiksi muuttujien arvot, paluuarvo muuttujaan. int n = max(k, l, m); System.out.println(n); // Parametriarvoina literaaleja ja muuttujan arvo. // Paluuarvo katoaa, koska sitä ei sijoiteta muuttujaan. max(111, 222, l); // Metodin paluuarvo annetaan toisen metodin parametriarvoksi. System.out.println(max(111, 222, 333)); }

31 Metodin kutsuminen yleisesti
Luokan A metodeja voi kutsua kolmella tavalla: 1) Toisesta luokasta A-tyyppisen olion kautta. 2) Toisesta luokasta luokan A nimen avulla. 3) Luokan A toisista metodeista. Kohdissa 1 ja 2 voidaan ajatella abstraktisti, että ympäristöstä lähetetty viesti käynnistää metodin. Käytännössä metodin kutsuminen tapahtuu tutulla pistenotaatiolla. Omia metodeja kutsutaan Laki-kurssilla vain kohdan 3 tavalla, koska kutsuminen luokan ulkopuolelta ei onnistu, kun käytettävissä on vain yksi itse kirjoitettu luokka.

32 Metodin kutsuminen olion kautta
Yleisesti: olio.metodi(parametrit); missä parametrit ovat metodin parametrilistassa annettua tyyppiä olevia arvoja (literaaleja, vakioita, muuttujia jne.). Parametreja ei luonnollisesti anneta, jos metodin parametrilista on tyhjä. Esim. Koira hiski = new Koira(); hiski.hauku("RÄYH!");

33 Metodin kutsuminen luokan kautta
Yleisesti: Luokka.metodi(parametrit); missä parametrit ovat kuten edellä. Metodi on esiteltävä static-määreellä, jotta luokan nimellä kutsuminen onnistuisi. Tällaiset luokkametodit ovat hyödyllisiä, kun kootaan yhteen toimintoja, joiden käyttö sujuvampaa suoraan ilman olion esittelyä ja on tarpeen määritellä koko luokalle yhteisiä vakioita.

34 Metodin kutsuminen luokan kautta
Luokkametodit ovat tuttuja jo System- ja In-luokkien yhteydestä. Esim. double d = In.readDouble(); System.out.println(″Testi″); Luokkametodeista voidaan kutsua vain toisia luokkametodeja. Tästä syystä main-metodin sisältävässä luokassa metodien (ja attribuuttien) esittelyihin on lisättävä static-määre.

35 Metodin kutsu lauseena ja lausekkeena
Metodikutsu voi esiintyä joko yksittäisenä lauseena tai lausekkeen osana. Esim. System.out.println("Oikein!"); if (In.readInt() < 0) { … } Paluuarvollisten metodien kutsut ovat lauseke-lauseita. Esim. int n = max(1, 2, 3); // Lause max(1, 2, 3) + 4; // Lauseke

36 Attribuutit Luokan lohkossa esiteltyjä muuttujia tai vakioita.
Esitellään lähes samalla tavoin kuin "tavalliset" muuttujat tai vakiot. Lisänä määreet: Yleensä pyritään kätkemään luokan ympäristöltä private-määreellä. Luetaan ja muutetaan aksessorimetodeilla. Käytettävä varoen: näkyvät kaikkiin metodeihin ja rikkovat siten modulaarisuusperiaatetta. (Vakioituja attribuutteja voi käyttää vapaammin.) public class Koira { // Attribuutit. private int luonne; private String rotu; // Aksessorit. public int luonne() { return luonne; } // Metodit. public void hauku(String s) { System.out.println(s);

37 Rakentajat Attribuuttien arvot alustetaan luokan rakentajassa (constructor), jonka nimi on aina sama kuin luokan nimi. Rakentajalla ei ole tyyppiä. Kutsu yleisesti: - Oletusrakentaja LuokanNimi(); tai - Parametrillinen rakentaja LuokanNimi(parametrit); Rakentajaa kutsutaan aina, kun luodaan olio. Esim. Koira hiski = new Koira();

38 Rakentajat Java luo automaattisesti tyhjän oletusrakentajan.
Itse kirjoitetulle luokalle voidaan luonnollisesti kirjoittaa myös rakentaja. Entä jos olisi tarvetta sekä parametrittomalle oletusrakentajalle että parametriselle rakentajalle? Javassa on kuormittamisena (overloading) tunnettu mekanismi, joka sallii samannimisten metodien esittelyn ja siten myös samannimisen rakentajien esittelyn.


Lataa ppt "19. Olio-ohjelmointia Javalla"

Samankaltaiset esitykset


Iklan oleh Google