1
Javan perusteet 2004
1,5 ovKuopion yliopisto, tietojenkäsittelytieteen laitosOhjelmistotekniikan maisterikoulutus, Varkaus
Tomi [email protected]
2
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
3
Kurssimateriaali
Verkkosivuthttp://www.cs.uku.fi/~tkeinone/java2004/
Kurssi pohjautuu kirjaanMorelli, Ralph: Java, Java, Java! : Object-Oriented Problem Solving1. painos: 2000, ISBN 0-13-011332-82. painos: 2002, ISBN 0-13-033370-0
Kurssikirjan hankinta ei välttämätöntä, mutta varsin suotavaa
4
Kurssin aikataulu
7.10.2004 16:45-19:45 Luennot 1-4
23.10.2004 9:00-10:30 Harjoitukset 1
B231
C1004TK
To
La
23.10.2004 11:00-14:00 Luennot 5-8 B231La
Harjoitustehtävien 2 palautus sähköpostitse ma 8.11. klo 18 mennessä
9.11.2004 16:45-19:45 Luennot 9-12 B231Ti
Harjoitustehtävien 3 palautus sähköpostitse ti 23.11. klo 18 mennessä
24.11.2004 16:45-19:45 Luennot 13-16 B231Ke
Harjoitustehtävien 4 palautus sähköpostitse ke 8.12. klo 18 mennessä
9.12.2004 16:45-19:45 Tentti B231)(To
15.12.2004 16:45-18:15 Luennot 17-18 B231Ke
(Harjoitustyön palautus sähköpostitse pe 10.12. klo 18 mennessä)
Jompi kumpi,sovitaan kurssilla
5
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ä
6
Kurssin sisältö
Java-kieli Luokat ja
oliot
Ehdotja toisto
Aritmetiikka
Taulukot
Metodit
Rekursio
J2SE API
Poikkeukset
Tiedostot
Java 2 Platform,Standard Edition 1.4.2
7
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)
8
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)
9
Oliot ja luokat
Olio on luokan ilmentymä, jolla on tila ja käyttäytyminen.
Luokan ja olion erot?UML-luokkakaavio.
10
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
11
Oliot ja luokat
Maitopurkki
Jääkaappi
Tomaatti
Omena
File
Timestamp
Duration
User
12
Oliot ohjelmissa
Olio-ohjelmointikieliä: Java, C++, Oberon 2, Smalltalk, Eiffel
Java puhdas olio-ohjelmointikieli Ohjelmistokehittäjä rakentaa
tarvittavat luokat vaatimusten ja suunnitelmien perusteella
13
Olio-ohjelmointi - periaatteita Hajoita ja hallitse Kapselointi Rajapinnat Tiedon piilottaminen Yleiskäyttöisyys Laajennettavuus
14
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)
15
Luokan ja olion erotLuokka 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
16
UML-luokkakaavio Universal Modeling
Language Luokasta kuvataan
Nimi Attribuutit Metodit
Yleisesti käytetty standardisoitu kuvaustapa
Kommentteja voidaan laittaa « » -merkkien väliin
DirectorSimpleWindow window
GrayCircle circle
«constructor»
Director()
17
Metodikutsut Metodikutsut
olio.metodi();
Esimerkkejäpen.moveForward();
pen.turnClockwise();
pen.draw();
DrawingTool
«constructor» DrawingTool()
«update» void moveForward() void turnClockwise() void dontDraw() void draw()
18
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;
19
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ää
20
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/
21
Ensimmäinen Java-ohjelma
Lähdekoodista ohjelmaksiEnsimmäinen ohjelma
22
Lähdekoodista ohjelmaksi
Tekstieditori
Kääntäjä
Virtuaalikone(JRE)
Lähdekoodi(*.java)
Tavukoodi(*.class)
1
2
3
4
5
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.
23
Lähdekoodista ohjelmaksi
Tekstieditori
Kääntäjä
Virtuaalikone(JRE)
Lähdekoodi(*.java)
Tavukoodi(*.class)
1
2
3
4
5
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.
24
Lähdekoodista ohjelmaksi
Tekstieditori
Kääntäjä
Virtuaalikone(JRE)
Lähdekoodi(*.java)
Tavukoodi(*.class)
1
2
3
4
5
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.
25
Ensimmäinen ohjelmapublic class HelloWorld {
public static void main(String[] args) {System.out.println("Hello World!");
}
}
26
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 ...
27
Kommentit Kommentteja voi koodiin laittaa
kahdella tavalla:// yksirivinen kommentti
/*
Monirivinen
kommentti
*/
Sopivat kommentit selkeyttävät koodia
28
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
29
Perustietotyypit ja aritmetiikka
Kokonaislukutyypit, reaalilukutyypit, kirjaimetPerustietotyyppien ja olioiden erot
Aritmeettiset lausekkeet ja niiden sisäinen suoritusjärjestys
Muunnokset perustietotyypistä toiseenMerkkijono
Math-luokan tarjoamat palvelutVakiot
30
PerustietotyypitKokonaislukutyypit 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)
31
Tietotyyppien kokojärjestys
byte
short
int
long
float
double
char
Kokonaislukutyypin int operaattoritPrefix-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)
Vertailulauseet (int*int->boolean)== yhtäsuuruus!= erisuuruus< pienempi<= pienempi tai yhtäsuuri> suurempi>= suurempi tai yhtäsuuri
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+ba-=b a=a-ba*=b a=a*ba/=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
34
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
35
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
36
Math-luokan metodeja Math.abs itseisarvo Math.pow potenssi Math.round pyöristys Math.sqrt neliöjuuri Math.random satunnaisluku
0.0-1.0 …
37
Vakiot Vakioita voi määrittää final-
määreellä Vakiomuuttujan arvoa ei voi
muuttaa Esimerkkejä:
final double Math.PI = 3.141592…final int count = 11;
38
Oliot ja luokat
Luokkien tekoKonstruktorit
MetoditMuuttujat, oliot ja roskienkeruu
39
Esimerkkiluokan UML-kaavio
Student
int m_creditCount
String m_nameint m_age
Student()Student(String name)void setName(String name)void setAge(int age)void setCreditCount(int creditCount)
40
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) { … }
}
41
Konstruktorit Konstruktoria kutsutaan luotaessa uusi
olio
Student stu1 = new Student();
Student stu2 = new Student(”Pekka”);
42
Metodit
Konstruktorin lisäksi luokalla on yleensä myös muita metodeja
Metodeilla voi myös olla parametreja
Student
int m_creditCount
String m_nameint m_age
Student()Student(String name)void setName(String name)void setAge(int age)void setCreditCount(int creditCount)
43
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(); ... }
44
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);
45
Metodien paluuarvot Metodin paluuarvo palautetaan
return-lauseella
public String getName() {
return m_name;
}
46
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)
47
Olioiden luonti ja sijoittaminen Oliota ei ole olemassa ennen sen
luontiamuuttuja = new Olio();
EsimerkkiDrawingTool pen;
pen = new DrawingTool();
pen.moveForward();
48
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 senDrawingTool pen; // pen osoittaa null-arvoonpen = new DrawingTool();// pen osoittaa luotuun olioonpen = null;// luotuun DrawingTool-olioon ei osoita enää// yksikään muuttuja -> se tuhotaan
49
myPen = new Pencil();myPen = null;borrowedPen = new Pencil();missingPen = borrowedPen;missingPen = myPen;borrowedPen = new Pencil();
suoritus-kohta
myPen
missingPen
borrowedPen
( null )
( null )
( null )
Muuttujat, oliot ja roskienkeruu
50
suoritus-kohta
myPen : Pencil
m_color = = ?m_width = = ?
Muuttujat, oliot ja roskienkeruu
myPen = new Pencil();myPen = null;borrowedPen = new Pencil();missingPen = borrowedPen;missingPen = myPen;borrowedPen = new Pencil();
myPen
missingPen
borrowedPen
( null )
( null )
51
suoritus-kohta
Muuttujat, oliot ja roskienkeruu
myPen = new Pencil();myPen = null;borrowedPen = new Pencil();missingPen = borrowedPen;missingPen = myPen;borrowedPen = new Pencil();
: Pencil
m_color = = ?m_width = = ?
myPen
missingPen
borrowedPen
( null )
( null )
( null )
52
suoritus-kohta
Muuttujat, oliot ja roskienkeruu
myPen = new Pencil();myPen = null;borrowedPen = new Pencil();missingPen = borrowedPen;missingPen = myPen;borrowedPen = new Pencil();
: Pencil
m_color = = ?m_width = = ?
myPen
missingPen
borrowedPen
( null )
( null )
borrowedPen : Pencil
m_color = = ?m_width = = ?
53
suoritus-kohta
Muuttujat, oliot ja roskienkeruu
myPen = new Pencil();myPen = null;borrowedPen = new Pencil();missingPen = borrowedPen;missingPen = myPen;borrowedPen = new Pencil();
: Pencil
m_color = = ?m_width = = ?
myPen
missingPen
borrowedPen
( null )
borrowedPen : Pencil
m_color = = ?m_width = = ?
54
suoritus-kohta
Muuttujat, oliot ja roskienkeruu
myPen = new Pencil();myPen = null;borrowedPen = new Pencil();missingPen = borrowedPen;missingPen = myPen;borrowedPen = new Pencil();
: Pencil
m_color = = ?m_width = = ?
myPen
missingPen
borrowedPen
( null )
( null )
borrowedPen : Pencil
m_color = = ?m_width = = ?
55
suoritus-kohta
Muuttujat, oliot ja roskienkeruu
myPen = new Pencil();myPen = null;borrowedPen = new Pencil();missingPen = borrowedPen;missingPen = myPen;borrowedPen = new Pencil();
: Pencil
m_color = = ?m_width = = ?
myPen
missingPen
borrowedPen
( null )
( null )
: Pencil
m_color = = ?m_width = = ?
borrowedPen : Pencil
m_color = = ?m_width = = ?