Kurssin suoritus. Javan perusteet 2004. Kurssimateriaali. Kurssin aikataulu. Harjoitukset. Kurssin sisältö. Javan perusteet 2004 1



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

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

OutputStream ja InputStream. Tietovirrat ja niiden suunnat. Tietovirtojen käyttö. FileInputStream esimerkki. DataOutputStream ja DataInputStream

Kurssin suoritus. Javan perusteet Kurssimateriaali. Kurssin aikataulu. Kurssin sisältö. Harjoitukset. Javan perusteet

Java-kielen perusteet

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

Java-kielen perusteita

20. Javan omat luokat 20.1

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

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

Java-kielen perusteet

Olio-ohjelmointi Javalla

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

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

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

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

17. Javan omat luokat 17.1

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

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

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

1. Omat operaatiot 1.1

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

Taulukot. Jukka Harju, Jukka Juslin

5. HelloWorld-ohjelma 5.1

16. Javan omat luokat 16.1

17. Javan omat luokat 17.1

14. Poikkeukset 14.1

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

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

Java kahdessa tunnissa. Jyry Suvilehto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Java-API, rajapinnat, poikkeukset, UML,...

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

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

12. Javan toistorakenteet 12.1

5/20: Algoritmirakenteita III

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

Harjoitus 5 (viikko 48)

Ohjelmointi 2 / 2010 Välikoe / 26.3

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

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

Listarakenne (ArrayList-luokka)

14. Poikkeukset 14.1

P e d a c o d e ohjelmointikoulutus verkossa

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

19. Olio-ohjelmointia Javalla 19.1

7. Näytölle tulostaminen 7.1

Metodien tekeminen Javalla

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

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

13. Loogiset operaatiot 13.1

11. Javan toistorakenteet 11.1

12. Javan toistorakenteet 12.1

ITKP102 Ohjelmointi 1 (6 op)

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

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

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Javan perusteita. Janne Käki

Rajapinta (interface)

7. Oliot ja viitteet 7.1

ITKP102 Ohjelmointi 1 (6 op)

Harjoitustyö: virtuaalikone

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Muuttujat ja kontrolli. Ville Sundberg

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

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1

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

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

15. Ohjelmoinnin tekniikkaa 15.1

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Pakkauksen kokoaminen

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Java-kielen perusteet

11. Javan valintarakenteet 11.1

Mikä yhteyssuhde on?

11. Javan valintarakenteet 11.1

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

13. Loogiset operaatiot 13.1

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

5. HelloWorld-ohjelma 5.1

7/20: Paketti kasassa ensimmäistä kertaa

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

A TIETORAKENTEET JA ALGORITMIT

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmointiharjoituksia Arduino-ympäristössä

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

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

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

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

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

Transkriptio:

Kurssin suoritus Javan perusteet 2004 1,5 ov Kuopion yliopisto, tietojenkäsittelytieteen laitos Ohjelmistotekniikan maisterikoulutus, Varkaus Tomi Keinonen tkeinone@cs.uku.fi Luennot 18 h Harjoitukset 4 krt Lopputentti tai harjoitustyö Harjoituksista jaettavat hyvityspisteet 75 % 100 % +2 arvosanaa 50 % 75 % +1 arvosana 25 % 50 % ei vaikutusta 0 % 25 % 1 arvosana 1 2 Kurssimateriaali Verkkosivut http://www.cs.uku.fi/~tkeinone/java2004/ Kurssin aikataulu To 7.10.2004 16:45 19:45 Luennot 1 4 La 23.10.2004 9:00 10:30 Harjoitukset 1 B231 C1004TK Kurssi pohjautuu kirjaan Morelli, Ralph: Java, Java, Java! : Object Oriented Problem Solving 1. painos: 2000, ISBN 0 13 011332 8 2. painos: 2002, ISBN 0 13 033370 0 Kurssikirjan hankinta ei välttämätöntä, mutta varsin suotavaa 3 La 23.10.2004 11:00 14:00 Luennot 5 8 B231 Harjoitustehtävien 2 palautus sähköpostitse ma 8.11. klo 18 mennessä Ti 9.11.2004 16:45 19:45 Luennot 9 12 B231 Harjoitustehtävien 3 palautus sähköpostitse ti 23.11. klo 18 mennessä Ke 24.11.2004 16:45 19:45 Luennot 13 16 B231 Harjoitustehtävien 4 palautus sähköpostitse ke 8.12. klo 18 mennessä (To 9.12.2004 16:45 19:45 Tentti B231) Jompi kumpi, sovitaan (Harjoitustyön palautus sähköpostitse pe 10.12. klo 18 mennessä) kurssilla Ke 15.12.2004 16:45 18:15 Luennot 17 18 B231 4 Harjoitukset Tehtävät nettisivulla Ensimmäiset harjoitukset mikroluokassa Ohjelmalliset ratkaisut mukaan esim. levykkeellä Harjoitukset 2 4 palautetaan sähköpostina Ratkaisujen ohjelmakoodit liitetiedostoina Mahdolliset kuvat GIF tai JPEG muotoisina Osanottajien määrästä riippuen lyhyt palaute ratkaisusta paluupostina Ratkaisujen ei tarvitse olla täydellisiä 5 Kurssin sisältö Poikkeukset J2SE API Tiedostot Rekursio Javakieli Java 2 Platform, Standard Edition 1.4.2 Taulukot Luokat ja oliot Ehdot ja toisto Metodit Aritmetiikka 6 Javan perusteet 2004 1

