16. Lohkot 16.1. 16.2 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat.

Slides:



Advertisements
Samankaltaiset esitykset
15. Loogiset operaatiot.
Advertisements

6. Metodit.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
Nämä kalvot on lisensoitu Creative Commons Attribution-ShareAlike 1
Jukka Juslin Poikkeukset ja niiden paikallistaminen * Jukka Juslin * Liittyy oppikirjan lukuun 11.
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.
Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 4 Toistolauseet
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.
Ehto- ja toistolauseet
© Jukka Harju, Jukka Juslin Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 9 Poikkeuskäsittely.
Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1.
9. Periytyminen Javassa.
Toiston tekeminen Javalla  Mikä toistorakenne on?  while toistorakenne  do-while toistorakenne  for toistorakenne 1.
Ohjelmoinnin tekniikkaa Sisällys for -lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely.
Sami Jantunen LTY/Tietotekniikan osasto
13. Hyvä ohjelmointitapa (osa 1)
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
7. Oliot ja viitteet.
Java Java on Sun Microsystems yhtiön kehittämä laaja olio-pohjainen ohjelmointikieli, joka on laitteistoriippumaton. Laitteistoriippumattomuudessa on.
ict1td002 - Copyright Raine Kauppinen 1 Alkuarvot ja tyyppimuunnokset (1/5)  Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int.
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.
11. Javan toistorakenteet
19. Olio-ohjelmointia Javalla
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.
@ 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.
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen
@ Leena Lahtinen Toistorakenne Ohjelmassa toistetaan tiettyjä toimenpiteitä monta kertaa peräkkäin Toisto noudattaa sille kuuluvia tarkkoja standardoituja.
@ Leena Lahtinen TIETOKONEOHJELMAN RAKENNE OHJELMALLA ON KAKSI OSAA:  MÄÄRITYSOSA TIETOJEN KUVAUKSIA VARTEN  SUORITUSOSA TIETOJEN KÄSITTELYÄ.
Oliot ja luokat Oliot ja luokat Oliot (object) ja luokat (class) ovat keskeisiä olio- ohjelmoinnin käsitteitä. Olio-ohjelmointi on ohjelmointiparadigma,
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
Javan oliovirrat eli oliotiedostojen käsittely. Olio- eli objektitiedostojen käsittely Käsittely täysin samanlaista kuin muiden tiedostojen 1.Otetaan.
14. Poikkeukset Sisällys Johdanto poikkeuksiin. Poikkeusten käsittely: − Poikkeusten käsittely paikallisesti. − Poikkeusten heittäminen. Exception.
String-vertailusta ja Scannerin käytöstä (1/2)
1. Omat operaatiot.
2. Taulukot.
4. Komentoriviparametrit
7. Hyvä ohjelmointitapa..
13. Loogiset operaatiot.
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
15. Lohkot.
5. HelloWorld-ohjelma.
Toisto Toistolausekkeet for, while(ehto){…} ja do {…} while(ehto)
16. Ohjelmoinnin tekniikkaa
14. Hyvä ohjelmointitapa.
11. Javan valintarakenteet
2. Taulukot.
15. Lohkot.
6. Metodit.
7. Oliot ja viitteet.
3. Komentoriviparametrit
13. Pakkaukset.
4. Attribuutit.
7. Näytölle tulostaminen
5. HelloWorld-ohjelma.
13. Loogiset operaatiot.
3. Attribuutit.
13. Pakkaukset.
4. Luokan testaus ja käyttö olion kautta
16. Ohjelmoinnin tekniikkaa
Esityksen transkriptio:

16. Lohkot 16.1

16.2 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin?

16.3 Lohkot Kaarisulut ( { } ) ovat tuttuja ohjausrakenteiden yhteydestä. Kaarisuluilla kootaan yhteen tiettyyn valintaan tai toistoon liittyvät lauseet kootuksi lauseeksi. Koottuja lauseita kutsutaan usein lohkoiksi (block), kun kaari-sulku- parien ajatellaan kokoamisen asemasta jakavan ohjelmaa osiin. Lohkot voivat olla sisäkkäin ja peräkkäin. if (ehto1) { if (ehto2) { lause 1;... lause n ; } else { lause 1;... lause m ; }

16.4 Lohkot Kaarisulkuja käytetään myös ohjelman (luokan) ja operaation (metodin) sisällön merkitsemiseen. public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } Ulompi lohko sisältää HelloWorld -ohjelman ja sisempi lohko main -operaation.

