olio v12 2014 - students.tut.fisaari5/pla_32100_2015/esimerkit/olio.pdf · 3 kurssin suoritus •...

159
[email protected] 1 PLA-32100 OLIO-OHJELMOINTI Object programming versio: 15.1.2015

Upload: vuquynh

Post on 19-Oct-2018

230 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

[email protected] 1

PLA-32100

OLIO-OHJELMOINTIObject programming

versio: 15.1.2015

Page 2: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

3

Kurssin suoritus

• Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä. Eli kurssin maksimipistemäärä on 30. Arvosana määräytyy oheisen taulukon mukaan.

• Tenttiohjelman arviointikriteerit ovat: toimii 2, tekee annetun tehtävän 3, ratkaisutapa 3 ja luettavuus 2.

• Harjoituksia on 20 ja niillä on eräpäivät. Opiskelija lähettää harjoitusten vastaukset sähköpostin liitteenä osoitteeseen [email protected].

• Harjoitus- ja tenttipisteet huomioidaan vain vuoden 2015 aikana.

• Kurssista on kaksi uusintatenttiä (5.6 ja 11.9), joilla voi korottaa heikoimman tentin arvosanaa.

• Luentoesitys ja luennolla rakennetut ohjelmat löytyvät osoitteesta www.students.tut.fi/~saari5/PLA_32100_2015/esimerkit

• Harjoitusten mallivastaukset löytyvät osoitteesta www.students.tut.fi/~saari5/PLA_32100_2015/ratkaisut/ eräpäivän jälkeen.

• Kurssimateriaalina käytetään kirjaa Vesterholm-Kyppö: Java-ohjelmointi (joka oletetaan opiskelijalla olevan käytettävissään)

27 5

24 4

21 3

18 2

15 1

<15 0

PISTEET ARVOSANA

[email protected]

Page 3: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

4

Kurssin kirjoja

• Mika Vesterholm, Jorma Kyppö: Java-ohjelmointi, Talentum 2008

• Simo Silander, Vesa Ollikainen, Juha Peltomäki, : Java, Docendo 2010

• Kai Koskimies: Oliokirja

Verkkoaineistot• The Java™ Tutorials

– http://docs.oracle.com/javase/tutorial/index.html

[email protected]

Page 4: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Kurssin sisältö

• Javan oliomallin perusominaisuudet 3 luentoa 3-5 viikot• Graafinen käyttöliittymä 2 6-7• Poikkeusten käsittely 1 8• Tiedostot 1 11• (Oliosuunnittelu: UML 0)• Tietokantaliittymä 2 12-13• (Säikeet 0)• (Geneerisyys 0)• Dokumentointi, versionhallinta 1 14• Kertaus 2 16-17• JPA• Oliokannat• Muut olioparadigmat

[email protected]

Page 5: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

6

Miksi luokkia?

PERUSOMINAISUUDET

• Kapselointi

• Periyttäminen

• Monimuotoisuus

EDUT

• Suurten ohjelmistojen rakentaminen (mallintaminen, työnjako, koodin ryhmittely )

• Koodin uudelleenkäyttö (luokkahierarkia, rajapinta, geneerisyys, oliot)

• Muutosten rajaaminen (projektit, paketit, luokat)

[email protected]

Page 6: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Miksa 7

Luokkatyyppejä

• Sovellusluokat• Tekniset luokat

• Konkreettinen luokka• Abstrakti luokka• Ilmiö luokka

• Suoritettava luokka• Luokkakirjasto

MITEN LÖYDÄN LUOKAT?Toimintakuvauksen substantiivit ja

tapahtumat, joista talletetaan tietoa.

Page 7: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Olion data

Olion metodit

8

Luokka ja olio

class Asiakas {static int kpl;String nimi;

static int montako( ) {

return kpl;}

String annaNimi() {return nimi;

}

}

LuokkaLuokka

Olion data

Olion metodit

Luokan data

Luokan metodit

Olion data

Olion metodit

Oliot

new-lauseella

luodaan olioita

[email protected]

Page 8: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

ROCK

Rekisteröinti

9

Opiskelija

Suoritus

KAPSELOI

publicprivate

jäsenmaksu

op

opno

annaNro

lisääOp

tarkista

päivitä kirjaaTentti

uusiOpiskelija

tieto ja toiminta

private

[email protected]

Page 9: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Sovellus

Koodin sijoittelu

Make 10

Projekti

Pakkaus

(hakemisto)

Käännösyksikkö (tiedosto)

Luokka

Metodi

Page 10: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 11

Koodin sijainti

public class Opiskelija {

// Dataa mutta ei koodia

public void annaNro() {

… // Dataa ja koodia

}

public static int main() {

}

}

class Opiskelija {

public void annaNro() {

}

}

public class Opettaja {

public void tarkastaTentti() {

}

}

package hakemistopolku

public class Opiskelija {

public void annaNro() {

….

}

}

package hakemistopolku

public class Opettaja {

public void tarkastaTentti() {

}

}

Käännösyksikkö (tiedosto)metodi ja luokka

pakkaus (hakemisto)

projekti

Page 11: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 12

Käännösyksikkö (compilation unit)

• Käännösyksikössä (java-tiedostossa) on vain yksi public-luokka, jonka nimi on tiedoston nimi

• Käännösyksikön (java-tiedosto) kukin luokka kääntyy omaksi class-loppuiseksi tiedostokseen

• Käännösyksikön alussa package-määre ilmoittaa, mihin projektin koodihakemiston (src) alihakemistoon kooditiedostot tallennetaan

• Käännösyksikön käännetyt tiedostot (class-loppuiset) tallentuvat annetun hakemiston (bin) package-määreen mukaiseen alihakemistoon

• Jos ei package-määrettä, tiedostot tallennetaan nyky- eli oletushakemistoon (default package)

• Jotkin editorit saattavat vaatia class-tiedoston lisäksi java-loppuisen tiedoston olemassaolon

Page 12: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 13

Pakkaus (package)

• ”A package is a collection of related classes and interfaces providing access protection and namespace management.”

• Pakkaukset muodostavat hierarkkisen rakenteen (hakemistohierarkia)

• Pakkaukset otetaan käyttöön käännösyksikön alussa olevilla import-lauseilla

• Import lauseessa hierarkkisesti määritetään pakkaushakemiston taso

• Alipakkaukset tarvitsee tuoda omalla import-lauseellaan

• Pakkauksesta voi ottaa nimetyn luokan tai kaikki luokat (*)

• Pakkauksessa ei saa olla saman nimisiä luokkia

• Luokkaa haetaan import- tai oletuspakkauksista

• Pakkausta haetaan CLASSPATH-poluista

• Koodi tallennetaan lähdekoodihakemiston package-määreen nimiseen alihakemistoon (pakkaukseen)

• Oletuspakkauksia ovat käännösyksikön pakkaus ja java.lang-pakkaus (String ja System luokat), jotka eivät tarvitse import-lausetta

• Oletuspaketista voidaan viitata toiseen oletuspakettiin ilman import- lausetta! (classpath-polku oltava kunnossa.)

Page 13: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 14

Esimerkki: koodin sijainti

package pori.tty;

import java.swing.*; import java.util.Arrays;import omat.jutut.*; //classpath:sta eteenpäin

class Opiskelija {….

}

