19. Olio-ohjelmointia Javalla

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
6. Metodit.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
Taulukoiden määrittely, käsittely ja kopiointi Vaihtoehdot taulukoille
22. Taulukot.
Ohjelmointitaito (ict1td002, 12 op) Syksy 2008
13. Pakkaukset.
Näytölle tulostaminen. 7.2 Sisällys System.out.println - ja System.out.print -operaatiot. Tulostus erikoismerkeillä. Edistyneempää tulosteiden.
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
16. Lohkot Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat.
Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1.
9. Periytyminen Javassa.
Ohjelmoinnin tekniikkaa Sisällys for -lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely.
13. Hyvä ohjelmointitapa (osa 1)
© Jukka Harju, Jukka Juslin
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
7. Oliot ja viitteet.
Luokan määrittely class-määreellä tMyn1 Luokan määrittely class-määreellä Luokan määrittely tarkoittaa luokan tietojäsenten esittelyä ja jäsenfunktioiden.
Java Java on Sun Microsystems yhtiön kehittämä laaja olio-pohjainen ohjelmointikieli, joka on laitteistoriippumaton. Laitteistoriippumattomuudessa on.
String-vertailusta ja Scannerin käytöstä (1/2)
Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua.
20. Javan omat luokat.
HelloWorld-ohjelma. 5.2 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
10. Abstrakti luokka Johdanto Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Näppäimistöltä lukeminen Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In -luokka.
Hyvä ohjelmointitapa (osa 2) Yleistä Lisää hyviä ohjelmointikäytäntöjä: − Jaa pitkä koodi osiin. − Käytä attribuutteja säästeliäästi.
22. Taulukot.
Poikkeukset Yleistä Virheeseen varautuminen tarkoittaa sitä, että ohjelmoija huomioi koodia kirjoittaessaan ajonaikaisen virheen mahdollisuuden.
17. Kooste Kooste Kooste (aggregation) on luokkien A ja B välinen suhde, joka tarkoittaa “A on B:n osa” tai “A kuuluu B:hen”. − Koostesuhteessa.
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen
2. Lisää Java-ohjelmoinnin alkeita
Oliot ja luokat Oliot ja luokat Oliot (object) ja luokat (class) ovat keskeisiä olio- ohjelmoinnin käsitteitä. Olio-ohjelmointi on ohjelmointiparadigma,
11. Rajapinnat Sisällys Mitä rajapinnat ovat? Kuinka ne määritellään ja otetaan käyttöön? Moniperiytyminen rajapintojen avulla. Varoituksen.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
14. Poikkeukset Sisällys Johdanto poikkeuksiin. Poikkeusten käsittely: − Poikkeusten käsittely paikallisesti. − Poikkeusten heittäminen. Exception.
Ohjausrakenteet Määräävät ohjelmakoodin suoritusjärjestyksen Ehtolause if – else on muotoa if (lauseke) lause1 else lause2 Jos lauseke on tosi, niin suoritetaan.
Olio-ohjelmoinista lyhyesti. 2.2 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen.
String-vertailusta ja Scannerin käytöstä (1/2)
5. Kapselointi.
6. Metodit.
3. Olio-ohjelmoinista lyhyesti
1. Omat operaatiot.
2. Taulukot.
8. Näppäimistöltä lukeminen
4. Komentoriviparametrit
7. Hyvä ohjelmointitapa..
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
15. Lohkot.
7. Näytölle tulostaminen
8. Näppäimistöltä lukeminen
16. Ohjelmoinnin tekniikkaa
14. Hyvä ohjelmointitapa.
2. Taulukot.
15. Lohkot.
6. Metodit.
7. Oliot ja viitteet.
13. Pakkaukset.
4. Attribuutit.
7. Hyvä ohjelmointitapa..
7. Näytölle tulostaminen
5. HelloWorld-ohjelma.
3. Attribuutit.
13. Pakkaukset.
4. Luokan testaus ja käyttö olion kautta
16. Ohjelmoinnin tekniikkaa
Esityksen transkriptio:

19. Olio-ohjelmointia Javalla

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.

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.

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.

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();

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.

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();

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.

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.

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.

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.

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.

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ä.

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

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.)

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ä).

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.

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();

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.

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ä.

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.

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.

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ä.

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!"); }

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(); }

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.

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);

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.

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.

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)); }

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.

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!");

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.

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.

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

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);

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();

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.