Java JAVA:sta on useita eri versioita erilaisiin käyttötarkoituksiin Ympäristö Ei käyttöjärjestelmäriippuvuutta Standard Edition (SE) Enterprise Edition (EE) Mobile Edition (ME) Sunin J2SE SDK, versio 1.4.2 http://java.sun.com/ J2SE: Yleisin Java alusta, joihin perussovellukset pohjautuvat J2EE: Palvelinsovellusten kehittämiseen tarkoitettu alusta, sisältää kaikki J2SE:n ominaisuudet J2ME: Typistetyin ominaisuuksin kämmenlaitteisiin tarkoitettu alusta Kurssilla käsiteltävät perustoiminnot kaikissa Java alustoissa samat. Eroavaisuudet lähinnä alustan luokkakirjastoissa. Lähdekoodi suositellaan kirjoitettavaksi jollakin tekstieditorilla: http://www.jcreator.com/ (ilmainen LE) 7 8 Oliot ja luokat Oliot ja luokat Olio on luokan ilmentymä, jolla on tila ja käyttäytyminen. Luokan ja olion erot? UML luokkakaavio. Olio on yleinen käsite, jolla on tila käyttäytyminen Jokaisella oliolla on yksikäsitteisesti määritelty luokka, johon se kuuluu Olion tila talletetaan attribuutteihin ja käyttäytyminen toteutetaan metodeilla 9 10 Oliot ja luokat Oliot ohjelmissa Jääkaappi Omena Timestamp Olio ohjelmointikieliä: Java, C++, Oberon 2, Smalltalk, Eiffel Java puhdas olio ohjelmointikieli Maitopurkki Tomaatti File Duration User Ohjelmistokehittäjä rakentaa tarvittavat luokat vaatimusten ja suunnitelmien perusteella 11 12 Javan perusteet 2004 2

Olio ohjelmointi periaatteita Hajoita ja hallitse Kapselointi Rajapinnat Tiedon piilottaminen Yleiskäyttöisyys Laajennettavuus Miksi luokat? Luokat suunnitellaan ja testataan hyvin (hyvä laatu) Luokkia uudelleenkäytetään ja peritään (kehityksen nopeus) Väärän käytön estäminen (ohjelmoijan virheiden vähentäminen) Asiakokonaisuudet erillään (selkeys ja ymmärrettävyys) 13 14 Luokan ja olion erot UML luokkakaavio Luokka määrittelee attribuutit ja metodit ohjelmoijan tekemä ei ole olemassa ajon aikana kuin oliomuodossa kiinteä ajon aikana, ei voida muuttaa ohjelman pyöriessä nimetty luokan nimen mukaan Olio on luotu jostakin luokasta on olemassa vain ajon aikana täytyy määritellä ja luoda ohjelmassa sisältää attribuutteja ja metodeja, joita voidaan suorittaa ohjelmasta nimetty muuttujaksi Universal Modeling Language Luokasta kuvataan Nimi Attribuutit Metodit Yleisesti käytetty standardisoitu kuvaustapa Kommentteja voidaan laittaa merkkien väliin Director SimpleWindow window GrayCircle circle «constructor» Director() 15 16 Metodikutsut Metodikutsut olio.metodi(); Esimerkkejä pen.moveforward(); pen.turnclockwise(); pen.draw(); DrawingTool «constructor» DrawingTool() «update» void moveforward() void turnclockwise() void dontdraw() void draw() Attribuutit (luokan muuttujat) Jokaisella luokan attribuuttilla on määritelty näkyvyysalue (scope) private protected public Attribuuttien nimien tulee olla yksilöllisiä Esimerkki private DrawingTool pencil; private DrawingTool pen; 17 18 Javan perusteet 2004 3

Nimeämiskäytännöt Javakielessä Luokkien, metodien ja attribuuttien nimissä (identifiers) on rajoitteita alkaa kirjaimella a z tai A Z, jonka jälkeen voi olla numeroita tai kirjaimia, mutta ei erikoismerkkejä isot ja pienet kirjaimet eri merkkejä nimeäminen kannattaa tehdä kuvaavasti eri käytäntöjä olemassa, yhtenäisyys ohjelman sisällä kannattaa säilyttää Nimeämiskäytännöt esimerkki Luokkien nimet: DrawingTool Luokan metodit: drawline Attribuutit: pencilcolor Muuttujat metodien sisällä: pencilcolor Sun:n suositukset: http://java.sun.com/docs/codeconv/ 19 20 Lähdekoodista ohjelmaksi Ensimmäinen Java ohjelma Lähdekoodista ohjelmaksi Ensimmäinen ohjelma 1 2 3 4 Tekstieditori Lähdekoodi (*.java) Kääntäjä Tavukoodi (*.class) Suunnitelmasta lähdekoodiksi Jokainen luokka kirjoitetaan omaan lähdekooditiedostoon. Esimerkiksi luokka Director kirjoitetaan tiedostoon Director.java Koodia selkeyttämään käytetään sisennyksiä, kommentteja ja yhtenäistä nimeämiskäytäntöä. Isot ja pienet kirjaimet tarkoittavat eri asiaa. Luokkien ja niissä olevien metodien kokoa pyritään rajoittamaan. Suuret luokat ja pitkät metodit kannattaa jakaa pienempiin osiin. 5 Virtuaalikone (JRE) 21 22 Lähdekoodista ohjelmaksi Lähdekoodista ohjelmaksi 1 2 3 4 5 Tekstieditori Lähdekoodi (*.java) Kääntäjä Tavukoodi (*.class) Virtuaalikone (JRE) Lähdekoodista tavukoodiksi Kääntäjä kääntää lähdekoodin JRE:n ymmärtämäksi tavukoodiksi (javac tiedosto). Kääntäjä tarkastaa lähdekoodin oikeellisuuden ja pysähtyy virheeseen, mikäli lähdekoodia ei voida kääntää. Onnistunut käännös tuottaa.classpäätteisen tavukooditiedoston jokaisesta lähdekooditiedostosta. Ohjelmoija ei muokkaa tavukoodia, vaan muutokset tehdään aina lähdekoodiin. 23 1 2 3 4 5 Tekstieditori Lähdekoodi (*.java) Kääntäjä Tavukoodi (*.class) Virtuaalikone (JRE) Tavukoodin suorittaminen Tavukoodia ei ole konekieltä eli sitä ei voida suorittaa suoraan prosessorilla. Suorittamiseen käytetään Javavirtuaalikonetta (Java VM, JRE). (java luokannimi) Samaa tavukoodia voidaan suorittaa missä tahansa laiteympäristössä, mihin on saatavilla Java VM. Ohjelmassa olevat loogiset virheet ilmenevät vasta ajon aikana. Virheitä vähennetään ja tutkitaan testauksella ja debuggauksella. 24 Javan perusteet 2004 4

