Talentum Helsinki 2015
9., uudistettu painos Ensimmäinen painos julkaistu nimellä Java-ohjelmointi Pro Training 2015 Talentum Media Oy ja tekijät Kansi: Outi Pallari Taitto: Sirpa Puntti ISBN 978-952-14-2520-2 ISBN 978-952-14-2632-2 (sähkökirja) ISBN 978-952-14-2521-9 (verkkokirja) BALTO print, Liettua 2015 Palaute kirjasta: www.talentumshop.fi
Sisällys Esipuhe 5 1 Johdanto Javaan 19 1.1 Taustaa 19 1.2 JavaScript ja Ajax 20 1.3 Java ja C/C++ 21 1.4 Javan ominaisuuksia pähkinänkuoressa 22 1.5 Javan kehittyminen 23 2 Ohjelmoinnin historiasta 27 2.1 Ohjelmointikielten historiasta 28 2.2 Oliokielten historiasta 31 3 Ensimmäiset ohjelmat 33 3.1 Ohjelman kirjoittaminen ja kääntäminen 33 3.2 Ensimmäinen sovellus 36 3.2.1 Ohjelmakoodin kirjoittaminen 36 3.2.2 Koodin rakenne 37 3.2.3 Välikielelle kääntäminen 39 3.2.4 Sovelluksen ajaminen 39 3.3 Työskentely Eclipsellä 40 3.3.1 Eclipseen tutustuminen 41 3.3.2 Ensimmäinen projekti 42 3.3.3 Sovellus Eclipsellä 45 3.4 Tehtäviä 47 4 Olioperustainen ohjelman kehittäminen 48 4.1 Johdatus olioperustaiseen ohjelman kehittämiseen 49 4.2 Esitutkimus 51 4.3 Vaatimusanalyysi 53 4.3.1 Käyttötapaukset 53 4.3.2 Luokkien ja attribuuttien tunnistaminen 56 4.3.3 Tietohakemisto 57 11
JAVA-OHJELMOINTI 4.3.4 Assosiaatiot 59 4.3.5 Luokkakaavio 60 4.4 Järjestelmäsuunnittelu 65 4.4.1 Arkkitehtuuri 65 4.4.2 Suunnittelumallit 66 4.5 Oliosuunnittelu 70 4.5.1 Luokkien toimintojen määrittäminen 70 4.5.2 Assosiaatioiden tarkastelu ja suunnittelu 72 4.5.3 Luokkakaavion viimeistely 73 4.5.4 Algoritmien suunnittelu 75 4.6 Toteutuksen kautta ylläpitoon 78 4.6.1 Toteutus ja testaus 78 4.6.2 Käyttöönotto ja ylläpito 78 4.7 Tehtäviä 79 5 Luokat ja oliot 80 5.1 Olio-ohjelmoinnin peruskäsitteitä 80 5.2 Luokkien määrittely 82 5.3 Tunnukset ja Javan avainsanat 84 5.4 Muuttujat ja attribuutit 86 5.4.1 Muuttujien määrittely ja tietotyypit 87 5.4.2 Muuttujien arvojen tulostaminen 93 5.4.3 Muotoiltu tulostus 94 5.4.4 Tyyppimuunnokset primitiivityyppien välillä 98 5.4.5 Literaalit ja lukujärjestelmät 99 5.4.6 Muunnokset lukujärjestelmien välillä 101 5.4.7 Attribuuttien määrittely 102 5.4.8 Operaattorit 105 5.4.9 Käyttäjän kanssa keskusteleva ohjelma 112 5.5 Metodit 116 5.5.1 Metodien määrittely 117 5.5.2 Metodien kutsuminen 120 5.5.3 Metodien kuormittaminen 123 5.6 Olioiden elinkaari 126 5.6.1 Olioiden luonti 127 5.6.2 Olion tilan alustaminen 127 5.6.3 Olioihin viittaavat muuttujat 128 5.6.4 Olion metodien kutsuminen 130 5.6.5 Olioiden tuhoaminen 132 5.6.6 Muistinhallinta 134 5.7 JavaBeans 134 5.8 Koodin muotoilusta 135 5.9 Luokkakaavion luokan toteuttaminen 137 5.10 Tehtäviä 143 12
SISÄLLYS 6 Kontrollirakenteet 147 6.1 Logiikkaa ja ehtolausekkeita 147 6.1.1 Yhtäsuuruusoperaattorit 148 6.1.2 Vertailuoperaattorit 149 6.1.3 Loogiset operaattorit 150 6.2 Valintalauseet 152 6.2.1 if-lauseet 152 6.2.2 Ehto-operaattori 161 6.2.3 switch-lause 162 6.3 Toistolauseet 163 6.3.1 while 164 6.3.2 do while 168 6.3.3 for 172 6.3.4 Parannettu for-silmukka 175 6.3.5 Yleisiä virheitä 177 6.4 Hyppylauseet 178 6.4.1 return-lause 179 6.4.2 break-lause 181 6.4.3 continue-lause 181 6.5 Tehtäviä 182 7 Merkit ja merkkijonot 187 7.1 Merkit ja merkistöt 187 7.2 Merkkijonot ja String-luokka 189 7.3 Merkkien ja merkkijonojen käsittely 195 7.3.1 Character-luokka 196 7.3.2 StringBuilder 197 7.3.3 StringTokenizer 202 7.4 Merkkijonojen muuntaminen primitiivityypeiksi 204 7.5 Säännölliset lausekkeet 205 7.5.1 Merkkijoukot ja toisto 207 7.5.2 Javan regexp API 208 7.5.3 Rajahahmot ja tunnistajan ahneus 212 7.6 Tehtäviä 214 8 Taulukot 217 8.1 Taulukkoon viittaavat muuttujat ja taulukon luonti 217 8.2 Taulukon alkioon viittaaminen 219 8.3 Taulukko metodin parametrina 222 8.4 Taulukon sisällön kopiointi toiseen taulukkoon 224 8.5 2-ulotteiset taulukot 225 8.6 Vaihteleva määrä metodin parametreja 227 8.7 Esimerkki: ajat järjestyksessä 230 8.8 Tehtäviä 232 13
JAVA-OHJELMOINTI 9 Javan perusteet 235 9.1 Luokkakohtaiset piirteet 235 9.1.1 Vakioarvot ja vakiomuuttujat 238 9.1.2 Tehdasmetodit ja ainokaiset 241 9.2 Pakkaukset ja luokkien tuonti 242 9.3 Luokkakohtaisten piirteiden tuonti 246 9.4 Kääreluokat ja primitiivityyppien automaattinen käärintä 247 9.5 Liittymät 249 9.6 Periytyminen 254 9.6.1 Abstraktit luokat 260 9.6.2 Dynaaminen sidonta ja monimuotoisuus 267 9.6.3 Rakentajien kutsuminen 269 9.6.4 Luokan muiden rakentajien kutsuminen 270 9.6.5 this ja super 272 9.6.6 Object-luokan metodit 273 9.7 Tyyppimuunnokset ja olion tyypin tutkiminen 274 9.8 Geneeriset tyypit 276 9.8.1 Geneeristen tyyppien määrittely 277 9.8.2 Geneeristen tyyppien alityypitys ja jokerityyppi 279 9.8.3 Uuden ja vanhan koodin yhteiskäyttö 281 9.9 Sisäluokat 282 9.10 Lueteltu tietotyyppi 286 9.11 Rekursio 289 9.12 Metaluokka Class 289 9.13 Sivuhuomautukset 292 9.14 Luokkien paketointi 293 9.15 Tehtäviä 295 10 Kokoelmat olioiden säilyttäjät 298 10.1 Tiedon lajittelu 298 10.1.1 Kuplalajittelu 299 10.1.2 Valintalajittelu 299 10.1.3 Lisäyslajittelu 300 10.1.4 Lomituslajittelu 301 10.1.5 Pikalajittelu 302 10.2 Tiedon haku 303 10.3 Algoritmien vaativuus 304 10.4 Yleisiä tietorakenteita 305 10.5 Kokoelmat ja olioiden vertailu 308 10.5.1 Object.equals 308 10.5.2 Object.hashCode 311 10.5.3 Comparable 313 10.5.4 Comparator 315 10.6 Kokoelmakehys 317 14
SISÄLLYS 10.7 Yleinen kokoelma Collection 319 10.8 Iteraattori Iterator 321 10.9 Joukot HashSet ja TreeSet 324 10.10 Javan listarakenteet ArrayList ja LinkedList 326 10.11 Avainnetut kokoelmat HashMap ja TreeMap 330 10.12 Yhteenveto kokoelmista 333 10.13 Kokoelmakehyksen algoritmit 336 10.14 Luokkakaavion viittausten toteuttaminen 339 10.15 Ohjelman suorituskyvyn parantaminen 343 10.15.1 Pullonkaulojen tunnistaminen 343 10.15.2 Yleisiä ohjeita 344 10.15.3 Turhien olioiden välttäminen 346 10.15.4 Merkkijonojen käsittely 348 10.15.5 Vältä muistin turhaa varaamista 350 10.15.6 Välimuistit ja resurssivarannot 351 10.16 Tehtäviä 352 11 Funktionaalinen ohjelmointi 354 11.1 Lambda-lausekkeet 354 11.2 Metodeihin viittaaminen 357 11.3 Javan funktionaaliset liittymät 359 11.4 Stream API 361 11.4.1 Virran luominen 362 11.4.2 Liukuhihnan määrittely 363 11.4.3 Päättävät operaatiot 366 12 Kun jokin menee kuitenkin pieleen poikkeukset 370 12.1 Erilaisia poikkeuksia 370 12.2 Poikkeuksen aiheuttajan paikallistaminen 372 12.3 Poikkeustilanteen käsittely try, catch ja finally 374 12.4 Resurssit sulkeva try 377 12.5 Käsiteltävät poikkeukset 378 12.6 Omat poikkeukset ja poikkeuksen aiheuttaminen 379 12.7 Ohjeita poikkeusten käyttämiseen 382 12.8 Tehtäviä 384 13 Testaus ja virheiden etsintä 386 13.1 Käännösaikaiset virheet 387 13.2 Ajonaikaiset ja loogiset virheet bugit 388 13.3 Virheiden etsintää yksikkötestein 390 13.4 Testien kattavuus 396 13.5 Assert ja sopimuspohjainen suunnittelu 401 13.6 Tehtäviä 403 15
JAVA-OHJELMOINTI 14 Mistä apua? 404 14.1 JDK:n dokumentaatio 404 14.2 Omien luokkien dokumentointi 406 14.3 Tehtäviä 410 15 Graafiset käyttöliittymät 411 15.1 Tapahtumapohjainen ohjelmointi 412 15.2 Ensimmäinen ohjelma 414 15.3 Tapahtumien käsittely 415 15.4 JavaFX-komponentit 420 15.5 Käyttöliittymän ohjelmointi Eclipsellä 423 15.6 Näytölle piirtäminen 425 15.7 Tehtäviä 428 16 Ohjelman kansainvälistäminen 429 16.1 Kielen ja maan määrittely 429 16.2 Merkkijonojen eristäminen 431 16.3 Tulostuksen muotoilu 435 16.4 Merkkijonojen vertailu 440 16.5 Esimerkki: Lintubongari 440 16.6 Tehtäviä 442 17 Tehtävien samanaikainen suorittaminen säikeet 443 17.1 Johdatus rinnakkaisuuteen 443 17.2 Prosessit ja säikeet 445 17.3 Säikeiden suorituksen hallinta 448 17.4 Kommunikointi 453 17.5 Toiminnan tahdistaminen 460 17.6 Rinnakkaisuuden sudenkuopat 464 17.7 Tehtävien rinnakkaistaminen ja ajastaminen 468 17.8 Tehtäviä 471 18 Tiedostot ja tietovirrat 473 18.1 Tietovirtaan kirjoittaminen 473 18.2 Tiedostosta lukeminen 477 18.3 Muita tietovirtoja 478 18.4 Olioiden tallentaminen ja lukeminen 480 18.5 Tiedostojen käsittelyä 481 18.6 Tehtäviä 485 19 Tietoliikenne verkossa 487 19.1 Johdatus tietoliikenteeseen 487 19.2 Tietoliikenne HTTP-protokollaa käyttäen 490 16
SISÄLLYS 19.3 Asiakas ja palvelin 491 19.4 Rupattelusovellus 494 19.5 Tehtäviä 501 20 Järjestelmäohjelmointi 503 20.1 Sovelluksen parametrit 503 20.2 System ja Runtime 505 20.3 Tehtäviä 509 21 Tietokantojen käyttö 510 21.1 Johdatus tietokantoihin 510 21.2 JDBC yhteys tietokantaan Javalla 513 21.3 Johdatus SQL-kieleen 514 21.4 Apache Derby 518 21.5 Tietokantayhteyden muodostaminen 518 21.6 Tietokannan tietojen muuttaminen 521 21.7 Tietojen hakeminen kannasta 523 21.8 Valmistellut kyselyt 525 21.9 SQL ja sovelluksen tietoturva 526 21.10 Tapahtumat 527 21.11 Taulujen väliset liitokset 530 21.12 Java Persistence API 532 21.12.1 Sovelluksen arkkitehtuuri 535 21.12.2 Entiteettiolioiden suhde tietokantaan 537 21.12.3 Optimistinen lukitus 542 21.12.4 Olioiden etsiminen kyselyin 544 21.12.5 Suhteet 547 21.13 Tehtäviä 551 22 Web-sovellukset 552 22.1 Johdatus HTTP-protokollaan 553 22.2 Web-sovelluksen luominen 554 22.3 Johdatus palvelinsovelmiin 556 22.4 Ensimmäinen palvelinsovelma 557 22.5 Pyynnön otsikon tiedot 560 22.6 POST-viestin käsittely ja parametrit 561 22.7 Evästeet 565 22.8 Istunnot 566 22.9 Pyynnön käsittelyn delegointi 571 22.10 Tiedostojen vastaanottaminen 572 22.11 Tietokannan käyttö palvelinsovelmassa 574 22.12 JavaServer Faces 577 22.13 Expression Language 579 22.14 JSTL-tagikirjasto 580 17
JAVA-OHJELMOINTI 22.15 JSF-esimerkki 582 22.16 Tehtäviä 588 23 Java Enterprise Edition 589 23.1 Enterprise JavaBeans 591 23.1.1 Session Beans 591 23.1.2 Message Driven Beans 593 23.1.3 Ajoympäristön palvelut 595 23.2 Web Services Www-sovelluspalvelut 597 23.2.1 Www-sovelluspalvelujen standardit 598 23.2.2 Www-sovelluspalvelun toteuttaminen 599 23.2.3 Www-sovelluspalvelun käyttäminen 601 24 Työkalupakki 603 24.1 Maven 603 24.2 Versionhallinta 605 24.3 Jenkins 606 24.4 Koodin analysointi 607 24.5 Avoimen lähdekoodin luokkakirjastot 607 24.6 Scala & Groovy 608 25 Viimeinen luku 610 25.1 Javan juuret 610 25.2 Javan tulevaisuus 611 25.3 Loppulause 612 18