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 2002 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 Maitopurkki Tomaatti Omena File Timestamp Duration User Olio-ohjelmointikieliä: Java, C++, Oberon 2, Smalltalk, Eiffel Java puhdas olio-ohjelmointikieli Ohjelmistokehittäjä rakentaa tarvittavat luokat vaatimusten ja suunnitelmien perusteella 11 12 Javan perusteet 2002 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 15 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() 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 2002 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 2002 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 2002 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 2002 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 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 2002 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 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 2002 8
= new Pencil(); = new Pencil(); 49 50 = new Pencil(); = new Pencil(); 51 52 = new Pencil(); = new Pencil(); 53 54 Javan perusteet 2002 9
= new Pencil(); 55 Javan perusteet 2002 10