16.5 Lohkot Lohkon voi esitellä ilman avainsanaa tai otsikkoa pelkästään aaltosulkuja käyttämällä. Esim. { int i = 1; } Joskus kätevää, mutta yleisesti ottaen tällaiseen ei ole tarvetta.

16.6 Näkyvyys Lohkot säätelevät muuttujien (ja vakioiden) elinikää, joka puolestaan ilmenee näkyvyytenä (visibility). Seuraavassa tarkastellaan näkyvyyttä vain operaatioiden sisällä, koska ohjelman (luokan) mittakaavassa näkyvyyssäännöt ovat monimutkaisemmat. Koska vakiot pyritään esittelemään aina operaation alussa, keskitytään seuraavassa lähinnä muuttujiin.

16.7 Näkyvyys operaation sisällä Ulomman lohkon muuttuja näkyy sisempään lohkoon, mutta sisemmän lohkon muuttuja ei näy ulompaan lohkoon. Huomaa, että ulomman lohkon muuttuja näkyy sisempään lohkoon vain, mikäli se on esitelty ennen sisempää lohkoa. // Kääntyy.// Ei käänny.// Ei käänny. int i = 0; do { do { do { int i = 0;... i++;... i++; … i++; …} }} while (i < 10); while (i < 10); while (i < 10); int i = 0;

16.8 Näkyvyys operaation sisällä Yleisesti: Muuttuja (tai vakio) x, joka on esitelty ulommassa lohkossa O, on käytettävissä (näkyy) sisemmässä lohkossa L, jos se on esitelty ennen lohkoa L. Yleisesti: Muuttuja (tai vakio) x, joka on esitelty lohkossa L, ei ole käytettävissä (ei näy) lohkon L ulkopuolella. x = 2; // virhe int x = 0; O L x = 2; O L

16.9 Näkyvyys operaation sisällä Oletetaan, että lohkot K ja L ovat peräkkäin lohkon O sisässä. Yleisesti: Lohkossa K esitelty muuttuja (tai vakio) x ei ole käytettävissä (ei näy) lohkossa L. L K O // virhe x++; L int x; K O