Ensimmäinen ohjelma public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World!"); Koodin kääntäminen ja ajaminen Yksittäisen MyClass.java tiedoston kääntäminen onnistuu: javac MyClass.java Käännöksen jälkeen ajaminen: java MyClass Ajamisen yhteydessä voidaan välittää komentoriviparametreja: java MyClass parametri1 parameteri2... 25 26 Kommentit Kommentteja voi koodiin laittaa kahdella tavalla: // yksirivinen kommentti /* Monirivinen kommentti */ Sopivat kommentit selkeyttävät koodia Ohjelma? Hyvä ohjelma toteutuksen näkökulmasta? Toimii halutusti normaalien käyttötapausten lisäksi myös erikoistapauksissa Rakenne on selkeä ja ymmärrettävä Hyödynnetty mahdollisuuksien mukaan olemassaolevia valmiita luokkia/luokkakirjastoja Koodi uudelleenkäytettävää Riittävä kommentointi 27 28 Perustietotyypit Perustietotyypit ja aritmetiikka Kokonaislukutyypit, reaalilukutyypit, kirjaimet Perustietotyyppien ja olioiden erot Aritmeettiset lausekkeet ja niiden sisäinen suoritusjärjestys Muunnokset perustietotyypistä toiseen Merkkijono Math luokan tarjoamat palvelut Vakiot 29 Kokonaislukutyypit byte (8 bittiä) ( 128 127) short (16 bittiä) ( 32768 32767) int (32 bittiä) ( 2147483648 2147483647) long (64 bittiä) Liukulukutyypit float (32 bittiä) double (64 bittiä) Muut perustietotyypit boolean totuusarvo (true/false) char kirjain (Unicode) 30 Javan perusteet 2004 5

Tietotyyppien kokojärjestys byte char short int long float double 31 Kokonaislukutyypin int operaattorit Prefix operaattorit (int >int) vastaluku ++ lisäys vähennys Aritmeettiset oper. (int*int >int) + yhteenlasku vähennyslasku * kertolasku / jakolasku (kokonaisosa) % jakoläännös (modulo) Vertailulauseet (int*int >boolean) == yhtäsuuruus!= erisuuruus < pienempi <= pienempi tai yhtäsuuri > suurempi >= suurempi tai yhtäsuuri Postfix operaattorit (int >int) ++ lisäys vähennys Rajoituksia ++ ja (prefix ja postfix) operaattoreita ei voida kohdistaa vakioille Käyttöesimerkkejä int i = 1; int k = 2; ++i; // prefix, i=i+1; int sum = i+k; // aritm. op. boolean b = i < k; // vertailu i++; // postfix boolean complex = (i++ * 2 > ++k); Operaattorien lyhennykset a+=b a=a+b a =b a=a b a*=b a=a*b a/=b a=a/b Käyttöesimerkkejä int a = 1; a*=2; // a=a*2; > a==2 int b = 6; b+=2; // b=b+2; > b==8 Muunnokset tietotyypistä toiseen Muunnokset numeroarvoisesta tietotyypistä toiseen tehdään tyypinmuunnoksen kautta Pyöristykset tapahtuvat aina alaspäin Esimerkki: int i = (int)2.5; // i == 2; Mikäli halutaan pyöristää virallisten pyöristyssääntöjen mukaan, on 2 vaihtoehtoa: int i = (int)2.5 + 0.5; // i == 3 int i = Math.round(2.5); // i == 3 34 String luokka String luokkaa käytetään merkkijonojen tallentamiseen Vaikka String näyttäisi toimivan kuin perustietotyyppi, se on kuitenkin luokka String str = Esim ; String str = new String( Esim ); String str( Esim ); Luokalla on paljon metodeja merkkijonon käsittelyyn Math luokan metodeja Math.abs itseisarvo Math.pow potenssi Math.round pyöristys Math.sqrt neliöjuuri Math.random satunnaisluku 0.0 1.0 35 36 Javan perusteet 2004 6

