Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

Samankaltaiset tiedostot
Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Sisällys. 16. Lohkot. Lohkot. Lohkot

Sisällys. 15. Lohkot. Lohkot. Lohkot

12. Javan toistorakenteet 12.1

11. Javan toistorakenteet 11.1

12. Javan toistorakenteet 12.1

5. HelloWorld-ohjelma 5.1

11. Javan valintarakenteet 11.1

1. Omat operaatiot 1.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

5. HelloWorld-ohjelma 5.1

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Sisältö. 22. Taulukot. Yleistä. Yleistä

19. Olio-ohjelmointia Javalla 19.1

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

13. Loogiset operaatiot 13.1

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

16. Ohjelmoinnin tekniikkaa 16.1

13. Loogiset operaatiot 13.1

Sisältö. 2. Taulukot. Yleistä. Yleistä

7. Oliot ja viitteet 7.1

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

16. Ohjelmoinnin tekniikkaa 16.1

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

11. Javan valintarakenteet 11.1

13. Hyvä ohjelmointitapa (osa 1) 13.1

14. Hyvä ohjelmointitapa 14.1

Pakkauksen kokoaminen

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

4. Luokan testaus ja käyttö olion kautta 4.1

Rajapinta (interface)

9. Periytyminen Javassa 9.1

4. Olio-ohjelmoinista lyhyesti 4.1

Oliot viestivät metodeja kutsuen

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Pakkauksen kokoaminen

Olio-ohjelmointi Javalla

9. Periytyminen Javassa 9.1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

7. Näytölle tulostaminen 7.1

2. Olio-ohjelmoinista lyhyesti 2.1

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Metodien tekeminen Javalla

ITKP102 Ohjelmointi 1 (6 op)

58131 Tietorakenteet ja algoritmit (syksy 2015)

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Java-kielen perusteet

Sisällys JAVA-OHJELMOINTI Osa 3: Laskennan ohjaus. Lohkolause (block) Peräkkäinen laskenta. Lohkon käyttö. Esimerkki

Ehto- ja toistolauseet

Ohjelmoinnin perusteet, syksy 2006

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Apuja ohjelmointiin» Yleisiä virheitä

8. Näppäimistöltä lukeminen 8.1

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Ehto- ja toistolauseet

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Mikä yhteyssuhde on?

Tietorakenteet (syksy 2013)

11/20: Konepelti auki

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva

6. Muuttujat ja Java 6.1

12. Näppäimistöltä lukeminen 12.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

Java-kielen perusteita

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

8. Näppäimistöltä lukeminen 8.1

14. Poikkeukset 14.1

ITKP102 Ohjelmointi 1 (6 op)

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Java kahdessa tunnissa. Jyry Suvilehto

16. Javan omat luokat 16.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Ohjausrakenteet:

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Ohjausrakenteet. Valinta:

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen.

Taulukoiden käsittely Javalla

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Ohjelmistojen mallintaminen, sekvenssikaaviot

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

ITKP102 Ohjelmointi 1 (6 op)

Listarakenne (ArrayList-luokka)

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Transkriptio:

16. Lohkot 16.1

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

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-sulkuparien 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.3

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

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

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

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

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. int x = 0; O x = 2; L O int x = 0; L x = 2; // virhe 16.8

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. K int x; K O L O // virhe x++; L 16.9

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

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ä Lohko2.java:8: cannot find symbol symbol : variable x // ohjelma ei käänny. 16.11

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

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

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

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. O int x; int x; K L 16.15

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

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: O Oikein: O int x = 0; int x = 1; int x = 1; int x = 0; L L 16.17

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

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

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