1.75k likes | 1.93k Views
Javan perusteet 2004. 1,5 ov Kuopion yliopisto, tietojenkäsittelytieteen laitos Ohjelmistotekniikan maisterikoulutus, Varkaus Tomi Keinonen tkeinone@cs.uku.fi. Kurssin suoritus. Luennot 18 h Harjoitukset 4 krt Lopputentti tai harjoitustyö Harjoituksista jaettavat hyvityspisteet
E N D
Javan perusteet 2004 1,5 ov Kuopion yliopisto, tietojenkäsittelytieteen laitos Ohjelmistotekniikan maisterikoulutus, Varkaus Tomi Keinonen tkeinone@cs.uku.fi
Kurssin suoritus • 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
Kurssimateriaali • Verkkosivut http://www.cs.uku.fi/~tkeinone/java2004/ • Kurssi pohjautuu kirjaan Morelli, Ralph: Java, Java, Java! : Object-Oriented Problem Solving1. 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
Kurssin aikataulu To 7.10.2004 16:45-19:45 Luennot 1-4 B231 La 23.10.2004 9:00-10:30 Harjoitukset 1 C1004TK 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ä B231) (To 9.12.2004 16:45-19:45 Tentti Jompi kumpi,sovitaan kurssilla (Harjoitustyön palautus sähköpostitse pe 10.12. klo 18 mennessä) Ke 15.12.2004 16:45-18:15 Luennot 17-18 B231
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ä
Kurssin sisältö Java-kieli Tiedostot Luokat jaoliot Poikkeukset Metodit Java 2 Platform,Standard Edition 1.4.2 J2SE API Aritmetiikka Rekursio Ehdotja toisto Taulukot
Java • JAVA:sta on useita eri versioita erilaisiin käyttötarkoituksiin • 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. StandardEdition (SE) EnterpriseEdition (EE) MobileEdition (ME)
Ympäristö • Ei käyttöjärjestelmäriippuvuutta • Sunin J2SE SDK, versio 1.4.2http://java.sun.com/ • Lähdekoodi suositellaan kirjoitettavaksi jollakin tekstieditorilla:http://www.jcreator.com/ (ilmainen LE)
Oliot ja luokat Olio on luokan ilmentymä, jolla on tila ja käyttäytyminen. Luokan ja olion erot? UML-luokkakaavio.
Oliot ja luokat • 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
Oliot ja luokat Jääkaappi Omena Timestamp Maitopurkki Duration Tomaatti File User
Oliot ohjelmissa • Olio-ohjelmointikieliä: Java, C++, Oberon 2, Smalltalk, Eiffel • Java puhdas olio-ohjelmointikieli • Ohjelmistokehittäjä rakentaa tarvittavat luokat vaatimusten ja suunnitelmien perusteella
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)
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 Luokan ja olion erot
Director SimpleWindow window GrayCircle circle «constructor» Director() UML-luokkakaavio • Universal Modeling Language • Luokasta kuvataan • Nimi • Attribuutit • Metodit • Yleisesti käytetty standardisoitu kuvaustapa • Kommentteja voidaan laittaa « » -merkkien väliin
DrawingTool «constructor» DrawingTool() «update» void moveForward() void turnClockwise() void dontDraw() void draw() Metodikutsut • Metodikutsut olio.metodi(); Esimerkkejä pen.moveForward(); pen.turnClockwise(); pen.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;
Nimeämiskäytännöt Java-kielessä • 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/
Ensimmäinen Java-ohjelma Lähdekoodista ohjelmaksi Ensimmäinen ohjelma
Lähdekoodista ohjelmaksi 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. Tekstieditori 1 Lähdekoodi (*.java) 2 Kääntäjä 3 Tavukoodi (*.class) 4 Virtuaalikone (JRE) 5
Lähdekoodista ohjelmaksi 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 .class-päätteisen tavukooditiedoston jokaisesta lähdekooditiedostosta. • Ohjelmoija ei muokkaa tavukoodia, vaan muutokset tehdään aina lähdekoodiin. Tekstieditori 1 Lähdekoodi (*.java) 2 Kääntäjä 3 Tavukoodi (*.class) 4 Virtuaalikone (JRE) 5
Lähdekoodista ohjelmaksi Tavukoodin suorittaminen • Tavukoodia ei ole konekieltä eli sitä ei voida suorittaa suoraan prosessorilla. Suorittamiseen käytetään Java-virtuaalikonetta (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. Tekstieditori 1 Lähdekoodi (*.java) 2 Kääntäjä 3 Tavukoodi (*.class) 4 Virtuaalikone (JRE) 5
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 ...
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
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
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) Perustietotyypit
Tietotyyppien kokojärjestys byte char short int long float double
Kokonaislukutyypin int operaattorit Prefix-operaattorit (int->int) - vastaluku ++ lisäys -- vähennys Postfix-operaattorit (int->int) ++ lisäys -- vähennys Rajoituksia • ++ ja -- (prefix ja postfix) operaattoreita ei voida kohdistaa vakioille Aritmeettiset oper. (int*int->int) + yhteenlasku - vähennyslasku * kertolasku / jakolasku (kokonaisosa) % jakoläännös (modulo) 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); Vertailulauseet (int*int->boolean) == yhtäsuuruus != erisuuruus < pienempi <= pienempi tai yhtäsuuri > suurempi >= suurempi tai yhtäsuuri
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
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 • …
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
Student String m_name int m_age int m_creditCount Student() Student(String name) void setName(String name) void setAge(int age) void setCreditCount(int creditCount) Esimerkkiluokan UML-kaavio
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) { … } }
Konstruktorit • Konstruktoria kutsutaan luotaessa uusi olio Student stu1 = new Student(); Student stu2 = new Student(”Pekka”);
Student String m_name int m_age int m_creditCount Student() Student(String name) void setName(String name) void setAge(int age) void setCreditCount(int creditCount) Metodit • Konstruktorin lisäksi luokalla on yleensä myös muita metodeja • Metodeilla voi myös olla parametreja
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(); ... }
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);
Metodien paluuarvot • Metodin paluuarvo palautetaan return-lauseella 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)
Olioiden luonti ja sijoittaminen • Oliota ei ole olemassa ennen sen luontia muuttuja = new Olio(); • Esimerkki DrawingTool pen; pen = new DrawingTool(); pen.moveForward();
Muuttujat, oliot ja roskienkeruu • Kun muuttua esitellään ensimmäisen kerran, se ei osoita mihinkään olioon vaan null-arvoon • 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
myPen ( null) suoritus- kohta missingPen ( null) borrowedPen ( null) Muuttujat, oliot ja roskienkeruu myPen = new Pencil(); myPen = null; borrowedPen = new Pencil(); missingPen = borrowedPen; missingPen = myPen; borrowedPen = new Pencil();
myPen : Pencil suoritus- kohta m_color = = ? m_width = = ? Muuttujat, oliot ja roskienkeruu myPen myPen = new Pencil(); myPen = null; borrowedPen = new Pencil(); missingPen = borrowedPen; missingPen = myPen; borrowedPen = new Pencil(); missingPen ( null) borrowedPen ( null)