Vakiot Vakioita voi määrittää final määreellä Vakiomuuttujan arvoa ei voi muuttaa Esimerkkejä: final double Math.PI = 3.141592 final int count = 11; Oliot ja luokat Luokkien teko Konstruktorit Metodit Muuttujat, oliot ja roskienkeruu 37 38 Esimerkkiluokan UML kaavio String m_name int m_age int m_creditcount Student Student() Student(String name) void setname(string name) void setage(int age) void setcreditcount(int creditcount) Konstruktorit Luokalla voi olla yksi tai useampia luokan nimisiä metodeja, joita kutsutaan konstruktoreiksi Konstruktorit voivat erota toisistaan erilaisten parametrien perusteella: public class Student { Student() { Student(String name) { 39 40 Konstruktorit Konstruktoria kutsutaan luotaessa uusi olio Student stu1 = new Student(); Student stu2 = new Student( Pekka ); Metodit String m_name int m_age int m_creditcount Student Student() Student(String name) void setname(string name) void setage(int age) void setcreditcount(int creditcount) Konstruktorin lisäksi luokalla on yleensä myös muita metodeja Metodeilla voi myös olla parametreja 41 42 Javan perusteet 2004 7

Metodien parametrit Metodilla voi olla rajoittamaton määrä parametreja Parametrit määritellään sulkujen sisässä metodin nimen perässä public void sellcar(car cartosell, Person currentowner, Person buyer) { cartosell.check(); buyer.getsignature(); currentowner.getsignature();... 43 Metodien paluuarvot Metodilla voi olla korkeintaan yksi paluuarvo Paluuarvon tyyppi määritellään ennen metodin nimeä: public String getname(); public int getage(); Metodi ei palauta arvoa, mikäli se määritellään void määreellä: public void setage(int age); 44 Metodien paluuarvot Metodin paluuarvo palautetaan returnlauseella public String getname() { return m_name; Metodien määrittely yhteenveto Jokainen metodi kuuluu jollekin luokalle Metodin näkyvyysalue rajaa sen käyttöä Metodilla voi olla rajoittamaton määrä parametreja Metodilla voi olla yksi paluuarvo tai ei paluuarvoa ollenkaan (void) 45 46 Olioiden luonti ja sijoittaminen Muuttujat, oliot ja roskienkeruu Oliota ei ole olemassa ennen sen luontia muuttuja = new Olio(); Esimerkki DrawingTool pen; pen = new DrawingTool(); pen.moveforward(); 47 Kun muuttua esitellään ensimmäisen kerran, se ei osoita mihinkään olioon vaan nullarvoon Kun olioon ei osoita enää yksikään muuttuja, Java kielen roskienkeruu tuhoaa sen DrawingTool pen; // pen osoittaa null arvoon pen = new DrawingTool(); // pen osoittaa luotuun olioon pen = null; // luotuun DrawingTool olioon ei osoita enää // yksikään muuttuja > se tuhotaan 48 Javan perusteet 2004 8

Muuttujat, oliot ja roskienkeruu Muuttujat, oliot ja roskienkeruu mypen missingpen ( null ) ( null ) suorituskohta mypen = new Pencil(); mypen = null; borrowedpen = new Pencil(); missingpen = borrowedpen; missingpen = mypen; borrowedpen = new Pencil(); suorituskohta mypen = new Pencil(); mypen = null; borrowedpen = new Pencil(); missingpen = borrowedpen; missingpen = mypen; borrowedpen = new Pencil(); mypen missingpen mypen : Pencil m_color = =? m_width = =? ( null ) borrowedpen ( null ) borrowedpen ( null ) 49 50 Muuttujat, oliot ja roskienkeruu mypen = new Pencil(); mypen = null; borrowedpen = new Pencil(); missingpen = borrowedpen; missingpen = mypen; borrowedpen = new Pencil(); mypen missingpen ( null ) : Pencil m_color = =? m_width = =? ( null ) Muuttujat, oliot ja roskienkeruu mypen = new Pencil(); mypen = null; borrowedpen = new Pencil(); missingpen = borrowedpen; missingpen = mypen; borrowedpen = new Pencil(); mypen missingpen ( null ) : Pencil m_color = =? m_width = =? ( null ) borrowedpen : Pencil borrowedpen ( null ) borrowedpen m_color = =? m_width = =? 51 52 Muuttujat, oliot ja roskienkeruu mypen = new Pencil(); mypen = null; borrowedpen = new Pencil(); missingpen = borrowedpen; missingpen = mypen; borrowedpen = new Pencil(); mypen missingpen ( null ) : Pencil m_color = =? m_width = =? suorituskohta suorituskohta suorituskohta suorituskohta Muuttujat, oliot ja roskienkeruu mypen = new Pencil(); mypen = null; borrowedpen = new Pencil(); missingpen = borrowedpen; missingpen = mypen; borrowedpen = new Pencil(); mypen missingpen ( null ) : Pencil m_color = =? m_width = =? ( null ) borrowedpen : Pencil borrowedpen : Pencil borrowedpen m_color = =? m_width = =? borrowedpen m_color = =? m_width = =? 53 54 Javan perusteet 2004 9

Muuttujat, oliot ja roskienkeruu suorituskohta mypen = new Pencil(); mypen = null; borrowedpen = new Pencil(); missingpen = borrowedpen; missingpen = mypen; borrowedpen = new Pencil(); mypen missingpen ( null ) : Pencil m_color = =? m_width = =? ( null ) borrowedpen : Pencil m_color = =? m_width = =? : Pencil borrowedpen m_color = =? m_width = =? 55 56 Vertailulauseet Ehtolausekkeet Ehdot, valintalausekkeet Boolean algebra == yhtäsuuruus!= erisuuruus < pienempi <= pienempi tai yhtäsuuri > suurempi >= suurempi tai yhtäsuuri Esimerkkejä: int i=7; int j=10; Jolloin: i < j == true i >= j == false i!= j == true 57 58 Vertailulauseet Huomaa ero sijoitusoperaatiolla ja vertailuoperaatiolla: = Sijoitusoperaatio == Vertailuoperaatio Esimerkki j = 1; // j saa arvokseen yksi j == 1 // onko j:n arvo yksi? Vertailulauseet Suuremmuutta ja pienemmyyttä tutkivilla operaatioilla voi vertailla vain numeerisia lausekkeita Yhtäsuuruus ja erisuuruus ovat käytössä muidenkin arvojen vertailuissa Esimerkki double d=0.1; double e=0.2; String auto( Auto ); String bussi( Bussi ); d < e == true // Sallittu auto < bussi // Ei sallittu! // Sallittu, mutta ei suositeltu sisällön // vertailuun auto!= bussi 59 60 Javan perusteet 2004 10

if lauseke Ohjelmassa voi olla valintalauseita: if (ehto) { // tee jotain else { // tee jotain muuta if lauseke ehdon tulee aina olla jokin totuusarvo jos totuusarvo on tosi, suoritetaan iflauseketta seuraava lohko jos totuusarvo on epätosi, suoritetaan else lausekkeen jälkeinen lohko (jos sellainen on olemassa) else osassa voi olla uusi if lauseke (else if) 61 62 if lauseke esimerkki 1 public void ispositive(int i) { System.out.println( Luku + i ); if (i>0) System.out.println( on positiivinen. ); else if (i<0) System.out.println( on negatiivinen. ); else System.out.println( on nolla. ); Lohkot Jos valintavaihtoehto koostuu useammasta lauseesta, lauseet on koottava yhteen lohkoksi Lohko on merkkien { ja välisten lauseiden jono Lohkon viimeisen aaltosulun jälkeen ei käytetä puolipistettä. 63 64 if lauseke esimerkki 2 public void ispositive(int i) { System.out.println( Luku + i ); if (i>0) { System.out.println( on positiivinen. ); dosomething(i); else if (i<0) System.out.println( on negatiivinen. ); else System.out.println( on nolla. ); if lauseke moniselitteisyys? if lauseeseen ei ole pakko liittyä else osaa, jonka vuoksi tulee huomata mihin mikäkin else osa liittyy Esimerkki if (a<b) if (c<d) e=f; else g=h; // Tarkoittaako tämä: if (a<b) if (a<b) if (c<d) if (c<d) e=f; e=f; else else g=h; g=h; Sääntö: else osa liittyy aina lähimpään edeltävään iflauseeseen 65 66 Javan perusteet 2004 11

Totuusarvojen yhdistely Totuusarvoilla voi laskea: (a == b) // a ja b yhtäsuuret (a!= b) // a erisuuri kuin b (a && b) // a ja b tosia (a b) (!a) // a tai b // a epätosi Edellä esiteltyjä voi yhdistellä, esimerkiksi: (a b) && (c d) // a tai b ja c tai d switch lauseke switch lausekkeella voi olla eri haaroja switch soveltuu paikkoihin, joissa on tarvetta käsitellä monia eri numeroarvoihin perustuvia haaroja switch lausekkeessa voi olla default haara, joka suoritetaan mikäli yksikään muu haara ei toteudu switch lausekkeessa on muistettava break:n käyttö (kts. seuraava esimerkki). break:lla poistutaan switch lauseesta. 67 68 switch lauseke esimerkki boolean perustietotyyppi public void printnumber(int i) { switch(i) { case 0: System.out.println( nolla ); break; case 1: System.out.println( yksi ); break; default: System.out.println( ei yksi eikä nolla ); break; 69 Totuusarvo voidaan sijoittaa booleantyyppiseen perustietotyyppiin boolean isbigger = (a>b); if (isbigger) System.out.println( a is bigger than b ); else System.out.println( a isn t bigger than b ); 70 Esiehtoinen toistorakenne Toisto Toistolausekkeet for, while(ehto){ ja do { while(ehto) Toistorakenteista poistuminen ja niiden sisällä siirtyminen while (ehto) { /* suoritettava koodi */ Esimerkki: int poweroftwo = 2; while (poweroftwo < 10) { System.out.println( Next power: + poweroftwo); poweroftwo *= 2; 71 72 Javan perusteet 2004 12

Esiehtoinen toistorakenne Toistorakennetta suoritetaan niin kauan kun annettu ehto on tosi (true) Mikäli ehto ei ole aluksikaan tosi, ei toistorakennetta suoriteta kertaakaan Jälkiehtoinen toistorakenne do{ /* suoritettava koodi */ while (ehto); Esimerkki: boolean mayexit = false; do{ System.out.println( Syötä luku (1 9) : ); int uservalue = Lue.kluku(); if (uservalue>0 && uservalue<10) mayexit = true; while (!mayexit); 73 74 Jälkiehtoinen toistorakenne Toistorakenne suoritetaan vähintään yhden kerran Seuraavalle suorituskerralle siirrytään, mikäli annettu ehto on tosi for toistorakenne for (alustus;jatkamisehto;lisäyslauseke) { /* suoritettava koodi */ Käyttö järkevää kun toistojen lukumäärä on ennakkoon tiedossa Esimerkki for (int i=0;i<10;i++) { System.out.println( Luku + i); 75 76 for toistorakenne (1) (2) (3) for (int i=0;i<10;i++) { System.out.println( Luku + i); Tuloste 1) suoritetaan yhden kerran 2) suoritetaan joka kierroksella, jos totuusarvo on false, toistorakenteen suoritus päättyy 3) suoritetaan joka kierroksen lopuksi ennen seuraavan kierroksen kohdan (2) tarkastusta Luku 0 Luku 1 Luku 2 Luku 3 Luku 4 Luku 5 Luku 6 Luku 7 Luku 8 Luku 9 break ja continue toistorakenteissa Kaikissa edellä esitellyissä toistorakenteissa voidaan käyttää break ja continue lausekkeita: break lauseke poistuu toistorakenteesta continue lauseke siirtyy suoraan seuraavalle suorituskerralle turhaa käyttöä kannattaa välttää 77 78 Javan perusteet 2004 13

break ja continue esimerkki for (int i=0;i<10;i++) { if (i==5) continue; else if (i==8) break; System.out.println( Kierros + i); Tuloste: Kierros 0 Kierros 1 Kierros 2 Kierros 3 (1) (2) Kierros 4 Kierros 6 Kierros 7 hyppy seuraavalle kierrokselle, mikäli jatkoehto 1 toteutuu, lisäyslauseke 2 suoritetaan kuten normaalisti poistutaan suoraan for lausekkeesta 79 ehtojen asettaminen Kaikissa toistorakenteissa käytetään jotakin ehtoa, joka kertoo milloin suoritus lopetetaan Ehdot kannattaa asettaa mahdollisimman rajaaviksi, esimerkiksi: public void printnumbers(int count) { for (int i=0;i<count;i++) { System.out.println( Luku + i); eii!=count, ikinä Ikuisten toistojen välttäminen em. ohjelmointityylillä on hyvä tapa koska silloin esim. luvulla 1 kutsuttaessa suoritus ei päättyisi 80 Java 2 API Java 2 API Dokumentaatio Paketit Käyttö Java 2 API (Application Programming Interface) tarjoaa runsaasti valmiita luokkia käytettäväksi ohjelmissa Math lukujen käsittely String merkkijono ja sen käsittely StringTokenizer merkkijonon pätkiminen... Luokkien käyttöohjeet löytyvät käytetyn Javaversion API dokumentaatiosta: http://java.sun.com/j2se/1.4.2/docs/api/ 81 82 Paketit Paketilla tarkoitetaan samantyyppisten luokkien muodostamaa kokonaisuutta Luokan (käännösyksikön) paketti määritellään tiedoston alussa: package paketin_nimi; Ellei tiedoston alussa ole package määrettä, class tiedosto asetetaan nimettömään pakkaukseen Luokan kuuluminen alipakettiin ilmaistaan: package paketin_nimi.alipaketti; Paketit Pakettiin kuuluminen tarkoittaa että luokkaa käytettäessä sen edessä on käytettävä pakkauksen nimeä: pakkaus.luokka x = new pakkaus.luokka(); Käytännössä on järkevämpi käyttää aina import lausekkeita // Sallii pakkaus1:n kaikkien luokkien käytön import pakkaus1.*; // Sallii pakkaus1:n luokan Auto käytön import pakkaus1.auto; import lausekkeet kirjoitetaan tiedoston alkuun mahdollisen package määrityksen jälkeen Tiedostosta käy selkeästi ilmi mitä pakkauksia se käyttää 83 84 Javan perusteet 2004 14

Java 2 API Kaikki Java 2 API:n luokat on sijoitettu paketteihin java.lang java.math java.io... Paketti, johon luokka kuuluu selviää APIdokumentaatiosta Kaikkiin tiedostoihin tuodaan automaattisesti Javan pakkaus java.lang. (import java.lang.*;) Metodit Metodin muoto Määreet Staattiset metodit ja attribuutit Arvotyyppi Parametrit Kuormittaminen Rekursio 85 86 Metodit Alialgoritmit (aliohjelmat) toteutetaan metodeissa Metodeilla voi olla parametreja (lähtötiedot) ja se voi palauttaa jonkin arvon Metodien käyttö olioiden luonti (konstruktori) piilossa olevan tiedon kysely ja käyttö (aksessorit) algoritmit pääohjelmametodi public static void main(string[] args) 87 Metodit Muoto määreet arvotyyppi nimi(parametrit) { algoritmi Määreillä ohjataan metodin käyttömahdollisuuksia Arvotyyppi kertoo minkä tyyppisen arvon metodi palauttaa Nimi yksilöi metodin Parametrit ovat metodin muuttujia, jotka metodin kutsuja antaa Algoritmi toteuttaa metodin tehtävän Esimerkki: public static void printstring(final String str) { System.out.println(str); 88 Metodit Muoto Konstruktoreilla ei ole paluuarvoa public Student(String name) {... public Car() {... Konstruktori ei voi olla staattinen (static) Konstruktori voi olla normaalin publicnäkyvyysalueen lisäksi myös private Milloin järkevää käyttää? Metodit Määreet Määreitä ovat Näkyvyysalueet public sallii metodin käytön kaikkialta protected sallii metodin käytön luokalta perityissä luokissa private sallii metodin käytön ainoastaan luokan sisällä Muut abstract metodilla ei ole toteutusta (abstrakti) static metodin kutsumiseen ei tarvita oliota final metodia ei voi ylikirjoittaa perityissä luokissa syncronized metodia suoritetaan monisäikeisessä sovelluksessa yksi kutsu kerrallaan native metodilla ei toteutusta, kutsu esim. C/C++ Kurssilla tarvittavat määreet: public, private, static 89 90 Javan perusteet 2004 15

Metodit Määreet Esimerkkejä määreistä public static void main(string [] args) private int solvesubproblem() public int solveproblem() public void initializeobject() Metodit määreet static Yleensä luokan sisään kirjoitetut metodit käyttävät jotain olion attribuuttia On olemassa kuitenkin myös metodeja, jotka eivät tarvitse olion attribuutteja tai kutsu toisia olion attribuutteja käyttäviä metodeja (esim. Math luokan metodit) Kyseiset metodit eivät näin ollen tarvitse olemassa olevaa oliota suoritukseensa Tällaisia metodeja kutsutaan staattisiksi 91 92 Metodit määreet static Metodi määritellään staattiseksi staticmääreellä: public static double sqrt(double num) static määreellä määriteltyä metodia voidaan kutsua luokan ulkopuolelta ilman olion luontia: double result = Math.sqrt(16); Luokan nimi, jossa metodi on määritelty 93 Staattiset attribuutit Attribuutteja voidaan määrittää myös staattisiksi. Staattinen attribuutti on käytettävissä ilman olion luontia. Staattista attribuuttia voi käyttää kuten normaaliakin luokan attribuuttia. Staattinen attribuutti on sama joka paikassa (vrt. ei staattiset attribuutit, jotka ovat yksilölliset jokaisella luodulla oliolla) 94 Staattiset metodit ja attribuutit Staattiset metodit/attribuutit ovat käyttöalueeltaan rajatumpia kuin eistaattiset Hyvän ohjelmointitavan mukaista on määrittää metodi/attribuutti staattiseksi aina kun se on mahdollista Käytännössä varsinkin staattisten attribuuttien käyttö on harvinaista Staattiset metodit ja attribuutit Esimerkkejä: main metodin on aina oltava staattinen Vakiot määritetään yleensä staattisina: private final static int NUM_COLS = 5; Color luokan määritellyt värit ovat staattisia public final static Color black = new Color(0,0,0); Math luokan kaikki metodit ja attribuutit ovat staattisia 95 96 Javan perusteet 2004 16

Staattiset metodit ja attribuutit Luokan ulkopuolelta: public class TestApp { TestApp.setValues(); public static final int A = 1; public final int B = 2; int i = TestApp.A; private static int C = 3; i = TestApp.B; private int D = 4; i = (new TestApp()).B; (new TestApp()).setValues(); public TestApp() { //OK //OK //Ei sallittu //OK //OK (new TestApp()).setMemberValues(); //OK public static void setvalues() { C = A; // Sallittu, koska A ja C staattisia A = C; // Ei sallittu, koska A on vakio (final) D = C; // Ei sallittu, koska D ei staattinen setmembervalues(); // Ei sallittu, koska ollaan staat. metodissa public void setmembervalues() { C = A; // Sallittu D = C; // Sallittu, koska ei olla staattisessa metodissa setvalues(); // Sallittu 97 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 Metodi voi palauttaa alkeistyypin tai olion Tällöin return X; lauseke on pakollinen. Metodissa ei saa olla suorituspolkuja, joilla returnlausekkeeseen ei päädytä. X on palautettava arvo, joka on arvotyypin tyyppinen. 98 Metodit Arvotyyppi Esimerkki public static String viikonpaiva(int luku) { switch(luku) { case 1: return Ma ; case 2: return Ti ;... return ; Metodit Parametrit Parametrit annetaan sulkeissa Alkeistyypit ovat arvoparametreja Arvon muuttaminen metodin sisällä ei muuta alkuperäistä arvoa Oliot ovat viiteparametreja Saman olion käyttö metodin sisällä muuttaa myös alkuperäistä arvoa 99 100 Metodit Parametrit public static void test(int i, String s, Student r) { i=0; s= Muutettu ; r.setname( Pekka );... // Esimerkkikutsu int j=1; String t = A ; Student u = new Student( B ); test(j, t, u); System.out.println( Tulos: + j + + t + + u.getname()); // Tuloste: Tulos: 1 A Pekka! Metodit Kuormittaminen Samannimisiä metodeja voidaan toteuttaa eri parametreilla Paluuarvojen tulee samannimisillä metodeilla olla aina samat Samannimisten metodien toteuttamista eri parametreilla kutsutaan metodin kuormittamiseksi 101 102 Javan perusteet 2004 17

Metodit Kuormittaminen Esimerkki public void tulosta(final int luku) { System.out.println( luku ); public void tulosta(final String str) { System.out.println( str );... // Kutsuesimerkki tulosta(12); // Käyttää ylemää metodia tulosta( Teksti ); // Käyttää alempaa metodia Metodit Rekursio Jos ohjelmassa on metodi, joka kutsuu sisällään itseään uudestaan, käytetään siitä nimitystä rekursiivinen metodi Rekursiiviset metodit kutsuvat itseään eri parametreilla Parametrien perusteella metodi kutsuu itseään tai mikäli ollaan päästy perustapaukseen ei kutsua enää suoriteta 103 104 Metodit Rekursio Rekursiossa jokaisella kutsulla lähestytään aina jotakin perustapausta Rekursio on perinteisissä proseduraalisissa ja olio ohjelmointikielissä hidasta Teoriassa kaikki rekursiiviset metodit voidaan purkaa auki iteratiivisiksi versioiksi Rekursiota rajoittaa suurissa tapauksissa käytössä oleva muistin määrä Metodit Rekursio Fibonaccin luvut Fibonaccin lukuja ovat: 0, 1, 1, 2, 3, 5, 8, 13,... Ensimmäinen luku on 0, toinen luku 1 ja siitä eteenpäin seuraava luku saadaan aina kahden edellisen summana Fibonnaccin lukuja voidaan laskea rekursiivista metodia hyväksikäyttäen Huomattavasti tehokkaampiakin menetelmiä on olemassa 105 106 Metodit Rekursio Fibonaccin luvut // Palauttaa n:nnen Fibonaccin luvun public int fib(int n) { if (n==1) return 0; else if (n==2) return 1; else return fib(n 1) + fib(n 2); Esim: fib(4) 2 fib(4) 1 fib(3) 1 1 fib(2) fib(2) 0 fib(1) 107 Näkyvyysalueet ja muuttujien elinaika private, public paikalliset muuttujat 108 Javan perusteet 2004 18

Näkyvyysalueen valinta Ohjelmissa kannattaa aina valita mahdollisimman pieni näkyvyysalue jokaiselle muuttujalle ja metodille Kaikki luokan attribuutit kannattaa sijoittaa privatenäkyvyysalueeseen Luokan yleiseen käyttöön tarkoitetut metodit sijoitetaan public näkyvyysalueeseen, kaikki muut private näkyvyysalueeseen Lisäksi on olemassa protected näkyvyysalue, joka on ikään kuin public:n ja private:n välimaastossa oleva. Käyttö on tarpeellista lähinnä kun hyödynnetään perintää. Paikallinen muuttuja vai luokan attribuutti Muuttujat sijoitetaan aina pienimpään mahdolliseen käyttöalueeseensa. Mikäli muuttujan käyttö on tarpeellista monissa luokan metodeissa tai se kuvaa olion tilaa, tehdään siitä attribuutti. Mikäli käyttö on tarpeellista vain yksittäisessä metodissa, käytetään paikallista muuttujaa. 109 110 Paikallisen muuttujan määrittely esimerkki Paikallinenkin muuttuja kannattaa sijoittaa aina mahdollisimman rajattuun alueeseen. Esimerkki: public void printmembers() { Vector members = getallmembers(); for (int i=0;i<members.size();i++) { Member member = members.getat(i); String name = member.getname(); System.out.println( Jäsen: + name); Muuttujien esittelyt voitaisiin sijoittaa katkoviivalla osoitettuun paikkaan, mutta koska niitä ei käytetä kuin toistorakenteen sisällä, on ne sijoitettu toiston sisältämän lohkon sisään. 111 Muuttujien elinaika Jokaisella muuttujalla on näkyvyysalueen lisäksi ns. elinaika, jolloin se on olemassa Luokkamuuttujat on olemassa aina kun olion konstruktoria on kutsuttu, olemassaolo loppuu kun olioon ei ole enää yhtään viitettä Paikalliset muuttujat ovat olemassa lohkonsa sisällä. Kun lohko päättyy, paikallisen muuttujan elinaika päättyy. 112 Taulukot Taulukot Taulukoiden määrittely, käsittely ja kopiointi Vaihtoehdot taulukoille Usein on tarvetta käsitellä ryhmää samantyyppisiä olioita tai perustietotyyppejä On raskasta ja virhealtista kirjoittaa esimerkiksi kymmeniä samantyyppisiä muuttujia peräkkäin ja suorittaa niille kaikille samaa operaatiota Apua tuovat taulukot, joissa yhteen muuttujaan pystytään sijoittamaan useita olioita 113 114 Javan perusteet 2004 19

Yksiulotteinen taulukko Yksiulotteinen merkkijonotaulukko esitellään ja luodaan: String[] names = new String[4]; Rivi varaa tilan neljälle String tyyppiselle oliolle. Se jättää kuitenkin kaikki oliot nullarvoiksi. Mikäli taulukko on luotu jostakin perustietotyypistä, ovat taulukon indeksit suoraan käytössä (ei tarvitse new:llä luoda joka paikkaan oliota) Yksiulotteinen oliotaulukko Oliotaulukon sisältö olisi luonnin jälkeen: 0 null 1 null 2 null 3 null Taulukon yksittäiseen olioon voidaan viitata []:n avulla: names[0] = new String( Pekka ); Edellinen rivi luo taulukon ensimmäiseen paikkaan uuden merkkijono olion Taulukon indeksointi alkaa aina nollasta. 115 116 Yksiulotteinen taulukko Yksiulotteisen taulukon kokoa voidaan muuttaa vain luomalla uusi taulukko. Taulukon kokoon saa length:llä: int size = names.length; Taulukon sallittuja sijoitus ja lukupaikkoja ovat [0..length 1]. Mikäli yritetään käyttää muita paikkoja, heittää Java ajonaikaisen virheen. Yksiulotteinen oliotaulukko Käytettäessä String luokkaa, voidaan kirjoittaa hieman lyhyemmin: names[0] = Pekka ; koska Java luo automaattisesti :lla erotetusta merkkijonosta uuden Stringolion 117 118 Taulukon alustaminen Taulukkoon voidaan sijoittaa arvoja luonnin yhteydessä: final int[] daysinmonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; Yksiulotteinen taulukko esimerkki String[] students = new String[3]; students[0] = new String( Matti ); students[1] = new String( Maija ); students[2] = new String( Antti ); for (int i=0;i<students.length;i++) { System.out.println(students[i]); 119 120 Javan perusteet 2004 20