812341A Olio-ohjelmointi, 2016 Olio-ohjelmoinnin peruskäsitteet ja Java-kieli
Sisältö 1. Java-kieli 2. Luokka 3. Luokkakaaviot 4. Lisää Javaa Javalla 2
Java-kieli n Sun Microsystems tutkimusprojekti 1991 koodinimeltään Green n Kieli kehitetty C/C++ -kielestä James Goslingin johdolla n Alunperin nimi oli Oak, mutta tämänniminen ohjelmointikieli oli jo olemassa -> uudeksi nimeksi 1995 Java n Kieli julkaistiin virallisesti toukokuussa 1995 Javalla 3
Java-kieli Java-kieli on yksinkertainen (verrattuna C++ kieleen) ei osoittimia ei moniperintää automaattinen muistinvaraus ja roskien keruu Java on olio-orientoitunut kieli Java on hajautettu kieli Java on tulkattava kieli Java-ohjelmat käännetään ns. tavukoodiksi, jota Java Virtuaalikone (JVM, Java Virtual Machine) suorittaa tavukoodi on laiteriippumatonta Javalla 4
1. Java-kieli Javassa on pyritty luotettavuuteen mahdolliset virheet pyritään löytämään mahdollisimman aikaisessa vaiheessa korjattu muutamia muissa kielissä ilmenneitä heikkouksia ei osoittimia, joten ohjelma ei pääse tuhoamaan muistissa olevaa dataa poikkeusten käsittely "älä luota mihinkään" -periaate Javalla 5
1. Java-kieli Java on siirrettävä ohjelma voidaan suorittaa toisella laitealustalla kääntämättä ohjelmaa uudelleen ei alustariippuvaisia ominaisuuksia Javalla 6
1. Java-kieli n Java-ohjelman kirjoittaminen, kääntäminen ja suorittaminen Ohjelma kirjoitetaan tiedostoon tekstieditorilla (esim. notepad- eli muistio-ohjelmalla). Tuloksena saadaan tekstitiedosto, joka sisältää ohjelman lähdekoodin esimerkiksi Ohjelma.java Javalla 7
1. Java-kieli n Tekstitiedosto muutetaan tietokoneen ymmärtämään muotoon java-kääntäjällä: javac Ohjelma.java n Saadaan uusi tiedosto: Ohjelma.class, jossa on suoritettava ohjelmakoodi ns. tavukoodina (byte code) n Ohjelma käynnistetään kutsumalla java-tulkkia, joka suorittaa annetun ohjelman. Tulkkia kutsuttaessa ei käytetä.class -laajennusta: java Ohjelma Javalla 8
1. Java-kieli luo/muokkaa ohjeman lähdekoodia public class Ohjelma {! public static void main( String [ ] args ) {! System.out.println("Tervehdys!");! }! } lähdekoodi KÄÄNNÖSAIKAISET VIRHEET... Max stack 00 02 Max locals 00 01 00 00 getstatic FIELD java/lang/system out Ljava/io/PrintStream; B2 00 02 00 03 ldc STRING Tervehdys! 12 03 00 05 invokevirtual METHOD java/io/printstream println (Ljava/lang/String;) V B6 00 04 00 08 return B1 Exceptions Table 00 00 Additional info 00 01 LineNumberTable 00 0A 00 00 00 0A 00 02 00 00 00 06 00 08 00 07... javac Ohjelma.java Tavukoodi java Ohjelma tulos AJONAIKAISET VIRHEET Javalla 9
2.Luokka n Luokka kuvaa olion ominaisuudet n Jäsenet Attribuutit (olion rakenne) Metodit (olion toiminta, c-kielen funktiot) n Kapselointi n Tiedon kätkentä (onion model) Piilottaa kaiken, johon ei ulkopuolelta saa päästä käsiksi (tiedon suojaus) Kätkettyihin tietoihin pääsee käsiksi vain julkisten metodien avulla n Tiedon abstrahointi Javalla 10
Luokka n Luokka toimii mallina, jonka perusteella tehdään olioita n Olio on luokan ilmentymä n Kaikilla saman luokan ilmentymillä eli olioilla on samanlaiset attribuuti ja metodit n Attribuuttien arvot ovat kuitenkin jokaisen olion omia Javalla 11
Luokka n Attribbuuttien arvot kuvaavat olion tilan Henkilö-luokan attribuutteja voisi olla n Pituus n Nimi n Henkilötunnus n Attribuutit voivat olla tyypiltään Javan alkeistietotyyppejä (kokonaislukuja, merkkejä, jne.) Viittauksia toisiin olioihin (Henkilö-luokan olion attribuutin nimi arvona on viite merkkijono-olioon) Javalla 12
Luokka Metodit määrittävät olioiden käyttäytymisen Voivat muuttaa olion tilaa Voivat palauttaa jnkin arvon kutsujalleen Kaikilla luokan olioilla on samat metodit Metodeilla on Nimi Mahdolliset parametrit Runko, joka määrittää metodin toiminnan Javalla 13
Luokka n Luokan määrittely Javassa: class LuokanNimi { } attribuutit (eli muuttujat) konstruktori(t) metodit Ohjelmoija saa päättää luokan nimen (älä kuitenkaan käytää ääkkösiä ) Luokan nimi alkaa aina isolla kirjaimella Javalla 14
Luokka Luokan ja luokan sisältämän tiedoston nimi aina sama class Henkilo { } Henkilo.java class sanan edessä voi olla muuntimia public, protected, private, abstract, static, final tai strictfp Luokan nimen perässä voi olla tyyppiparametrien määrittely, extends tai implements määreet Javalla 15
Luokka n Luokan jäsenille voidaan antaa näkyvyysmääreet public, protected, private Myös oletusnäkyvyys (jätetään merkitsemättä) Javalla 16
Luokkakaavio Kuvaa luokasta kaiken olennaisen Ei metodien runkoja (toteutusta) Kuvataan muualla kaavioilla ja algoritmeilla Aika -tunnit: int -minuutit: int -sekunnit:int +Aika(t:int, m:int, s:int) +Aika( ) +gettunnit(): int +getminuutit(): int +getsekunnit(): int +settunnit(t: int) +setminuutit(m: int) +setsekunnit(s: int) +lisaatunti() +lisaatunti(t: int) Luokan nimi Luokan tiedot Luokan toiminnot Javalla 17
Luokkakaavio Atribuuttien kuvaaminen näkyvyysmääre attribuutinnimi: tyyppi! Näkyvyysmääre voi olla -, private (yksityinen) +, public (julkinen) #, protected (suojattu) ~, package (pakkaus) Metodien kuvaaminen näkyvyysmääre metodinnimi([param: tyyppi [,param: tyyppi] ]]): tyyppi! Javalla 18
Luokkakaavio Luokkakaaviolla kuvataan myös luokkien väliset assosiaatiot Assosiaatiolla nimeen voidaan liittää nuoli (>), joka osoittaa lukusuunnan Koostuminen Viitekorko -nimi: String 1 * koostuu > Korkojakso -alkupvm: Date -loppupvm: Date -korkoprosentti: double Viitekorko koostuu korkojaksoista Assosiaation kertautuminen (kardinaalisuus) Lähde: Vesterholm, Kyppö, Java-ohjelmointi, s. 60 Javalla 19
Luokkakaavio Assosiaation kertautuminen (kardinaalisuus) Montako oliota assosiaatio voi vähintään ja enintään yhdistää Viivan päähän n..m, n minimimäärä ja m maksimimäärä n..n voidaan lyhentää: n ja 0..*: * Opiskelija -nimi: String 0..500 0..* osallistuu > Kurssi -nimi: String Kurssille voi osallistua maksimissaan 500 opiskelijaa Opiskelija voi osallistua niin monelle kurssille kuin haluaa Javalla 20
Luokkakaavio Perityminen (yleistys) Kuvio Ympyrä Suorakulmio Periytymisessä assosioaatio yliluokan ja aliluokan välillä Aliluokka tarkentaa tai erikoistaa yliluokkansa Aliluokat perivät kaikki yliluokkansa ominaisuudet Aliluokassa voi olla lisäominaisuuksia Voidaan muodostaa hierarkioita (eläin, nisäkäs, koira) Javalla 21
Luokkakaavio Assosiaatiota kahden luokan välillä kutsutaan koosteeksi Pääluokan olio koostuu komponenttiolioista Kirja koostuu luvuista ja luvut kappaleista Koostuminen kuvataan salmiakkikuviolla, joka sijaitsee koostuvassa päässä Kirja Luku Kappale Javalla 22
Luokkakaavio Transitiivisuus Jos A koostuu B:stä ja B koostuu C:stä, niin silloin A koostuu myös C:stä (kirja koostuu myös kappaleista) Asymmetrisyys A:n koostuessa B:stä ei B voi koostua A:sta (luku ei voi koostua kirjasta) Javalla 23
Luokkakaavio Aito kooste Komponentti voi olla olemassa ainoastaan pääluokan olion osana Komponentti voi olla osana ainoastaan yhdessä pääluokan oliossa Merkitään täytetyllä salmiakkikuviolla Rakennus * Huone Kun rakennus puretaan häviävät myös huoneet Javalla 24
Lisää Javaa, tunnukset ja avainsanat Tunnuksia ovat mm. luokkien, muuttujien, metodien ja attribuuttien nimet Voivat sisältää kirjaimia numeroita alaviivan Tunnus alkaa kirjaimella, ei pituusrajoituksia Kuten aina ohjelmoinnissa, tunnusten tulee olla kuvaavia Isoilla ja pienillä kirjaimilla ero Javalla 25
Tunnukset ja avainsanat Luokan nimen ensimmäinen kirjain alkaa isolla kirjaimella Muuttujien, attribuuttien ja metodien nimet alkavat pienellä kirjaimella, mutta voivat sisältää muuten isoja kirjaimia lukumaara pankkitilinnumero laskesumma( ) Javalla 26
Tunnukset ja avainsanat Javan avainsanoja ei saa käyttää tunnuksena abstract assert boolean break byte case catch char class const * continue default do double else enum extends false final finally float for goto * if implements import instanceof int interface long native new null package private protected public return short static strictfp super switch synchronized this throw throws transient true try void volatile while Javalla 27
Muuttujat Javan muuttujia on kahdenlaisia Viitemuuttujat Sisältää viittauksen olioon (viitesemantiikka) Yksinkertaiset muuttuja, sisältävät alkeistyyppisiä tietoja kokonaislukuja reaalilukuja yksittäisiä merkkejä totuusarvoja Javalla 28
Muuttujat n Javassa vahva tyypitys n Muuttuja voi sisältää vain tyyppinsä mukaisia arvoja n Väärän tyyppisen tiedon sijoittaminen muuttujan arvoksi tuottaa kääntäjän virheilmoituksen n Sijoitus onnistuu vain jos tietotyypit ovat yhteensopivia ja sijoituksessa ei hukata informaatiota n Muuttujan määrittely: [final] tyyppi muutujannimi; [final] tyyppi nimi1, nimi2,, nimin; Javalla 29
Muuttujat Muuttujan määrittely: [final] tyyppi muutujannimi; [final] tyyppi nimi1, nimi2,, nimin; int ika; String nimi; double pituus, paino; final määrellä muuttujasta tehdään lopullinen arvoa ei voi muuttaa alustamisen jälkeen final double mailiakm = 1.609; Javalla 30
Tietotyypit Tyyppi Koko Arvoalue boolean true (tosi) tai false (epätosi) char 16 bit merkki, merkin unicode -koodi byte 8 bit kokonaisluku -128 127 short 16 bit kokonaisluku -32768 32767 int 32 bit kokonaisluku -2147483648 2147483647 long 64 bit kokonaisluku -9223372036854775808 9223372036854775807 float 32 bit liukuluku 1.4*10-45 3.4*10 38, n. 7 numeron tarkkuus double 64 bit liukuluku 4.9*10-324 4.9*10 308, n 15 numeron tarkkuus Javalla 31
Tietotyypit n float- ja double- tyypeillä kolme erityistä arvoa positiivinen ja negatiivinen ääretön n Float.NEGATIVE_INFINITY n Float.POSITIVE_INFINITY n Double.NEGATIVE_INFINITY n Double.POSITIVE_INFINITY NaN (Not a Number), arvoton lukuarvo n Float.NaN n Double.NaN Javalla 32
Muuttujien näkyvyys n Alue jossa muuttujaa voi käyttää Aina sen lohkon sisällä, jossa määritelty Muuttujilla ei voi olla samoja nimiä näkyvyysalueellaan Poikkeuksena attribuutit, jonka nimi voi olla saman kuin paikallisen muuttujan tai metodin parametrin nimi Tällöin muuttujan nimi peittää attribuutin nimen tällöin käytettävä this-avainsanaa Javalla 33
Muuttujat, alustaminen Paikallisia muuttujia ei alusteta automaattisesti Sijoitettava arvo ennen käyttöä, muuten kääntäjä antaa virheilmoituksen import java.io.*; public class MuuttujaDemo { public static void main( String [] args ){ final double PII = 3.141592653; int leveys = 10; int korkeus, ala; korkeus = 25; ala = leveys * korkeus; korkeus = korkeus - 15; ala = leveys * korkeus; int r = 5; double ympyranala = PII * r * r; } } Javalla 34
Muuttujat, tulostaminen standardiin tulostusvirtaan Muotoilematon tulostus System.out.print( ); System.out.println( ); import java.io.*; public class TulostusDemo1 { public static void main( String [] args ){ int korkeus = 12, leveys = 10, piiri = 2 * (korkeus + leveys ); System.out.print("Korkeus on "); System.out.println(korkeus); System.out.println("Leveys on " + leveys); System.out.println("Piiri on " + piiri ); } } Javalla 35
Muuttujat, tulostaminen standardiin tulostusvirtaan Muotoiltu tulostus printf-metodilla printf(string format, Object args); format (ohjausjono) määrää tulostustavan Ohjausjono sisältää lainausmerkkien sisällä konversiomäärittelyjä sisältävän merkkijonon %[tietokohta$][liput][leveys][.tarkkuuus]konversio Hakasuluissa olevat eivät ole pakollisia %konversio Ohjausjonon perään pilkulla erotettuna ne tiedot, jotka tulostetaan ohjausjonon ohjaamana Javalla 36
Muuttujat, tulostaminen standardiin tulostusvirtaan Konversiomerkkejä ovat mm. d, lisää tulostukseen kokonaislukutyyppisen arvon 10- järjestelmän kokonaislukuna f, lisää tiedon desimaalilukuna c, lisää tiedon merkkinä s, lisää tiedon merkkijonona %, lisää %-merkin n, lisää järjestelmäkohtaisen rivinvaihdon Javalla 37
Muuttujat, tulostaminen standardiin tulostusvirtaan n Desimaalilukujen tulostuksessa tarkkuus määrää tulostuvien desimaalien lukumäärän n Leveys kertoo kohtaa tulostuvien merkkien minimimäärän n Oletuksena on tulostuksen tasasu kentän oikeasta reunasta n Lipuilla voi hienosäätää tulostusta -, tasaa tulostuksen vasempaan reunaan +, lisää aina luvun etumerkin välilyönti, positiivisille luvuille välilyönti luvun eteen 0, lisää etunollat luvun eteen pilkku, luvun ryhmittely Javalla 38
Muuttujat, tulostaminen standardiin tulostusvirtaan n Omalla koneella saattaa tulostus poiketa esimerkeistä n printf tekee luvuille järjestelmän mukaisen tulostuksen muotoilun n Suomalainen muotoilu asetuksiin import java.io.*; import java.util.locale; public class TulostusDemo { public static void main( String [] args ){ double luku = 1.234567; System.out.printf("luku on. %5.2f%n", luku); Locale loc = new Locale("fi", "FI"); System.out.printf(loc, "luku on: %5.2f%n", luku); } } Javalla 39
Muuttujat, tulostaminen standardiin tulostusvirtaan Ohjelman tulostus luku on: 1.23 luku on: 1,23 Väärän konversion käyttö aiheuttaa ajonaikaisen virhetilanteen double luku = 1.234567; System.out.printf("luku on. %5.2d%n", luku); Exception in thread "main" java.util.illegalformatprecisionexception: 2 at java.util.formatter$formatspecifier.checkinteger(formatter.java:2984) at java.util.formatter$formatspecifier.<init>(formatter.java:2729) at java.util.formatter.parse(formatter.java:2560) at java.util.formatter.format(formatter.java:2501) at java.io.printstream.format(printstream.java:970) at java.io.printstream.printf(printstream.java:871) at Malli.main(TulostusDemo.java:9) Javalla 40
Muuttujat, tyypinmuunnokset n Java käyttää vahvaa tyypitystä, vääräntyyppisen arvon sijoittaminen aiheuttaa virheen n Staatisen tyypityksen ansiosta virheet havaitaan jo käännösaikana n Muunos voidaan tehdä implisiittisesti (automaattisesti), jos tietoa ei häviä byte -> char -> short -> int -> long -> float -> double eksplisiittisesti, jos muunnoksessa voi hävitä tietoa tyypinmuunnosoperaattori n (tyyppi)lauseke Javalla 41
Muuttujat, operaattorit n Muuttujan/arvon tietotyyppi määritää mitä operaatioita muuttujalle sallitaan n Operaattori Operaatio, joka muodostaa arvon operaation kohteiden (operandien) perusteella Kolme kategoriaa, riippuen siitä montako operandia tarvitaan operaatiossa n Unaarioperaattori n Binäärioperaattori n Kolmiarvoinen operaattori (c = a > b? a : b;) Javalla 42
Muuttujat, operaattorit Operaattori Aritmeettiset operaattorit + - * / % Yhtäsuuruusoperaattorit ==!= Vertailuoperaattorit < > <= >= Loogiset operaattorit! && Sijoitusoperaattorit = += -= *= /= Erityiset lisäys- ja vähennysoperaattorit ++ -- Javalla 43
Muuttujat, operaattorit Kertolasku ennen jakolaskua Samanarvoiset yhteen- ja vähennyslaskut lasketaan vasemmalta oikealle Operaattorien operandien kehitysjärjestys Vasemmalta oikealle laskea() + laskeb() + laskec(); Ensin luodaan koodi, joka tuottaa laskea():n ja sitten laskeb():n arvon Sitten lasketaan em. arvojen summa ja kehitetään laskec():n arvo ja lasketaan se yhteen edellisen tuloksen kanssa Virheen sattuessa kehittäminen lopetetaan välittömästi Javalla 44
Muuttujat, operaattorit Suluilla voi muuttaa laskentajärjestystä Tarvittaessa tehdään automaattisia tyypinmuunnoksia Valinnassa järjestys on double, float, long ja int Jos toinen operandi on int ja toinen float muutetaan int float-tyyppiseksi Reaaliluvuilla laskenta poikkeaa koulumatematiikasta Reaaliluvuilla arvot +0.0 ja -0.0, ovat vertailussa samoja mutta vaikuttavat tuloksen etumerkkiin (1.0/-0-0 = - ) NaN, laskutoimitukset joissa NaN mukana on tulos NaN Javalla 45
Muuttujat, operaattorit Poikkeavia laskutoimituksia x y X * y x/y x%y äärell.luku ±0.0 ±0.0 ± NaN äärell.luku ± ± ±0.0 x ±0.0 ±0.0 ±0.0 NaN NaN ± äärell.luku ± ± NaN ± ± ± NaN NaN ± ±0.0 NaN ± NaN Reaalilukulaskennassa kaksi tiukkuusastetta Oletuksena eri virtuaalikoneet eivät tuota tarkalleen samaa tulosta tiukka reaalilukulaskenta strictfp määreellä Javalla 46
Muuttujat, tietojen lukeminen käyttäjältä Standardisyöttövirta System.in Lukeminen tavuina Muutettava merkkijonoksi ja muiksi tietotyypeiksi muiden luokkien avulla Javassa luokat Console yksittäisten rivien lukeminen Javalla 47
Muuttujat, tietojen lukeminen käyttäjältä import java.io.console; class LueTietoja { private static final Console konsoli = System.console(); public static void main(string [] args){ System.out.print("Anna etunimesi >"); String etunimi = konsoli.readline(); System.out.printf("Terve \"%s\" %n", etunimi); } } Anna etunimesi >Ilkka Terve "Ilkka" Javalla 48
Muuttujat, tietojen lukeminen käyttäjältä Luokka Scanner pakkauksessa util Kytketään standardi inputvirtaan (System.in) import java.util.scanner; class LueTietoja { private static final Scanner lukija = new Scanner(System.in); public static void main(string [] args){ System.out.print("Anna etunimesi >"); String etunimi = lukija.nextline(); System.out.printf("Terve \"%s\" %n", etunimi); } } Javalla 49
Muuttujat, tietojen lukeminen käyttäjältä Metodeja nextline() lukee rivin tekstiä nextint(), nextlong() lukee kokonaisluvun nextfloat(), nextdouble() lukee desimaaliluvun Javalla 50
Ohjausrakenteet Valinta- ja toistorakenteet vaativat jonkin ehtolausekkeen, jonka tuottaman totuusarvon perusteella päätellään mitä tehdään seuraavaksi Totuusarvot, aitoja arvoja toisin kuin vaikka C:ssä boolean- tietotyyppi true! false! boolean onparillinen;! onparillinen = (5 % 2 == 0);! Javalla 51
Ohjausrakenteet Javan loogiset operaattorit operaattori selite! negaatio (not) && & ehdollinen JA (and) ehdoton JA ehdollinen TAI (or) ehdoton TAI ^ poissulkeva tai, JOKO TAI (xor) Ehdollinen ja ehdoton ja/tai eroavat toisistaan siinä, että ehdollisissa tapauksissa (&&, ) lausekkeen arvon kehitäminen loppuu heti, kun lausekkeen tulos voidaan päätellä (ns. oikosulkuominaisuus) Javalla 52
Ohjausrakenteet Ehtolauset kuten C:ssä if(ehto)! lausea;! else! lauseb;! if(ehto){! lause1;! lause2;! }else{! lause3;! lause4;! }! Javalla 53
Ohjausrakenteet Ehto-operaattori int x = 2, y = 5;!! int z = x > y? x-y : x+y; //z on 7! switch -lause! switch( valintaa ohjaava lauseke ){! case arvo1:! lauseet;! break;! case arvo2:! lauseet;! break;! case arvon:! lauseet;! break;! default:! lauseet;! }! Javalla 54
Toistorakenteet n Samat kuin C:ssä do {! lause(ita);! }while(ehto); while(ehto) {! lause(ita);! }while! for(alustus; ehto; päivitys){! lause(eita)! }! Javalla 55
Toistorakenteet Parannettu versio for-toistorakenteesta Jonkin joukon kaikkien alkioiden läpikäymiseen ns. foreach-silmukka Joukko voi olla Taulukko Jokin Iterable-liittymän totetuttavan luokan olio, esimerkiksi kokoelma (myöhemmin tästä)!! Javalla 56
Toistorakenteet for( muodollinen parametri : lauseke ) lause! n Muodollinen parametri määrittelee muuttujan, joka saa arvokseen vuorollaan jokaisen joukon alkion arvon kun suoritetaan lause n Voidaan käyttää mm. taulukoiden yhteydessä Taulukko on lauseke, jonka alkiot käydään läpi public static void tulostataulukko(int [] luvut){! for( int tulostettavaluku : luvut ){! System.out.println(tulostettavaLuku);! }! }! Javalla 57
Merkit Merkit kuvataan Unicode-standardin mukaisesti char-tyyppi 16 bittinen (65 536 merkkiä) Laajennttu Unicode -tyyppi, merkit esitetään inttyyppisinä tai kahtena peräkkäisenä char-arvona Erityismerkit \n, \\,sama merkitys kuin C:ssä \uxxx, heksadesimaaliluku, joka kuvaa jonkin Unicode-merkistön merkin (esim. \u03c0 on π) Javalla 58