public class Ryhma { //yksi public luokka tiedostossa…}

Ryhma.java

Page 14: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 15

Luokasta olioitapublic class Opiskelija {

private String opno; // luokkamuuttujia

private String nimi; // alustettuja

public void annaNro() { // olio on tietue jos ei metodeita

}

}

public class Luokka { public static void main(String[ ] args) {

Opiskelija uusi = new Opiskelija();uusi.annaNro();uusi.nimi=”Timo Teekkari”; // Virhe: ei suoraan ominaisuuteen

… }}

Page 15: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 16

Luentoharjoitus 1

Laadi Pankkitili-luokka.

Luokassa on otto- ja pano-metodit.

Kansion toisessa tiedostossa on main-metodi, joka antaa käyttäjän valita toiminnon ja sen perusteella kutsuu pankkitili-luokan metodeja.

Täydennä pankkitililuokkaa sisäänkirjoittautumis- sekä uloskirjautumismetodilla. Jos käyttäjä ei osaa antaa oikeaa salasanaa ei otto- eikä pano-metodit toimi.

Luokkien välinen kutsu ja luokkatason data

Page 16: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 17

PERIYTÄ

• Yläluokat kuvaavat yleisiä käsitteitä, joissa kuvataan perustiedot ja yleiset toiminnot

• Yläluokista periytetään aliluokkia (johdettuja luokkia), jotka perivät yläluokan tiedot ja toiminnot

• Aliluokka voi– lisätä uusia tietoja ja toimintoja (tarkentaa yläluokkaa)– korvata yläluokan tietoja ja toimintoja (kuormittaminen)– kehittää yläluokan palveluja (nostaa abstraktiotasoa)

• Näin muodostuu luokkien hierarkia (vrt. käsitehierarkia), joka helpottaa ohjelmien muuttamista ja säästytään samojen asioiden moninkertaiselta koodaamiselta

• Luokat, metodit ja tiedot ovat virtuaalisia eli periytyvät, mikäli ei erikseen estetä (final, private)

• Ei moniperiytyvyyttä, mutta voi toteuttaa useita rajapintaluokkia

luokkahierarkiassa

Page 17: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 18

Matti Oja

196054muuta()

LuokkahierarkiaesimerkkiOpiskelija nimi

nromuuta()

Amk Akateeminen

maksa()

Pia Mäki

1234muuta()

Kari Elo

1399muuta()

suunnitelma() suunnitelma()

maksettu

Luokka

Olio

valmistumisvuosi

2013 2012

suunnitelma()

Page 18: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 19

Muuttujan näkyvyysmääreet

private4 protected ei mitään public

Sama luokka kyllä kyllä kyllä kyllä

Luokan jälkeläinen ei kyllä1 ei3 kyllä

Pakkauksen luokissa ei ei2 kyllä kyllä

Kaikkialla ei ei ei kyllä

Näkyvyysmääre

Näkyvyys-alue

1. Viitteen oltava viittaavan luokan tyyppiä2. Virheellisesti näkyy pakkauksessa3. Näkyy samassa pakkauksessa4. Private muuttujaan saantimetodit (set/get, accessor)

Page 19: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 20

Muuttujan näkyvyys

public class Opiskelija { // alustuu automaatt.

public double keskiarvo(int kpl) {// ei alkuarvoa

} }

maailma

pakkaus

luokka

public String nimi; // kaikkialla

private String opno; // luokassa

static final int TUTKINTO=180;// luokan olioista

String ohjelma=”Tite”; // hakemistossa

protected int aloitusvuosi;// aliluokissa

double ovt = 0; // metodissa

for(int i=0; i<kpl; i++) // lohkossa

ovt += nro[i];return ovt

aliluokka

olio

metodi

lohko

Page 20: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 21

Metodin näkyvyys

public class Akateeminen extends Opiskelija {

static int nro() {

… // käyttää staattisia muuttujia ja metodeita

}

public String nimi() {

}

private boolean opintotuki( ) {

}

protected void maksu() {

}

} // jos ei määrettä, näkyy pakkauksessa

Page 21: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

22

Luokan näkyvyys

• public luokka // käytettävissä ulkopuolelta

• ei määrettä // käytettävissä paketissa

• final luokka // ei aliluokkia

• abstract luokka // osa/kaikki implementoinnit aliluokissa

• interface luokka // (rajapinta, liittymä)

// kaikki implementoinnit toteuttavassa // luokassa

Page 22: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Miksa 23

Kuormittaminen, korvaaminen, peittäminen

Kenttä tai metodi voidaan peittää luokkahierarkian alimmilta tasoilta määrittelemällä se private-tyyppiseksi

Aliluokassa metodi voidaan korvata samannimisellä metodilla kunhan sekä paluuarvo että parametrit täsmäävät

Samassa luokassa metodi voidaan (yli)kuormittaa samannimisellä metodilla kunhan vain parametrit ovat määrältään tai tyypiltään erilaiset

Page 23: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 24

Esimerkki: näkyvyydetclass Koululainen {

double summa, keskiarvo;int kpl;String opiskelijatunnus = "Olli Oppivainen";

public void arvosana(double numero){summa += numero;kpl++;keskiarvo = summa/kpl;

}}

class Perusopiskelija extends Koululainen {int opiskelijatunnus;double opintopisteet;

public void kirjaus () {++opiskelijatunnus;

}public void suoritus (double viikot) {

opintopisteet += 1.5*viikot;}public void suoritus (int pisteet){

opintopisteet += pisteet;}

}

class Jatko_opiskelija extends Perusopiskelija {public void tulosta () {

System.out.println (opiskelijatunnus);System.out.println (opintopisteet);System.out.println (keskiarvo);

}public void suoritus (double ov) {

opintopisteet += 1.2*ov;}

}

Metodi ”suoritus” kuormitettu ja korvattu.

Muuttuja opiskelijatunnus peitetty.

Mitä tulostuu?

Mikä toteutuksessa huonoa? (korjataan harjoituksessa 2)

public class Opiskelijasovellus {public static void main (String[] args) {

Jatko_opiskelija opp = new Jatko_opiskelija();

opp.kirjaus();opp.arvosana(3.5);opp.suoritus(2.5);opp.arvosana(4);opp.suoritus(3);opp.tulosta();

}}

Page 24: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 25

Kirjasto

Luokassa• final luokka // estää aliluokat• private konstruktori // estää olion luonnin• public metodeja // tarjottavat palvelut• static metodit // ei tarvita kopioita• static muuttujat // ei tarvita kopioita

Page 25: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 26

KONSTRUKTORI

• Konstruktori (rakentaja) on luokan metodi, joka halutaan suorittaa olion synnyn yhteydessä (tarkkaan ottaen konstruktori ei ole luokan metodi, koska ei periydy)

• Konstruktorikoodilla on sama nimi kuin luokalla • Konstruktorilla ei ole paluuarvoa• Oletuskonstruktori

– Luodaan automaattisesti– Ei tee mitään– Parametriton– Ei yleensä tarvitse kirjoittaa– Tarvitsee kirjoittaa jos kirjoitetaan omakin konstruktori– Esim. Opiskelija(){ }

• Javassa ei ole destruktoria (roskien keruu finalize)

Page 26: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 27

Konstruktoriesimerkki

public class Opiskelija{private String opno; // luokkamuuttujiaprivate double ov;

public Opiskelija(String opno, double hyvitys) {this.opno=opno;ov=hyvitys;

}}

public class Luokka { public static void main(String[ ] args) {

Opiskelija uusi = new Opiskelija(”178123”, 60); …

}}

Page 27: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 28

this, super, this(), super()

• this-sanalla viitataan olioon, jonka sisällä ollaan• this viittaa myös luokan toiseen konstruktoriin• super-sana viittaa isään• super viittaa myös isän konstruktoriin• Jos konstruktorissa halutaan suorittaa toinen

konstruktori on se tapahduttava konstruktorin ensimmäisenä lauseena

Page 28: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 29

Konstruktorin kuormittaminen

public class Opiskelija{private String opno; // luokkamuuttujiaprivate double ov;

public Opiskelija(String opno){

this.opno=opno;}

public Opiskelija(String opno, double hyvitys) {this(opno);ov=hyvitys;

}

public Opiskelija(){ } // parametriton olio}

Page 29: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 30

Konstruktorien kutsujärjestys

public class Opiskelija {private String opno; private double ov;

public Opiskelija (String opno, double hyvitys) {this(opno);ov = hyvitys;

}

public Opiskelija (String opno){this.opno = opno;

}

public Opiskelija(){} // Välttämätön – missä tilanteessa?

}

public class Lasnaoleva extends Opiskelija {static private int nextOpno;private int vuosi;

public Lasnaoleva () {opno = nextOpno++;System.out.println(”Tervetuloa”+opno);

}

public void kirjaus (int aika) {vuosi = aika;

}}

Korjaa esimerkin virheet!

1. new varaa luokille muistin ja alustaa luokkien muuttujat tyyppinsä alkuarvoihin

2. alustetaan Opiskelija-luokan muuttujat annettuihin alkuarvoihinsa

3. suoritetaan Opiskelija-konstruktori

4. alustetaan Lasnaoleva-luokan muuttujat annettuihin alkuarvoihinsa

5. suoritetaan Lasnaoleva-konstruktori

Page 30: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 31

Luentoharjoitus 2

• Laadi monisteen Jatko_opiskelija-, Perus-opiskelija- ja Koululainen luokille järkevät kentät näkyvyysmääreineen.

• Lisäksi laadi konstruktorit, jolla alustat kentät.

• Luo samassa luokassa olevalla main-metodilla kaksi opiskelijaa ja tulosta opiskelijoiden tiedot.

Parametroidut oliot ja konstruktori

Page 31: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 32

MONIMUOTOISUUSpolymorfismi

Sovellus

Abstrakti yliluokka

Aliluokka Aliluokka

Yliluokka

Aliluokka AliluokkaRaja-

pinta-

luokka

B

Raja-

pinta-

luokka

A

Dynaaminen viittaus

täydentää abstraktin luokan puuttuvat osat

lisää yliluokkaan tietoja tai metodeja

Page 32: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 33

Dynaaminen viittaus

Opiskelija ins = new Opiskelija (”Kalle Hovi”);Akateeminen di = new Akateeminen (60 , ”Matti Mäki”);ins.tulosta();di.tulosta();ins = di;ins.tulosta();

public class Opiskelija {

protected String nimi;

public Opiskelija(){ }

public Opiskelija (String nimi) {

this.nimi = nimi;

}

public void annaNimi (String opnimi) {

nimi = opnimi;

}

public void tulosta() {

System.out.print(nimi);

}

}

public class Akateeminen extends Opiskelija {

private int ov;

// Suorittaa Opiskelija()-konstruktorin

public Akateeminen (int hyvitys, String nimi) {

ov = hyvitys;

this.nimi = nimi;

//annaNimi (nimi); // Olisiko tämä parempi?

}

public void tulosta() {

System.out.print(nimi+ov); // Miten korjataan } // jos nimi private?

}

Mitä tulostuu?

Page 33: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 34

Abstrakti luokka

• Abstrakti luokka määrittelee korkean tason käsitteen, jonka toiminnot on (täysin) määritelty, mutta ei välttämättä toteutettu

• Abstrakti luokka siis antaa kutsujalle (täydellisen) kuvan käsitteestä ja mahdollistaa sen käytön ennen kuin kaikki varsinaiset implementaatiot on tehty (mahdollistaa siis ajan mukaan tapahtuvan käsitteiden kehittelyn ja säästää perusasioiden uudelleen koodaamiselta)

• Abstraktista luokasta periytyvän aliluokan pitää toteuttaa kaikki isänsä ei-toteutetut metodit (lupaus kutsujalle)

• Aliluokka perii ja voi syrjäyttää abstraktin isänsä metodit ja muuttujat

• Aliluokka luonnollisesti voi lisätä uusia muuttujia ja metodeja• Abstraktista luokasta ei voi luoda ilmentymiä (olioita)• Luokka ja abstraktit metodit merkitään sanalla “abstract”

Page 34: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 35

Abstrakti luokka - esimerkki

abstract class AbstractOpiskelija {private String etunimi;private String sukunimi;

public AbstractOpiskelija(String enimi, String snimi){etunimi = enimi;sukunimi = snimi;

public String nimi(){return etunimi+" "+sukunimi;

}

abstract double keskiarvo();}

class Opiskelija extends AbstractOpiskelija{private double[] arvosanat;

public Opiskelija(String enimi, String snimi, double[] ov){super (enimi, snimi);arvosanat = ov;

}

public double keskiarvo(){double summa=0;int kpl=0;

for (int i=0; i<arvosanat.length; i++){if (arvosanat[i]>0){

summa += arvosanat[i]; kpl++;

}}return summa/kpl;

}

public String toString(){return nimi()+" "+keskiarvo();

}}

public class AbstraktiEsimerkki{

public static void main(String[] args){

double[] tulokset = {1, 2.5, 0, 4, 5};

AbstractOpiskelija di = new Opiskelija("Kalle","Koivu“,tulokset);

System.out.println(di);

}

}

Page 35: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 36

Rajapintaluokka

• Rajapintaluokka on täysin abstrakti eli ei lainkaan koodia -pelkkiä metodimäärittelyjä

• Luokassa pitää olla toteutukset kaikille käyttämänsä rajapinnan metodeille

• Luokka voi toteuttaa useita rajapintoja

• Rajapinta voi “toteuttaa” toisia rajapintoja

• Jos määritellään muuttujia tulee niistä luokan vakioita (static final)

• Abstrakti luokka on olion abstraktio, rajapintaa voidaan pitää palvelujen mallina

(käyttöliittymä, interface)

Page 36: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

interface Opintotoimisto{public void annaArvosana(int kurssi, double numero);public void tulostaArvosanat();public String toString();

}_____________________________________________________interface Suoritukset{

public void tulostaArvosanat();}_____________________________________________________abstract class AbstractOpiskelija {

private String etunimi;private String sukunimi;

public AbstractOpiskelija(enimi, snimi){etunimi = enimi;sukunimi = snimi;

}

public String nimi(){return etunimi+" "+sukunimi;

}

abstract double keskiarvo();}

Make 37

Rajapintaluokka esimerkkiclass Opiskelija extends AbstractOpiskelija

implements Opintotoimisto, Suoritukset{private double[] arvosanat;

public Opiskelija(String enimi, String snimi, double[] ov){super (enimi, snimi);arvosanat = ov;

}

public void annaArvosana(int kurssi, double numero){arvosanat[kurssi-1] = numero;

}

public void tulostaArvosanat(){System.out.println(toString());for (int i=0; i<arvosanat.length; i++)

System.out.println(arvosanat[i]);}

public double keskiarvo(){double summa=0;int kpl=0;for (int i=0; i<arvosanat.length; i++){

if (arvosanat[i]>0){summa += arvosanat[i];kpl++;

}}return summa/kpl;

}

public String toString(){return nimi()+" keskiarvo= "+keskiarvo();

}}

public class ImplementsEsimerkki{public static void main(String[] args){

double[] tulokset = {1, 2.5, 0, 4, 5};

Opintotoimisto di = new Opiskelija("Kalle", "Koivu", tulokset);

di.tulostaArvosanat();di.annaArvosana(3, 4);di.tulostaArvosanat();

}}

Page 37: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Geneerisyys

• Viitetyyppejä (olioita) voidaan korvata geneerisellä muuttujalla

Geneerinen määritys: ArrayList <E> ();

Tyypittäminen olioilla: new ArrayList <Asiakas> ();

• Perustietotyyppejä ei voida korvata geneerisellä muuttujalla

• Parametrina on tapana käyttää isoa kirjainta T (tyyppi), E (elementti),…

• Geneerinen metodi• Geneerinen luokka• Geneerinen rajapinta

Make 38

MetodinKuormitus.java

MetodiGeneerinen.java

GeneerinenArray.javaGeneerinenRajapinta.java

Page 38: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

GeneerisyysArrayList<Asiakas> lista = new ArrayList<>();

Make 39

public interface Pino <E> {

public void laita(E olio);public E ota();

}

public class RajattuPino <E> implements Pino <E> {private koko;

private E[ ] oliot = (E[ ]) new Object[10];

public void laita (E olio) {oliot[koko++]= olio;

}

public E ota() {return oliot[--koko];

}}

Pino <Asiakas> luettelo = new RajattuPino <>();

Sovellus

Sovellus

public static <T> void laitaPinoon(T olio, Pino<T> pino){pino.laita(olio);

}

Page 39: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 40

OLIOIDEN KÄYTTÖTILANTEITA

Page 40: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 41

Olioita kokoelmassa

public class Oliotaulukko {

public static void main(String[] args) {

Henkilo[] tekijät = new Henkilo[5];tekijät[0] = new Henkilo("Liisa", 2000);

tekijät[1] = new Henkilo("Teija", 3000);

tekijät[2] = new Henkilo("Kalle", 1500);

tekijät[3] = new Henkilo("Risto", 1900);

tekijät[4] = new Henkilo("Marko", 1800);

int summa = 0;

for (Henkilo ihminen: tekijät) {

summa += ihminen.annaPalkka();

System.out.println(ihminen);

}

System.out.println("\nPalkkasumma "+summa);

}}

class Henkilo {

static int id=100;

private int hlonro;private String nimi;

private double palkka;

Henkilo (String nimi, double rahaa){

this.nimi = nimi;

palkka = rahaa;

hlonro = id++;

}

public double annaPalkka(){

return palkka;

}

public String toString(){

return hlonro+": "+nimi;

}

}

Page 41: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 42

Olioita parametrina

public class Olioparametri {

public static void main(String[] args) {

Henkilo1[] tekijät = new Henkilo1[5];tekijät[0] = new Henkilo1("Liisa", 2000);

tekijät[1] = new Henkilo1("Teija", 3000);

tekijät[2] = new Henkilo1("Kalle", 1500);

tekijät[3] = new Henkilo1("Risto", 1900);

tekijät[4] = new Henkilo1("Marko", 1800);

int summa = 0;

for (Henkilo1 ihminen: tekijät)

tulosta (ihminen);

}

private static void tulosta(Henkilo1 henkilo){

System.out.println(henkilo);}

}

class Henkilo1 {

static int id=100;

private int hlonro;private String nimi;

private double palkka;

Henkilo1 (String nimi, double rahaa){

this.nimi = nimi;

palkka = rahaa;

hlonro = id++;

}

public String toString(){

return hlonro+": "+nimi+" "+palkka;

}

}

Page 42: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 43

Olion tulostaminen

• Tulostettaessa olio tulostaa toString()-metodin palauttama arvon

• Yleensä Object-luokan toString() palauttama arvo ei ole riittävä, vaan olioon kannattaa ohjelmoida oma toString()-metodi

• Samoin toimivat rajapintamekanismin callback-metodit (käyttöliittymissä, lajittelussa,…)

Palvelu p= new Palvelu();p.laske(this);

public void kaava(){...

}

public laske(Object a){...

a.kaava();...

}

palvelu

Page 43: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Olioiden vertailu

Make 44

Page 44: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Olioiden vertailu

Make 45

Page 45: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 46

Olio-ohjelmointi ohjeita

1. Kaunis ohjelma

2. Ensin toimimaan, sitten nopeuta

3. Hajota ja hallitse (olioita)

4. Palveluluokka / käyttäjäluokka (sovellus)

5. Luokan nimet itsedokumentoivia

6. Luokka hoitaa yhden selkeän käsitteen

7. Suunnittelu tuottaa luokat, liittymät, suhteet

8. Johdettu luokka yksinkertaistaa ennemmin kuin laajenta

9. Kätke monimutkaisuus luokan käyttäjältä (ohjelmoija)

10. Toistuva koodi metodiksi (bottomup-suunnittelu)

Page 46: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 47

Olio-ohjelmointi ohjeita

11. Parametrilistan pitäisi olla lyhyt

12. Aloita yksinkertaisella luokalla

13. Luo testikoodi ennen luokan koodia?

14. Jätä luokkaan testimetodit (main)

15. Korvaa switch ja tyypintutkinta (instanceof) ylimäärittelyllä ja monimuotoisuudella

16. Käytä poikkeushierarkiaa odottamattomille tilanteille (ei harvinaisille)

17. Sun coding conventions java.sun.com/docs/codeconv/index.html

18. Älä käytä unkarilaista nimiöintitapaa (iLaskunumero)

19. Metodi lyhyt ja hoitaa yhden tehtävän

20. Pidä asiat private

Page 47: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 48

Olio-ohjelmointi ohjeita

21. Korvaa vakiot symbolisilla vakioilla

22. Konstruktorissa aseta olio kuntoon; vältä kutsumasta metodeita

Page 48: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 49

Luentoharjoitus 3

Lottopelissä pelaaja syöttää useita rivejä lottonumeroita. Sen jälkeen arvotaan oikea rivi. Lopuksi tarkistetaan kuinka pelaajaa onnisti.

Suunnittele lottopeliin merkkipohjainen ja graafinen käyttöliittymä. Sijoita lottopelin pelitoiminnot eri luokkaan siten, että molemmat käyttöliittymät voivat käyttää sitä. Minkälainen rajapinta luokkien välille pitäisi määritellä?

Modularisointi

Page 49: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

-Vastaus 3

Make 50

Lottoristikko Lotto-numero

t

Syötä rivi

Arvo Tarkasta Talleta rivi

Arvo rivi

Tarkasta1 Syötä numerot

2 Arvo oikeat numerot

3 Tarkasta tulos

Page 50: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 51

Luentoharjoitus 4

Laadi autokauppa, joka hallitsee annettua määrää autoja. Kauppaan voidaan lisätä ja poistaa uusia autoja, laskea kaupan autojen keskihinta, listata kalliit (yli keskihintaiset) autot ja etsiä autoja värin mukaan.

Olioita taulukossa

Page 51: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 52

Luentoharjoitus 5

Alla oleva Lainaus sovellus käyttää Kirja ja Lainakirja luokkia. Kirjoita Kirja ja Lainakirja luokat.

import java.util.*;public class Lainaus {

public static void main(String[] args) {ArrayList lainassa = new ArrayList();

// add-metodin parametrit ovat teoksen tekijä, nimi ja eräpäivälainassa.add(new Kirja("Vesterholm", "Java-ohjelmointi"));lainassa.add(new Kirja("Lafore", "Data Structures"));lainassa.add(new Kirja("Haikala", "Käyttöjärjestelmät"));lainassa.add(new Lainakirja("Disney", "Aku Ankan vuosikirja 2007", "21.6.2007"));lainassa.add(new Lainakirja("Lordi", "Hard Rock Hallelujah", "31.5.2007" ));lainassa.add(new Lainakirja("Vesterlund", "Jääkiekon pelitaktiikat", "15.5.2007"));

// tulostaa olioiden kaikki tietokentätfor (Object teos: lainassa)

((Kirja)teos).tulosta();}

}

Periytyminen ja monimuotoisuus

Page 52: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 53

Luentoharjoitus 6

Kirjoita alla olevan koodin luokat Pankkitili, Asunto ja Sijoitusa. jos Sijoitus on rajapinta luokkab. jos Sijoitus on abstrakti luokka

Abstraktisuus ja rajapinta

Page 53: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 55

SWING KÄYTTÖLIITTYMÄ

http://docs.oracle.com/javase/tutorial/uiswing/index.html

”I don’t mean a thing if it ain’t got that swing”

OtaTaiJata.java

Page 54: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 56

GRAAFISET KOMPONENTIT

Page 55: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 57

Perusnäyttö

JFrame

JMenuBar

ContentPane

JLabel

JToolbarJButton JButton

JSplitPane

JScrollPane JPanel

JPanel

JPanel

JLabel

JScrollPane

JEditorPane

JList

JMenu JMenu

Page 56: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 58

Swing komponentteja

JFrameJDialogJAppletJInternalFrameJRootPaneJLayerPaneJDesktopPane

JFileChooserJColorChooserJOptionPane

Katso tutorial-sivu verkosta: docs.oracle.com/javase/tutorial/uiswing/index.htmlSwingComponents.java ja SwingSet3.jnlp

JComponent

AbstractButtonJButtonJMenuItem

JCheckBoxMenuItemJMenuJRadioButtonMenuItem

JToggleButtonJCheckBoxJRadioButton

JTextComponentJTextAreaJEditorPane

JTextPaneJTextField

JFormattedTextFieldJPasswordField

JComboBox

JLabelJListJPopupMenuJProgressBarJScrollBar

JSeparatorJSliderJSpinnerJTableJToolTip

JTree

JPanel

JScrollPaneJSplitPaneJTabbedPaneJMenuBarJToolBar

Page 57: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 59

Perusikkunaimport javax.swing.*;import java.awt.*;

public class Perusikkuna extends JFrame {JLabel selite;

public Perusikkuna() {setTitle("Tervehdysikkuna"); selite = new JLabel("Terve");add(selite);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }

public static void main(String[] args) { Perusikkuna ikkuna = new Perusikkuna(); ikkuna.setSize(200,100); // voisi olla Perusikkuna-konstruktorissa

ikkuna.setVisible(true); }

}Perusikkuna.java

Page 58: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 60

AsettelijatAsettelijat.java

Page 59: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 61

Layout-ikkunaimport javax.swing.*;import java.awt.*;

public class Layoutikkuna extends JFrame {JLabel selite;

public Layoutikkuna() {setTitle("Tervehdysikkuna");selite = new JLabel("Terve");// BorderLayout sisältöpanelin oletusasettelija// setLayout(new BorderLayout());add(selite, BorderLayout.EAST);// getContentPane().add(selite, BorderLayout.EAST);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args) {Layoutikkuna ikkuna = new Layoutikkuna();ikkuna.setSize(200,100);

ikkuna.setVisible(true); }

}

Layoutikkuna.java

Page 60: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

SpringLayout jdk1.4

http://java.sun.com/docs/books/tutorial/uiswing/layout/spring.html

Make 62

Komponenttien suunta ja välit määritellään.

5020 20

20 20

20

SpringAsettelu.java

Page 61: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

GroupLayout jdk1.6

Make 63GroupAsettelu.java

PystyryhmätVaakaryhmät

Komponenttien ryhmät vaaka ja pystysuunnassa määritellään (myös välit).

http://java.sun.com/docs/books/tutorial/uiswing/layout/group.html

Page 62: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 64

TAPAHTUMIEN KÄSITTELY

Page 63: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 65

Kuuntelija

sovellusjvm / WindowListener

addWindowListener()

”tapahtumien postituslista”

windowClosing() metodi

Kuuntelijaksi ilmoittautuminen ja tapahtuman vastaanotto (AWTn event delegation model)

EventObject

Komponentti

Close

käyttöjärjestelmä

Page 64: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 66

Ikkunan kuuntelija

Jokainen olio, joka haluaa ottaa vastaan tietyn tapahtuman, ilmoittautuu ko. tapahtuman kuuntelijaksi

addWindowListener(new Kuuntelija())ja toteuttavat liittymän vaatimat metodit, jotka reagoivat tapahtumaan suorittamalla käyttäjän haluamat toimenpiteet, esimerkiksi

windowClosing().

Page 65: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 67

Kuuntelija vai adapteri

Koska kuuntelijaksi kirjautuvan sovelluksen pitää toteuttaa kaikki rajapinnan metodit, tarvitsee laatia metodit myös tapahtumille, joista sovellusohjelmassa ei olla kiinnostuneita.

Tämän helpottamiseksi on laadittu Adapteri-kuuntelijaluokat, jossa on tyhjät metodit kaikille pakollisille rajapintametodeille, joten sinun pitää ylikuormittaa sovelluksessa vain tarvitsemasi metodit.

Page 66: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 68

Esimerkki (kuuntelija)

import java.awt.event.*;Import java.awt.*;import javax.swing.*;

public class Kuuntelijatesti1 extends JFrame{public static void main(String[] args){

Kuuntelijatesti1 testi = new Kuuntelijatesti1();testi.setVisible(true);

}public Kuuntelijatesti1 (){

addWindowListener(new Kuuntelija()); }}

// Kuuntelija ulkoisena luokkanaclass Kuuntelija implements WindowListener{

public void windowClosing(WindowEvent e){System.exit(0);

}public void windowActivated(WindowEvent e){}public void windowClosed(WindowEvent e){}public void windowDeactivated(WindowEvent e){}public void windowDeiconified(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowOpened(WindowEvent e){}

}

import java.awt.event.*;Import java.awt.*;import javax.swing.*;

public class Kuuntelijatesti2 extends JFrame{public static void main(String[] args){

Kuuntelijatesti2 testi = new Kuuntelijatesti2();testi.setVisible(true);

}public Kuuntelijatesti2 (){

addWindowListener(new Kuuntelija()); }

// Kuuntelija sisäluokkanaclass Kuuntelija implements WindowListener{

public void windowClosing(WindowEvent e){System.exit(0);

}public void windowActivated(WindowEvent e){}public void windowClosed(WindowEvent e){}public void windowDeactivated(WindowEvent e){}public void windowDeiconified(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowOpened(WindowEvent e){}

}}

Kuuntelija ulkoisena luokkana Kuuntelija sisäluokkana

Page 67: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 69

Esimerkki (adapteri)

…public class Adapteritesti1 extends JFrame{ public static void main(String[] args){ Adapteritesti1 testi = new Adapteritesti1();

testi.show(); }

public Adapteritesti1 (){ addWindowListener(new Kuuntelija()); }}

class Kuuntelija extends WindowAdapter{ public void windowClosing(WindowEvent e){ System.exit(0); }}

…public class Adapteritesti2 extends JFrame{ public static void main(String[] args){ Adapteritesti2 testi = new Adapteritesti2(); testi.show(); }

public Adapteritesti2 (){ addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); }}

Kuuntelijan laajentaminen adapteriluokasta Kuuntelija nimettömänä sisäluokkana

Page 68: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 70

Kuuntelijarajapintoja ja niiden metodejaWindowListenerWindowAdapter

windowOpenwindowClosingwindowsClosedwindowActivated

windowDeactivatedwindowIconifiedwindowDeiconified

Ikkunan avaamisesta, sulkemisesta, aktivoimisesta syntyvät tapahtumat

Kuuntelijatesti2.javaAdapteritesti2.java

ActionListener actionPerformed Komponentin tapahtumat AjanArviointi.java

FocusListenerFocusAdapter

focusGainedfocusLost

Komponentti saa tai menettää fokuksen

KeyListenerKeyAdapter

keyTypedkeyPressed

keyReleased Näppäimistön näppäimen painamiseen liittyvät tapahtumat

MouseListener mouseClickedmousePressedmouseReleased

mouseEnteredmouseExited

Tapahtuvat hiirellä klikattaessa, painettaessa nappi pohjaan, vapautettaessa, tullessa komponentin päälle ja poistuttaessa

MouseMotionListenerMouseMotionAdapter

mouseDraggedmouseMoved

Hiirtä vedetään nappi pohjassa tai liikutetaan

MouseAdapter MouseListenerMouseMotionListenerMouseWheelListener

Hiiri.java

http://download.oracle.com/javase/tutorial/uiswing/index.html

JDK-help java.awt.event

Page 69: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

MVC-arkkitehtuuri

Make 71

OsatMalli huolehtii järjestelmän sovellusaluekohtaisen tiedon tallentamisesta, ylläpidosta ja käsittelystä.Näkymä määrittää käyttöliittymän ulkoasun ja mallin tietojen esitystavan käyttöliittymässä.

Ohjain eli kontrolleri vastaanottaa käyttäjältä tulevat käskyt sekä muuttaa mallia ja näkymää vastauksena niihin.

EtujaMalli ei riipu näkymästä eikä ohjaimesta.

Malli voidaan suunnitella, ohjelmoida ja testata riippumatta järjestelmän muista osista.

Samaan malliin voidaan tehdä erilaisia käyttöliittymiä. Saman järjestelmän tietoon voi olla pääsy esimerkiksi merkki-, graafisella ja webbikäyttöliittymällä.

Näkymän ja ohjaimen toimintaan voidaan tehdä muutoksia muuttamatta mallia.

Näkymän ja ohjaimen riippuvuus toisistaan on verrattain pieni.

Käyttöliittymän ulkoasu eli näkymä on mahdollista vaihtaa muuttamatta ohjainta.

Ohjainta voidaan muuttaa muuttamatta näkymää.

Käyttöliittymän asynkronointi on helppoa.Myös muita monitasomalleja.

Page 70: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Loton MVC-esimerkki

Make 72

NÄKYMÄ (VIEW)

OHJAIN (CONTROL)

MALLI (MODEL)

luo näkymäolioluo malliolio

interface

arvo

tarkista

tyhjennä

Rekisteröi viite ohjaimeen

Page 71: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 74

Luentoharjoitus 7

Tee rahanvaihtosovellus, jolla voit laskea antamasi euromäärän dollareina ja päinvastoin.

Page 72: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 75

Luentoharjoitus 8

Suunnittele GUI-editorilla sovellus, joka laskee kahden kentän arvon yhteen ja pistää tuloksen kolmanteen kenttään.

Page 73: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 76

Luentoharjoitus 9

Laadi alla olevan näköinen näyttö, jolla lisäät puhelinluetteloon nimi- ja numerotietoja. Lisää-nappi lisää näyttöön syötetyt tiedot luetteloon. Edellinen-nappi näyttää edellisen numeron luettelosta. Seuraava-nappi näyttää seuraavan numeron luettelosta. Poista-nappi poistaa seuraava- ja edellinen-napeilla haetun nimi- ja numerotiedon luettelosta.

 

Näyttö pitää koodata ”käsin” eli koodia ei saa generoida graafisella näytönsuunnitteluvälineellä.

Page 74: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 77

Luentoharjoitus 10

Ohjelmoi graafinen nelilaskin.

Page 75: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 81

POIKKEUSKÄSITTELYLesson: Exceptions (The Java™ Tutorials > Essential Classes)

Page 76: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 82

Virheistä

• Ennen hoidettiin paluuarvolla, nykyisin poikkeuksilla• Käännösaikaiset virheet

– Editorin löytämät syntaksivirheet

• Ajoaikaiset virheet– virhetilanne ympäristössä: muisti loppu, tietoväline rikki…– tietovirtavirheet– taulukon rajojen ylitys– nollalla jako– null-viitteet– ohjelmoijan looginen virhe

• Odottamattomiin virheisiin reagoidaan poikkeuksilla

Page 77: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 83

Virheen käsittely

try {

// koodi, jossa poikkeus saattaa tapahtua

} catch (poikkeustyyppi poikkeustapahtumaolio) {

// koodi, joka suoritetaan poikkeustilanteessa

} // voi olla useita catch-osia, joista ensimmäinen sopiva valitaan

// poikkeukset pitäisi tutkia tarkimmasta epätarkimpaan

finally { // ei yleensä käytetä

// koodi, joka suoritetaan aina

// yleensä siivoustoimenpiteitä// (tiedoston sulkeminen, resurssien vapauttaminen)

}

…jatketaan tästä

”poikkeuksen sieppaaminen ja hoitaminen”

Page 78: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 84

Poikkeusluokkahierarkia

Throwable

Error Exception

RuntimeException(ei-tarkisteta) (tarkistettava)

(ei-tarkisteta)

Page 79: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 85

VirhetyyppejäError (virheitä, joista ohjelma ei voi toipua)• OutOfMemory• StackOverFlowError• NoSuchMethodError• NoSuchFieldError• InstantiationError //olio liittymästä tai abstraktista luokasta• IllegalAccessError //metodi tai kenttä johon ei oikeutta• NoClassDefFoundErrorRuntimeException (virheitä, joihin voi reagoida – mutta mitä tehdä?)• ArithmeticException• ArrayIndexOutOfBoundsException• ArrayStoreException //väärän tyyppinen olio taulukkoon• ClassCastException //laiton tyyppimuunnos• IllegalArgumentException //laiton metodiparametri• NullPointerException• NumberFormatException• StringIndexOutOfBoundsExceptionException (virheitä, joista ohjelmoija voi toipua ja jotka on hoidettava)

Page 80: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Javan Exception-poikkeuksia

• IOException• BadStringOperationException• DataFormatException• FontFormatException• GeneralSecurityException• ParseException• PrinterException• SQLException• TimeoutException• UnsupportedAudioFileException• XMLParseException

Make 86

Page 81: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 87

Poikkeuksen heittäminen

• Metodin otsikossa luetellaan throws sanan jälkeen kutsujalle heitettävät poikkeukset

• throws-sana pitää olla jos metodi heittää Exception-luokan poikkeuksen (kutsuvan metodin pitää hoitaa se: catch tai throws)

• Metodi voi hoitaa kutsumansa metodin Error ja RuntimeException poikkeuksen vaikkei se sitä throws-sanalla vaatisikaan

• Kutsuva metodi voi heittää poikkeuksen edelleen omalle kutsujalleen

• Kumpi osaa hoitaa – kutsuja vai kutsuttu?

try {virhe

} catch (poikkeus){

}

laske() {

virhe

}

try {

laske();

} catch (poikkeus){

}

laske() throws poikkeus {

virhe

}

laskutus () throws poikkeus

{

laske();

}

try {

laskutus();

} catch (poikkeus){

}

Page 82: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 88

Pakollinen poikkeuskäsittely

try {

FileInputStream tiedosto = avaa();

} catch (FileNotFoundException e) {

System.out.println(”Tiedostoa ei löytynyt”);

System.out.println(”Antoi virheen: ”+e.getMessage());

}

public FileInputStream avaa() throws FileNotFoundException, SecurityException {

return new FileInputStream(”dataa.txt”);

}

• Poikkeustapahtumasta saadaan lisää tietoa Throwable- tai sen aliluokan metodeilla, esim: e.getMessage()

• Mitä tapahtuu SecurityExceptionille ?

Page 83: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 89

Vapaaehtoinen poikkeus

Taulukkokäsittelyn suojaus:

public class Pelaajat1 { private String[] asiakkaat = {"Kalle","Ville","Matti","Jaska"}; public static void main(String[] args) { Pelaajat1 lista = new Pelaajat1(); lista.tulostaJoukkue(); } public void tulostaJoukkue() { for (int i=0; i<=asiakkaat.length; i++) System.out.println(asiakkaat[i].toUpperCase()); }}

• Ohjelmassa virhe!• Pitäisikö hoitaa poikkeuksilla vai if-lauseella? • Miten poikkeuksella hoitaisit virheen?• Jatkuu harjoituksessa 12

Page 84: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 90

Omat poikkeukset

• Tilanne, joka ei hoidu tavanomaisilla ohjausrakenteilla• Odotettavissa olevat tilanteet if-lauseella• Poikkeuskäsittely raskasta• Metodi heittää poikkeuksen kutsujametodille, jos vain metodin

kutsuja tietää tilanteen käsittelytavan• Poikkeukset olioita periytyen java.lang.Throwable luokasta• Oma poikkeus kannattaa periyttää Exception-luokasta• Oman poikkeusluokan nimi olisi hyvä päättyä Exception-sanaan• Dokumentoinnissa mainitse metodin mahdollisesti aiheuttamat

poikkeukset

Page 85: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 91

Omat poikkeukset esimerkkitry {

nostaRahaa(1000);} catch (TiliTyhjaException tilipoikkeus) {

System.out.println(”Tililläsi ei ole riittävästi rahaa.”);System.out.println(tilipoikkeus.getMessage());

}

void nostaRahaa(int summa) throws TiliTyhjaException {if (saldo < summa)

throw new TiliTyhjaException(saldo);else

saldo -= summa;}

public class TiliTyhjaException extends Exception {public TiliTyhjaException(saldo) {

super(”Nosto ei onnistu.Tilisi saldo on ”+saldo+” euroa.”);}

}

Page 86: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

finally-lausekepublic class TryFinal {

public static void main(String[] args) {

try {

arvonTarkastus(5); // Parametrin arvo määrää mikä poikkeus syntyy

} catch (IllegalArgumentException e) {

System.out.println(”Väärä parametrin arvo");

}

}

public static void arvonTarkastus (int arvo) {

try {

int tulos = 100 / arvo;

if (tulos < 0) throw new IllegalArgumentException();

} catch (ArithmeticException e) {

System.out.println("Nollalla jakoa ei saa tehdä");

} finally {

System.out.println("Olen aivan finaalissa");

}

}

}

Make 92

Page 87: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 93

Luentoharjoitus 11a) Minkälaisia poikkeuksia pyydystää seuraava koodin pätkä

catch (Exception e) { koodia}

b) Mikä vikana seuraavanlaisessa poikkeuskäsittelyssä

try {…} catch (Exception e) {…} catch (ArithmeticException a) {…}

c) Minkä tyyppisiä virheitä (1-4) seuraavat tilanteet (a-d) ovat

a. int[] a; 1. errora[0] = 0; 2. tarkistettava virhe

b. JVM ei löydä Javan luokkia. 3. kääntäjän virhe c. Ohjelma saavuttaa tiedoston loppumerkin. 4. ei ole virhed. Ohjelma yrittää lukea tiedostoa vaikka on

jo sen lopussa.

Page 88: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 94

Luentoharjoitus 12

1. Lisää Pelaaja1 luokan tulostaJoukkue() metodiin taulukon takarajan ylitys poikkeuskäsittely

2. Lisää myös puuttuvan pelaajan poikkeuskäsittely

3. Siirrä taulukon ylitys poikkeuskäsittely Pelaaja1 luokan main-metodiin

Page 89: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 95

TIEDOSTOT

Page 90: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 96

Tietovirta

Tietovirta

Tieto keskusmuistissa

Tieto pysyvässä muistissa

Tiedosto

MerkkivirtaBinäärivirta

AvaaminenKirjoittaminenLukeminenSulkeminen

Tietue

Page 91: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 97

Kirjoitusluokat

MERKKIVIRTA

WriterFileWriterBufferedWriter

BINÄÄRIVIRTA

OutputStream

FileOutputStreamBufferedOutputStream

Page 92: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 98

Esimerkki merkkien kirjoittamisestaimport java.io.*;

public class Tiedostoonmerkit {

public static void main(String[] args){Writer ulos;BufferedWriter puskuri;try {

ulos = new FileWriter("Merkit.txt");

puskuri = new BufferedWriter(ulos);puskuri.write("Tässä on tulostettavia merkkejä”);puskuri.newLine();puskuri.close();

} catch (IOException ioe) {ioe.printStackTrace();

}}

}

Page 93: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 99

Esimerkki binääridatan kirjoittamisestaimport java.io.*;

public class Tiedostoontavut {

public static void main(String[] args){

OutputStream virta;

Writer ulos;

BufferedWriter puskuri;

try {

virta = new FileOutputStream("Tavut.txt");

ulos = new OutputStreamWriter(virta);

puskuri = new BufferedWriter(ulos);

puskuri.write("Tässä on tulostettavia tavuja");

puskuri.newLine();

puskuri.close();

} catch (IOException ioe) {

ioe.printStackTrace();

}

}

}

Page 94: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 100

Lukemisluokat

MERKKIVIRTAReader

FileReaderBufferedReader

BINÄÄRIVIRTAInputStream

FileInputStreamBufferedInputStream

Page 95: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 101

Esimerkki merkkien lukemisesta

import java.io.*;

public class Tiedostostamerkit {

public static void main(String[] args) {

BufferedReader puskuri;

String rivi;

try {

puskuri = new BufferedReader(new FileReader("Merkit.txt"));

while ((rivi=puskuri.readLine()) != null){

System.out.println(rivi);

}

puskuri.close();

} catch (IOException ioe){

ioe.printStackTrace();

}

}

}

Page 96: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 102

Esimerkki binääridatan lukemisesta

import java.io.*;

public class Tiedostostatavut {

public static void main(String[] args) {

BufferedReader puskuri;

String rivi;

try {

puskuri = new BufferedReader(new InputStreamReader( new

FileInputStream("Tavut.txt")));

while ((rivi=puskuri.readLine()) != null){

System.out.println(rivi);

}

puskuri.close();

} catch (IOException ioe){

ioe.printStackTrace();

}

}

}

Page 97: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 103

Esimerkki try-with-resource

import java.io.*;

public class TryWithResource {

public static void main(String[] args) throws IOException {

String rivi;

try (BufferedReader lukija = new BufferedReader(new FileReader("Merkit.txt"))) {

while ((rivi = lukija.readLine()) != null)

System.out.println(rivi);

} // Heittää poikkeuksen jos tiedostoa ei löydy tai

// tiedoston sulkemisessa tapahtuu virhe

}

}

• Jokainen olio, joka täytyy sulkea on resurssi• Try sulkee resurssin try-lauseen jälkeen• Suljettavien resurssien täytyy toteuttaa AutoCloseable tai Closeable rajapinta• Useita resursseja: try (InputStream fis = new FileInputStream(source);

OutputStream fos = new FileOutputStream(target)){...

Page 98: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 104

Olioiden lukeminen ja kirjoittaminen

Sarjallistamisella olio kokonaisuudessaan kirjoitetaan tiedostoon ja se pystytään myös palauttamaan ohjelmaan entiseen muotoonsa.

Luokat: ObjectInputStream

ObjectOutputStream

(sarjallistaminen)

Page 99: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 105

public class Auto implements Serializable {String merkki;public Auto(String m){

merkki = m;}

}

Olion sarjallistaminen

try {FileOutputStream out = new FileOutputStream(”kulkuneuvot.dat”);ObjectOutputStream olioout = new ObjectOutputStream(out);Auto oma = new Auto(”Volvo”);olioout.writeObject(oma);olioout.close();

} catch (IOException ioe){System.out.println(ioe.getMessage());

}

try {FileInputStream in = new FileInputStream(”kulkuneuvot.dat”);ObjectInputStream olioin = new ObjectInputStream(in);Auto car = (Auto)olioin.readObject();olioin.close();

} catch (IOException ioe){ioe.printStackTrace();

}

Page 100: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 106

File-luokka

Käsittelee tiedostoja ja hakemistoja.• File(String), File(String, String)• boolean exists()• boolean isDirectory()• boolean isFile()• boolean delete()• boolean mkdir()• boolean mkdirs()• boolean renameTo()• …

Page 101: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 107

Luentoharjoitus 13

Lue rivejä kahdesta tiedostosta ja kirjoita ne kolmanteen tiedostoon. Luettavien tiedostojen tietueiden alussa on numerokenttä, jonka mukaan ne ovat järjestyksessä.

Page 102: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 108

Luentoharjoitus 14

Serialisoi olioiden taulukko tiedostoon.

Page 103: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 109

Luentoharjoitus 14.2

Testaa JFileChooser komponenttia.

Page 104: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 110

UMLUnified Modeling Language

Page 105: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 111

Vaatimukset tietojärjestelmäksi

”Järjestelmä-malli”

”Ohjelmisto-malli”

Tieto ↔ Toiminta(objekti)

”Toimintomalli”

”Tietokanta-malli”

”Käsitemalli”

Page 106: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 112

Ohjelmiston kehitysvaiheet

1. Esitukimus (Vaatimusmäärittely (mitä, mahdollista))

2. Analyysi (käyttötapauskaavio, luokkakaavio, attribuutit)

3. Suunnittelu (sekvenssikaavio, tarkennettu luokkakaavio)

4. Toteutus

5. Testaus

6. Käyttöönotto

7. Ylläpito

”Tehdäänkö?”

”Mitä?”

”Miten?”

”Miten javalla?”

Page 107: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Kehitystapa

• Vesiputousmalli• Spiraalimalli

– Inkrementaalinen (lisäävä, täsmentävä)– Iteratiivinen (toistava)

• Agile (ketterä), Scrum, XP, …– Muutokseen reagointi (suunnitelma)

• Nopea palautesykli, pienet tuotantoerät, vaatimuksien priorisointi, hinta-/aikavaikutukset

– Vuorovaikutus (työkalut)• Vertaisarviointi, itseohjautuvat tiimit

– Asiakasyhteistyö (sopimukset)• Tuoteomistaja, jatkuva mukanaolo, kiinteä projekti / muutosjoustavuus

– Toimiva sovellus (dokumentaatio)

Make 113

Page 108: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 114

Kaavioiden tarkoitus

Mallintaminen• Ymmärrä, yksinkertaista, kommunikoi• Hierarkiset kaaviot

Dokumentointi • Kuvaus, koulutus, työvaiheen tulos

Koodin tuottaminen• Nopeus, muuttaminen• Vaatimusten mallintaminen: käyttötapauskaavio• Rakenteen mallintaminen: luokkakaavio• Vuorovaikutuksen mallintaminen: sekvenssikaavio• Käyttäytymisen mallintaminen : tilakaavio

Page 109: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 115

Olioperustainen kuvaus

• ”Three Amigos” = Rumbaugh, Booch, Jacobson 1996• UML on notaatio – ei menetelmä• Kaikkea ei tarvitse käyttää tai osata• UML tukee hyvin oliopohjaista ohjelmankehitystä• Kuvauksen jälkeen toteuttaminen helppoa• Oliot heijastavat sovelluksen käsitemaailmaa

luontevasti• Olio sisältää käsitteen tiedot ja toiminnan• Arkkitehtuuri → suunnittelumalli (pattern, frame,

template) → algoritmi → tietorakenteet

Page 110: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

UML kaaviot

Make 116

Page 111: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 117

UML-kaaviot

UML

Rakennekaavio(Object)

Luokkakaavio

Koostekaavio

Komponenttikaavio

Sijoittelukaavio

Pakkauskaavio

Käyttäytymiskaavio(Functional+Dynamic)

Aktiviteettikaavio Vuorovaikutuskaavio

Sekvenssikaavio

Kommunikointikaavio

Kokoava vuorovaikutuskaavio

Ajoituskaavio

Käyttötapauskaavio Tilakaavio

Page 112: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 118

UML-kaaviot• Käyttäytymiskaavio (Behaviour diagram)

• Aktiviteettikaavio (Activity diagram)• Käyttötapauskaavio (Use case diagram)• Tilakaavio (State diagram)• Vuorovaikutuskaavio (Interaction diagram)

• Ajoituskaavio (Timing diagram)• Kokoava vuorovaikutuskaavio (Interaction overview

diagram)• Kommunikointikaavio (Communication diagram)• Sekvenssikaavio (Sequence diagram)

• Rakennekaavio (Structure diagram)• Komponenttikaavio (Component diagram)• Koostekaavio (Composite structure diagram)• Luokkakaavio (Class diagram)• Oliokaavio (Object diagram)• Pakkauskaavio (Package diagram)• Sijoittelukaavio (Deployment diagram)

Page 113: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 119

Käyttötapauskaavio

Actor ulkopuolinen toimija

<<extends>>

laajentaa, poikkeustapaus

<<includes>> tai <<uses>>

käyttää erillistä käyttötapausta

Use case

Käyttötapauskuvaus on käyttötapauskaavion sanallinen tarkennus• Strukturoitu teksti• Toimintoluettelo

Page 114: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 120

Peruselementtejä

LuokkaTiedot

ToiminnotRakenne

TilaKäyttäytyminen

Kommentti

PakkausRyhmittely

Kommentti

Page 115: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

• Yksinkertainen assosiaatio (association)

public class Tilaus {

private Asiakas asiakas;

• Moninkertainen assosiaatio

public class Kurssi {

private Opiskelija[] osallistujat = new Opiskelija[50];

Assosiaatio

Make 121

Kurssi Opiskelija1..500..* ◄ osallistuu

maksaja

Asiakas Tilaus1..*1 suorittaa

public class Opiskelija {

private ArrayList ilmoittautumiset;

Page 116: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Kooste

• Kooste (aggregation)

public class Koulutusohjelma {

private ArrayList kurssilista;

// Konstruktori voisi vaatia koulutusohjelmalle vähintään yhden kurssin

public void LisääKurssi(Kurssi kurssi) {

kurssilista.add(kurssi);

• Vahva kooste (muodoste, composition)

”lapsi ei voi elää ilman isää eikä kuulua muihin isiin ”

public class Opiskelija{

private ArrayList ilmoittautumiset;

public void Ilmoittaudu() {

ilmoittautumiset.add(new Ilmoittautuminen());

Make 122

Opiskelija Tentti-ilmoittutuminen1..*1

Koulutusohjelma Kurssi1..**

Page 117: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Periytyminen• Yleistys (generalization, inheritance)

public class Tentti extends Suoritus {

• Abstrakti luokka (abstract class) public abstract class Suoritus {

public abstract void laskeOv();

}

public class Tentti extends Suoritus{

public void laskeOv() {

…}

}

• Rajapinta (interface ja implementation)public interface Suoritus {

//metodien määrittely

}

public class Tentti implements Suoritus {

// metodien toteutukset

}

Make 123

Suoritus

Tentti

Suoritus

laskeOv()

Tentti

laskeOv()

<<interface>>Suoritus

Tentti

italic

Page 118: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 124

LuokkakaavioLuokat- käsite- määrittely (rajapinta)

- toteutus

Yhteydet (assosiaatiot)

- viite- alityyppi

Tiedot (attribuutit)

- näkyvyyspublic +protected #private –package ~static (alleviivaus)- nimi (java

notaatio)- tietotyyppi

Toiminnot (metodit)

- näkyvyys- nimi- parametrityypit- palautetyyppi

Page 119: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 125

VuorovaikutuskaavioSekvenssikaavio

Asiakas Automaatti TilitietokantaSyötä kortti

Kysy tunnusluku

Syötä tunnusluku Tarkista käyttäjä

Käyttäjä okKysy nostettava määrä

Syötä summa Tarkista summa

Summa hyväksytty ja vähennettySyötä kortti ulos

Näytä saldo ruudulla

Anna rahat

Hyvästele asiakas

Rahan nosto automaatista

Page 120: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 126

Tilakaavio

Kuvaa yksittäisen olion täydellisen käyttäytymisen

lopputila

alkutila

Page 121: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 127

Tilakaavio

Laskun elinkaari

Luotu

Lähetetty

Maksettu

Arkistoitu

Maksamatta

Kehotus

Suoritettu Perintä

kk-ajo

postitettu

suoritettu

vuosi kulunut

eräpäivä

suoritettu

kuukausi kulunut

oikeuden päätös

suoritettu

ei suoritettu

6 kuukautta

vuosi kulunut

2 kertaa

Ulosottorealisoitu

Page 122: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 128

Komponenttikaavio, pakkauskaavio

• Komponentti kokoaa yhteen saman asian luokat ja tarjoaa käyttäjälle itsellisen, helppokäyttöisen palvelun (määritelmäni eroaa UML:stä)

• Pakkauskaavio ryhmittelee yhteenkuuluvat luokat ylläpitäjän näkökulmasta samaan hakemistoon (namespace, package)

Page 123: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 129

Luentoharjoitus 15

Piirrä LUOKKAKAAVIO lukujärjestys-ohjelmaa varten. Lukujärjestyksiä pitäisi saada opiskelijaryhmälle, opettajalle sekä luokkahuoneelle.

Page 124: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 130

Luentoharjoitus 16

Piirrä TILAKAAVIO ihanteellisesta, television kauko-ohjaimen toiminnasta. Ohjain ohjaa televisiota ja tallentavaa digiboxia.

Page 125: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 133

TIETOKANTALIITTYMÄ

Page 126: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 134

Tietokanta ja rajapinta

Java-ohjelma Java-ohjelma

JDBC API

JDBC-ODBC

silta

Access-ODBCajuri

Oracle-ODBCajuri

Oracleajuri

MySQLajuri

MySQLOracleAcess

Page 127: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Tietokanta -palvelinsovellukset

Miksa 135

Page 128: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 136

MySQL asennus Win -koneeseen

1. Asenna MySQL www.mysql.fi sivulta* Hallinta:

Control panel+Adminstrative tools+Services Automatic/manual/start/stop

2. Asenna joku graafinen hallintatyökalu MySQL workbench (MySQL Administrator + MySQL Query Browser) HeidiSQL Sql-Front Netbeans Workbench

3. Luo tietokanta Käynnistä / MySQL / MySQL Server 5.0 / MySQL Command Line

Client ja kirjoita

CREATE DATABASE javatesti;

GRANT ALL PRIVILEGES ON javatesti.*

to testaaja@localhost identified by ’sala’;

*Win7: Administrator-oikeuksilla

Page 129: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 137

Yhteys tietokantaan

Class.forName(”com.mysql.jdbc.Driver”).newInstance();

// tai lataa mysql-connector-java-5.0.5-bin.jar MySQL-sivuilta

// projektin library-polkuun (ajoaikana CLASSPATH)

MySQL JDBC-ajurin lataaminen (rekisteröinti):

Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”).newInstance();

JDBC-ODBC-sillan lataaminen:

// jdbc:driverityyppi://kone:portti/tietokanta

String url = ”jdbc:mysql://localhost/javatesti”;

con = DriverManager.getConnection(url, ”testaaja”, ”sala”);

// DriverManager luokka voidaan korvata uudemmalla DataSource

// rajapinnalla (joka käyttää yhteysallasta)

Yhteys tietokantaan:

Page 130: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Yhteys tietokantaan 193.167.92.152

• Opiskelijoiden käyttöön tarjolla Linux –palvelin.

String url = "jdbc:mysql://193.167.92.152/javatesti";

con = DriverManager.getConnection(url, "testaaja", "salasana");

– Tietokanta: javatesti– Tunnus: testaaja– Salasana: salasana

• Tietokantaa saa vapaasti käyttää TTY:n verkosta• Tietokannan ylläpitäjältä (Mika) saa uusia tunnuksia

mikäli tarpeen.• Tietokannan ylläpitäjä ei vastaa tietojen säilymisestä…

Make 138

Page 131: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 139

Luo SQL- taulu

CREATE TABLE TUOTTEET (

TID INTEGER NOT NULL PRIMARY KEY,

NIMI VARCHAR(40) NOT NULL,

HINTA FLOAT,

LKM INTEGER DEFAULT 0

);

Page 132: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 140

Luo SQL-indeksit

CREATE INDEX TNIMI ON TUOTTEET(NIMI);

Page 133: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 141

SQL-tietuetoiminnot

INSERT INTO TUOTTEETVALUES (1, ’Korppu’, 2.50, 10);

LISÄYS

PÄIVITYS

POISTO

INSERT INTO TUOTTEET (TID, NIMI, HINTA)

VALUES (2, ’Romppu’, 7.50);

UPDATE TUOTTEETSET HINTA = 6.50, LKM = 100WHERE TID = 2;

DELETE FROM TUOTTEETWHERE TID = 1;

Page 134: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 142

SQL-kysely

SELECT *FROM TUOTTEET;

Kaikki tietueet,kaikki kentät

SELECT TID, NIMI, HINTAFROM TUOTTEET;

Kaikki tietueet,

tietyt kentät

SELECT *FROM TUOTTEETWHERE HINTA < 10 AND LKM >100;

Ehdon tietueet

SELECT *FROM TUOTTEETORDER BY HINTA, NIMI;

Tietueet järjestyksessä

SELECT A.ENIMI, A.SNIMI, T.PVMFROM ASIAKKAAT A, TILAUKSET TWHERE A.ANO = T.ANO;

Tietueita useasta taulusta

Page 135: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 143

Kysely

• Statement– Connection.createStatement()– executeUpdate() // muuttaa kantaa– executeQuery() // palauttaa tietoa kannasta– Close() // sulje statement finally-

lohkossa

Page 136: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 144

Tulosjoukko

• ResultSet– ResultSet rs = stmt.executeQuery(”Select…”);– while (rs.next())– Getxxx() // numerolla tai nimellä– Statement-oliolla vain viimeinen resultset-joukko– Metadatalla yleisiä resultset-käsittelijöitä– createStatement() antaa resultsetille ominaisuuksia

• Selaustapa, päivitettävyys, yhteyskantaan

– Suoraan tiettyyn riviin– Kannan päivitys resultsetin kautta– Uusia/omia tietotyyppejä– Tietolähde (DataSource) erikseen yhteydestä (Connection)

Tietokanta2.java, Tietokanta3.java

Page 137: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 145

Valmistellut kyselyt

• PreparedStatement– PreparedStatement kysely =

Connection.prepareStatement(”Select ?...”);– Kysely.setInt(1, arvo);– ResultSet rs = kysely.executeQuery();

Page 138: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 146

TapahtumatTapahtuma alkaa: Connection.setAutoCommit(false);

Tapahtuma päättyy: Connection.commit();

Tapahtuman peruutus: Connection.rollback();

Tapahtumien eristyvyystasot: Connection.setTransactionIsolation(Connection.TRANSACTION_NONE);

TRANSACTION_NONE

A constant indicating that transactions are not supported.

TRANSACTION_READ_COMMITTED

A constant indicating that dirty reads are prevented; non-repeatable reads and phantom reads can occur. This level only prohibits a transaction from reading a row with uncommitted changes in it.

TRANSACTION_READ_UNCOMMITTED A constant indicating that dirty reads, non-repeatable reads and phantom reads can occur. This level allows a row changed by one transaction to be read by another transaction before any changes in that row have been committed (a "dirty read"). If any of the changes are rolled back, the second transaction will have retrieved an invalid row.

TRANSACTION_REPEATABLE_READ

A constant indicating that dirty reads and non-repeatable reads are prevented; phantom reads can occur. This level prohibits a transaction from reading a row with uncommitted changes in it, and it also prohibits the situation where one transaction reads a row, a second transaction alters the row, and the first transaction rereads the row, getting different values second time (a "non-repeatable read").

TRANSACTION_SERIALIZABLE

A constant indicating that dirty reads, non-repeatable reads and phantom reads are prevented. This level includes the prohibitions in TRANSACTION_REPEATABLE_READ and further prohibits the situation where one transaction reads all rows that satisfy a WHERE condition, a second transaction inserts a row that satisfies that WHERE condition, and the first transaction rereads for the same condition, retrieving the additional row ("phantom“) in the second read.

Page 139: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 150

Luentoharjoitus 17

Listaa asiakkaat.

Page 140: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 151

Luentoharjoitus 18

Listaa asiakkaan tilaamat tuotteet. (Ei duplikaatteja.)

Page 141: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 152

Luentoharjoitus 19

Luodaan tietokantaa käyttävä sovellus eläinkaupalle. • Tekstipohjainen käyttöliittymä: Elainkauppa.java• Tietokannassa Pet-taulu:

int PetID NOT NULL AUTO_INCREMENT

Name varchar(255)AnimalName varchar(255)PRIMARY KEY(PetID)

• Tietokanta.java – LuoYhteys() ja suljeYhteys()– luoTietokanta(), TuhoaTietokanta()– Lisaa(), Poista(), muuta()– TulostaKaikki(), Tulostajarjestyksessa()

• Tulokset hakemistossa: luento9Tietokanta

Page 142: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 158

OHJELMIEN DOKUMENTOINTI

Page 143: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 159

Javadoc

• Voit lisätä erikoiskommentteja ohjelmaasi, joista javadoc-ohjelma pystyy laatimaan dokumentaation html-muotoisena.

/** * Kuvataan dokumentoitavan kokonaisuuden toiminta * (luokka, metodi, tietokenttä) *

* @tag kuvausta tagin osoittamasta asiasta * <i>tekstiä voi muotoilla html tageilla</i> */

Page 144: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 160

Javadoc tageja

@author

@version

@see@since versio

@deprecated

@param

@return

@exception

Javadoc –sourcepath <hakemistot> -d <hakemistot> tiedostot

@see #metodi@see omat.Luokka@see Integer@see Luokka#metodi@see Integer#MAX_VALUE

Luokat ja liittymät Lisäksi metodeissa

Page 145: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 161

Esimerkki luokkakommenteista

/**

* Laskee lainan kuukausimaksun tasaeräperiaatteella

*

* @author Markku Nevanranta

* @version 11.12.2009 alv-muutosten jälkeen

*

*/

Page 146: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 162

Esimerkki metodikommenteista

/**

* Laskee jakson koron pääomalle

*

* @param velka Lainan määrä

* @param pros Vuosikorko väliltä 0-100

* @param jaksot Maksukausien määrä

* @return Koron osuus kauden lyhennyksestä

*

*/

Page 147: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 163

Javadoc Eclipsessä

• Dokumentaatio syntyy oletusarvoisesti projektin doc-hakemistoon

• Javadoc-näkymä näyttää dokumentaation hiirellä valitulle komponentille

• Popup-ikkuna näyttää kun osoitin on komponentin päällä

• Selain näyttää komponentin dokumentaation SHIFT+F2

• Eclipsen selain-ikkuna aukeaa index.html valinnasta

• Esimerkki: Pankkitili2.java

Page 148: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 164

Javadoc Netbeansissä

• Dokumentaatio syntyy oletusarvoisesti projektin dist-hakemistoon

• Osoita editorissa elementtiä, josta haluat dokumettitietoa ja käytä jotakin seuraavista tavoista

1. Hiiren oikealla näppäimellä > Show Javadoc

2. Source > Show documentation (Ctrl+Shift+space)

3. Alt+F1

4. Window > Other > Javadoc

• Esimerkki: Pankkitili2.java

Page 149: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 165

Luentoharjoitus 19

Lisää javadoc-tagit johonkin luokkaasi ja aja javadoc.

Page 150: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 166

SÄIKEET

Page 151: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Säikeen tilat

Make 167

new

runnable

terminated

blocked

ready runcomplete

I/O request

yield()

jvm skeduloi

sleep()

wait()

join()

notify()

notifyAll()

Page 152: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Säikeiden hallinta

start() Käynnistää säikeen

stop() Pysäyttää säikeen

run() Metodi, joka säikeen oliossa käynnistyy

yield() Luopuu suoritusvuorostaan toisten säikeiden hyväksi

sleep() Nukuttaa säikeen annetuksi millisekunttien ajaksi

join() Odottaa annetun ajan (tai ikuisesti) säikeen päättymistä

wait() Laittaa säikeet odottamaan notify() tai notifyAll() kutsua

notify() Herättää oliota odottavista säikeistä yhden satunnaisesti

notifyAll() Herättää kaikki oliota odottavat säikeet

setPriority() Asettaa säikeen prioriteetin

Make 168

Page 153: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Thread-luokkaThread-luokkapublic class Saie1 extends Thread {

public void run(){

System.out.println(”Tämä on säie”);

}

}

Saie1 säie = new Saie1();

säie.start();

Make 169

Runnable-rajapintapublic class Saie2 implements Runnable {

public void run(){

System.out.println(”Tämä on säie”);

}

}

Saie2 oma= new Saie2();

Thread säie = new Thread(oma);

säie.start();• Main on säie• Roskien keruu on säie

Page 154: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Säieluokat ja rajapinnat

Thread-luokka– Thread-luokka implementoi Runnable-rajapinnan– Rajapinta vaatii run-metodin, josta suoritus alkaa– Priorities

• MIN_PRIORITY=1, NORM_PRIORITY=5, MAX_PRIORITY=10• Säie perii luojansa prioriteetin• saie.setPriority(int prio); saie.getPriority();• Käyttöjärjestelmä jakaa java-prosessille aikaa, java (JVM) jakaa säikeille aikaa

– Ei tasojen välistä aikajakoa– yield() ei päästä matalamman prioriteettisia ohi– Kiertovuorottelu (round-robin) kullakin prioriteettitasolla– Pre-emptive (korkeamman prioriteetin työ keskeyttää)

• Säie päättyy kun run() päättyy• ”Ikuinen silmukka” voidaan päättää ulkoapäin volatile boolean muuttujan avulla

Make 170SaieTesti1.java

Page 155: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Synkronointi

• Monitori-koodi valvoo jakamattoman resurssin käyttöä• Monitorin sisällä kriittisestä koodista on tehtävä atominen

operaatio eli yksi säie suorittaa sen alusta loppuun keskeytyksettä (transaktio)

• Monitorin kriittinen koodi ympäröidään ”synchronized”-määreellä (metodi tai koodilohko)

• ”Synchronized” päästää vain yhden säikeen kerrallaan kriittiseen koodiin ja jättää muut odottamaan vuoroaan

• Monitori on oliokohtainen (suojelee yhtä resurssia)• Yhdellä oliolla voi olla vain yksi monitori (samaa resurssia ei

voi suojella monta monitoria)

Make 171

Page 156: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Synkronointi

public synchronized void metodi(){

// tähän metodiin pääsee yksi olio kerrallaan

}

Make 172Monitori.java

synchronized (olioviite){

// tähän lohkoon pääsee yksi olio kerrallaan

}

synchronized (this){

tunnus = opno++;

}

Page 157: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Rinnakkaisuus API

Executor-rajapinta– java.util.concurrent package– Säieallas luo tehokkuutta ja helpottaa säieohjelmointia laajoissa

säikeitä käyttävissä sovelluksissa– Uudet sisäiset rinnakkaisuuteen sopivat tietorakenteet auttavat

ylikuormitustilanteiden hallintaa– Rajapinta vaatii execute-metodin– Executors-luokka on Executer-olioiden ”tehdas”, joka tarjoaa

staattisia palveluja– Esim: ConcurrentHashMap, AtomicInteger,...– ExecutorService-rajapinta laajentaa Executoria ja antaa lisäpalveluja

Make 173

SaieTesti2.java

java.util.concurrent

Page 158: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Swing-synkronointi

1. Jos usea säie päivittää käyttöliittymää saattaa tiedot sekoontua– Näyttöä hoitaa yksi GUI-tapahtumia käsittelevä säie– Useimmat Swingin GUI-komponentit eivät ole synkronoituja– Synkronoi käyttöliittymää hoitava luokka tai metodit

2. Laskentaosa ei saisi pysäyttää käyttöliittymän toimintaa– SwingWorker-luokka hoitaa omassa säikeessään

aikaavievät laskennat ja kommunikoi käyttöliittymäsäikeen kanssa metodeilla

• doInBackground, execute, done, get, publish, process

Make 174Flipper1.java

Page 159: OLIO v12 2014 - students.tut.fisaari5/PLA_32100_2015/esimerkit/olio.pdf · 3 Kurssin suoritus • Kummastakin tentistä saa enintään 10 pistettä. Harjoituksista enintään 10 pistettä

Make 175

Luentoharjoitus 20

Tee graafisia komponentteja, joita päivitetään eri prioriteettisilla säikeillä. Tutki metodien sleep(), wait(), join(), notify(), notifyAll(), yield() toimintaa. Hidasta säikeiden toimintaa sleep()-metodilla, jotta ehdit huomata metodien vaikutuksen.