16.10 Näkyvyys operaation sisällä public class Lohko1 { public static void main(String[] args) { int y = 1; int x = 0;// Kun muuttuja x esitellään if (y > 0) {// ulommassa eli operaation x = 2;// lohkossa, x näkyy myös y++; // sisemmässä eli if-lauseen }// lohkossa. }

16.11 Näkyvyys operaation sisällä public class Lohko2 { public static void main(String[] args) { int y = 1; if (y > 0) { int x = 0; // Kun muuttuja x esitellään y++; // sisemmässä eli if-lauseen } // lohkossa, x ei näy ulommassa x = 2; // eli operaation lohkossa } // Tästä syystä tämä } // ohjelma ei käänny. Lohko2.java:8: cannot find symbol symbol : variable x

16.12 Näkyvyys operaation sisällä public class Lohko3 { public static void main(String[] args) { int y = 1; if (y > 0) { int x = 0; // Muuttujan x esittely y++; // ensimmäisessä lohkossa. } while (y < 10) { y++; // Virhe! Muuttuja x ei näy x++; // toisessa lohkossa. }

16.13 Elinikä Muuttujien (ja vakioiden) näkyvyys liittyy kiinteästi eliniän (lifetime) käsitteeseen. Muuttujan voidaan ajatella “syntyvän”, kun se esitellään. Tällöin muuttujalle varataan muistialue keskusmuistista. (Alkeis- ja viitetyyppisten muuttujien syntymä on kuitenkin hieman erilainen.) Muuttujan elinikä vaihtelee ohjelman eri tasoilla, mutta operaation sisällä esittelylohko ja elinikä ovat erottamattomat.

16.14 Elinikä operaation sisällä Operaation mittakaavassa alkeistyyppinen muuttuja “elää” (on käytettävissä) niin kauan kuin ohjelman suoritus viipyy sen esittelylohkossa. Muuttuja “kuolee” (hävitetään), kun lohkon suoritus loppuu. Tällöin muuttujalle varattu muisti vapautuu eikä sen tunnus ole enää käytettävissä. Tästä syystä sisemmässä lohkossa esitelty muuttuja ei ole käytettävissä ulommassa lohkossa eikä edellisen lohkon muuttuja ole käytettävissä seuraavassa lohkossa.

16.15 Elinikä operaation sisällä Näkyvyyssääntöjä noudattamalla operaation sisällä voidaan esitellä samannimisiä muuttujia, koska edellinen muuttuja ehtii hävitä ennen seuraavan muuttujan esittelyä. Esimerkiksi peräkkäisissä lohkoissa voidaan käyttää samannimistä muuttujaa. Lohkossa K esitelty muuttuja (tai vakio) x häviää, ennen lohkon L suoritusta. Molemmat lohkot sijaitsevat ulommassa lohkossa O. int x; L K O

16.16 Nimikonflikti operaation sisällä Jos sisäkkäisissä lohkoissa “elää” yhtä aikaa samannimisiä muuttujia (tai vakioita), tapahtuu niin sanottu nimikonflikti (name conflict), joka estää ohjelman kääntämisen. Tässä on huomioitava vielä esittelykohta: − Nimikonflikti vältetään, jos ulomman lohkon muuttuja (tai vakio) esitellään vasta sisemmän lohkon jälkeen, koska sisempi muuttuja ehtii hävitä ennen ulompaa esittelyä. Huom! Käytännössä samannimiset muuttujat ovat täysin turhia - eikä niitä ole siten syytä käyttää!

16.17 Nimikonflikti operaation sisällä Olkoon O ulompi lohko ja lohko L lohkon O sisäinen lohko. Mikäli lohkossa L esitellään samanniminen muuttuja kuin ulommassa lohkossa O, sisempi esittely onnistuu vain, mikäli se tehdään ennen ulompaa esittelyä. Väärin: Oikein: int x = 0; int x = 1; O L int x = 0; int x = 1; O L

16.18 Nimikonflikti operaation sisällä public class Lohko4 { public static void main(String[] args) { // Esittely pääohjelman lohkossa. int x = 0; if (x == 0) { // Esittely if-lauseen lohkossa ei onnistu, // koska operaation lohkossa on esitelty // samanniminen muuttuja ennen if-lohkoa! int x = 1; System.out.println(x); } Lohko4.java:9: x is already defined in main(java.lang.String[]) int x = 1; ^

16.19 Nimikonflikti operaation sisällä public class Lohko5 { public static void main(String[] args) { int y = 0; if (y == 0) { // Esittely if-lauseen lohkossa onnistuu, // koska operaation lohkossa on esitelty // samanniminen muuttuja if-lohkon jälkeen. int x = 1; // Tulostaa if-lauseen muuttujan arvon (1). System.out.println(x); } // Esittely pääohjelman lohkossa. int x = 0; // Tulostaa operaation muuttujan arvon (0). System.out.println(x); }

Muuttujien paikka operaatiossa? Esittely operaation alussa. − Perinteinen tapa, jota on käytetty toistaiseksi näkyvyysongelmien välttämiseksi. − Näkyvyys taattu; muuttuja saatavilla kaikkialla operaation lohkossa. − Muuttujat löytyvät helposti yhteen paikkaan koottuina. − Muuttujan esittely ja käyttöpaikka saattavat olla kaukana toisistaan. − Koodia vaikeampi seurata. − Ohjelmasta hieman pitempi kuin tarpeen, koska alustaminen ei ole aina mahdollista esittelyn yhteydessä. Esittely käyttöpaikan lähellä. − Modernimpi tapa. − Koodi selkeämpää. − Esittely ja alustus voidaan tehdä yhdellä lauseella. − Näkyvyyden kanssa pitää olla tarkkana. − Muuttujat hajallaan koodin seassa. − Joissakin kielissä vaarana tehottomuus silmukan lohkon sisäisissä esittelyissä. − Java-kääntäjä osaa optimoida jonkin verran