Tuloksellinen Javaohjelmointi Luku 11 Monimuotoisuus Jukka Harju Jukka

  • Slides: 44
Download presentation
Tuloksellinen Java-ohjelmointi Luku 11 Monimuotoisuus © Jukka Harju, Jukka Juslin 1

Tuloksellinen Java-ohjelmointi Luku 11 Monimuotoisuus © Jukka Harju, Jukka Juslin 1

Nämä kalvot on lisensoitu Creative Commons Attribution-Share. Alike 1. 0 -lisenssillä. Lisäys edelliseen lisenssiin:

Nämä kalvot on lisensoitu Creative Commons Attribution-Share. Alike 1. 0 -lisenssillä. Lisäys edelliseen lisenssiin: Kalvojen muokkaaminen on sallittu vain opettajille, joiden kursseilla käytetään kurssikirjana Tuloksellinen Javaohjelmointi -kirjaa. © Jukka Harju, Jukka Juslin 2

Monimuotoisuus Sisältö 1. Mitä on monimuotoisuus? 2. Monimuotoisuus / viittausmuuttujien käyttö 3. Monimuotoisuus /

Monimuotoisuus Sisältö 1. Mitä on monimuotoisuus? 2. Monimuotoisuus / viittausmuuttujien käyttö 3. Monimuotoisuus / metodien kutsuminen 4. Monimuotoisuuden hyödyntämisen esimerkki 5. Abstraktit luokat ja metodit 6. Abstraktit luokat ja metodit : esimerkki 7. Rajapintaluokka 8. Rajapintaluokka : esimerkki © Jukka Harju, Jukka Juslin 3

Mitä on monimuotoisuus? Monimuotoisuus eli polymorfismi tarkoittaa seuraavaa: • Kaikkia samaan luokkahierarkiaan kuuluvia luokkia

Mitä on monimuotoisuus? Monimuotoisuus eli polymorfismi tarkoittaa seuraavaa: • Kaikkia samaan luokkahierarkiaan kuuluvia luokkia käsitellään kuten yliluokkaa (luokkahierarkia = yliluokka ja kaikki siitä periytetyt luokat). Käytännön hyödyt monimuotoisuudesta: • Ohjelmien laajennettavuus paranee, ohjelmaan voidaan lisätä uusia luokkia ilman muutoksia aiempaan ohjelmakoodiin. • Saman tietorakenteen (esim. taulukko) kautta voidaan käsitellä eri luokkien olioita. © Jukka Harju, Jukka Juslin 4

Monimuotoisuus / viittausmuuttujien käyttö • Aiemmin viittausmuuttujan tyyppi on aina ollut olion luokan mukainen.

Monimuotoisuus / viittausmuuttujien käyttö • Aiemmin viittausmuuttujan tyyppi on aina ollut olion luokan mukainen. – Esim. Tietokone laite = new Tietokone(); Viittausmuuttujan tyyppi Monimuotoisuus mahdollistaa seuraavan: • Määritellään viittausmuuttujan tyypiksi luokkahierarkian kantaluokka. • Kantaluokaksi voi valita haluamansa luokan, luokkahierarkia lähtee kantaluokasta alaspäin (kantaluokka voi siis olla muunkin tyyppinen kuin Object). © Jukka Harju, Jukka Juslin 5

monimuotoisuus / viittausmuuttujien käyttö Esimerkki 1. monimuotoisuus / viittausmuuttujien sallittuja käyttötapoja. public class Tietokone.

monimuotoisuus / viittausmuuttujien käyttö Esimerkki 1. monimuotoisuus / viittausmuuttujien sallittuja käyttötapoja. public class Tietokone. Sovellus { public void kaynnista. Sovellus(){ //tämä on tuttua… Kannettava laite = new Kannettava(); //mutta monimuotoisuuden ansiosta //voimme tehdä myös näin: Tietokone laite = new Kannettava(); //tai jopa näin: Object laite 1 = new Kannettava(); Object laite 2 = new Tietokone(); } . . . } © Jukka Harju, Jukka Juslin 6

Monimuotoisuus / viittausmuuttujien käyttö • Edellä todettiin, että yliluokan tyyppisen viittausmuuttujan käyttö on mahdollista

Monimuotoisuus / viittausmuuttujien käyttö • Edellä todettiin, että yliluokan tyyppisen viittausmuuttujan käyttö on mahdollista aliluokan oliolle. • Tämä johtuu siitä, että aliluokan ja yliluokan olioiden välillä on “olla”-tyyppinen suhde: aliluokan olio on myös yliluokan olio, esimerkiksi kannettava tietokone on tietokone. • Toisinpäin asia ei ole mahdollinen, eli aliluokan tyyppiseen viittausmuuttujaan ei voida sijoittaa viitettä yliluokan olioon! © Jukka Harju, Jukka Juslin 7

monimuotoisuus / viittausmuuttujien käyttö Esimerkki 2. Yritys viitata yliluokan olioon aliluokan tyyppisestä viittausmuuttujasta. Virhe!

monimuotoisuus / viittausmuuttujien käyttö Esimerkki 2. Yritys viitata yliluokan olioon aliluokan tyyppisestä viittausmuuttujasta. Virhe! Ei mene käännöksestä läpi! public class Tietokone. Sovellus { public void kaynnista. Sovellus(){ Kannettava laite = new Tietokone(); } . . . } © Jukka Harju, Jukka Juslin 8

Monimuotoisuus Sisältö 1. Mitä on monimuotoisuus? 2. Monimuotoisuus / viittausmuuttujien käyttö 3. Monimuotoisuus /

Monimuotoisuus Sisältö 1. Mitä on monimuotoisuus? 2. Monimuotoisuus / viittausmuuttujien käyttö 3. Monimuotoisuus / metodien kutsuminen 4. Monimuotoisuuden hyödyntämisen esimerkki 5. Abstraktit luokat ja metodit 6. Abstraktit luokat ja metodit : esimerkki 7. Rajapintaluokka 8. Rajapintaluokka : esimerkki © Jukka Harju, Jukka Juslin 9

Monimuotoisuus / metodien kutsuminen • Edellä todettiin, että yliluokan tyyppisen viittausmuuttujan käyttö on mahdollista

Monimuotoisuus / metodien kutsuminen • Edellä todettiin, että yliluokan tyyppisen viittausmuuttujan käyttö on mahdollista aliluokan oliolle. • Mitä tapahtuu, kun aliluokan oliolle kutsutaan metodia yliluokan tyyppisen viittausmuuttujan kautta? • Java tukee monimuotoisuutta Java tutkii ajon aikana minkä luokan olioon viittausmuuttuja todellisuudessa viittaa. • Kutsuttu metodi suoritetaan siitä luokasta, jonka olio on kyseessä. • Edellä kuvattua toimintaa kutsutaan nimellä dynaaminen sidonta. © Jukka Harju, Jukka Juslin 10

Monimuotoisuus / metodien kutsuminen Esimerkki 1. Tilanne jossa ei esiinny monimuotoisuutta. Oletetaan että to.

Monimuotoisuus / metodien kutsuminen Esimerkki 1. Tilanne jossa ei esiinny monimuotoisuutta. Oletetaan että to. String-metodi on toteutettu sekä luokkaan Tietokone että luokkaan Kannettava. public class Tietokone. Sovellus { public void kaynnista. Sovellus() { Kannettava laite = new Kannettava(); String laitetiedot = laite. to. String(); } . . . } Viittausmuuttujan tyyppi on sama kuin olion luokka. Lienee intuitiivisestikin selvää että tässä kutsutaan luokassa Kannettava toteutettua to. String-metodia. © Jukka Harju, Jukka Juslin 11

Monimuotoisuus / metodien kutsuminen Esimerkki 2. Polymorfinen tilanne. Oletetaan että to. String-metodi on toteutettu

Monimuotoisuus / metodien kutsuminen Esimerkki 2. Polymorfinen tilanne. Oletetaan että to. String-metodi on toteutettu sekä luokkaan Tietokone että luokkaan Kannettava. public class Tietokone. Sovellus { public void kaynnista. Sovellus() { Tietokone laite = new Kannettava(); System. out. println(laite. to. String()); } . . . } Viittausmuuttujan tyyppinä on yliluokka. Jos to. String-metodi on toteutettu sekä luokkaan Tietokone että luokkaan Kannettava, niin kumpaa tässä kutsutaan? © Jukka Harju, Jukka Juslin 12

Monimuotoisuus / metodien kutsuminen Esimerkki 3. Polymorfinen tilanne. Oletetaan että to. String-metodia ei ole

Monimuotoisuus / metodien kutsuminen Esimerkki 3. Polymorfinen tilanne. Oletetaan että to. String-metodia ei ole toteutettu luokkaan Tietokone, eikä myöskään luokkaan Kannettava. public class Tietokone. Sovellus { public void kaynnista. Sovellus() { Tietokone laite = new Kannettava(); System. out. println(laite. to. String()); } . . . } Viittausmuuttujan tyyppinä on yliluokka. Minkä luokan to. String-metodille tämä kutsu ohjautuu? © Jukka Harju, Jukka Juslin 13

Monimuotoisuus / metodien kutsuminen • Esimerkistä 3 havaitaan, että kutsuttua metodia etsitään aina ensinnä

Monimuotoisuus / metodien kutsuminen • Esimerkistä 3 havaitaan, että kutsuttua metodia etsitään aina ensinnä olion mukaisesta luokasta. • Metodin on kuitenkin oltava määriteltynä myös viittausmuuttujan mukaisessa yliluokassa! • Mikäli olion luokassa ei ole toteutettu kutsuttua metodia, etsitään sitä seuraavaksi luokkahierarkiassa yhtä tasoa ylempänä olevasta luokasta. • Mikäli metodia ei löydy, päädytään lopulta etsimään (ja esimerkissä 3 myös käyttämään) Javan Objectluokan metodia. © Jukka Harju, Jukka Juslin 14

Monimuotoisuus / metodien kutsuminen Esimerkki 4. Polymorfinen tilanne. Oletetaan että Kannettava-luokkaan on toteutettu metodi

Monimuotoisuus / metodien kutsuminen Esimerkki 4. Polymorfinen tilanne. Oletetaan että Kannettava-luokkaan on toteutettu metodi nimeltä tutki. Akkua. Jaljella, jota ei kuitenkaan ole määritelty luokassa Tietokone. Virhe! Ei mene käännöksestä läpi, koska metodia public class Tietokone. Sovellus { tutki. Akkua. Jaljella ei ole lainkaan määritettynä yliluokassa. public void kaynnista. Sovellus(){ Tietokone laite = new Kannettava(); double akkua. Jaljella = laite. tutki. Akkua. Jaljella(); } . . . } © Jukka Harju, Jukka Juslin 15

Monimuotoisuus / metodien kutsuminen Esimerkki 5. Polymorfinen tilanne. Oletetaan että Kannettava-luokkaan on toteutettu metodi

Monimuotoisuus / metodien kutsuminen Esimerkki 5. Polymorfinen tilanne. Oletetaan että Kannettava-luokkaan on toteutettu metodi to. String, jota ei kuitenkaan ole toteutettu luokkaan Tietokone. public class Tietokone. Sovellus { public void kaynnista. Sovellus(){ Tietokone laite = new Kannettava(); System. out. println(laite); } . . . } Tässä tapahtuu to. String-metodin kutsu, saadaanko virheilmoituksia? Vastaus: Ohjelma toimii, koska to. String-metodi on peritty Object-luokasta luokkaan Tietokone. © Jukka Harju, Jukka Juslin 16

Monimuotoisuus / yhteenveto • Yliluokan tyyppisen viittausmuuttujan käyttö on mahdollista aliluokan oliolle. • Aliluokan

Monimuotoisuus / yhteenveto • Yliluokan tyyppisen viittausmuuttujan käyttö on mahdollista aliluokan oliolle. • Aliluokan metodien kutsuminen onnistuu yliluokan tyyppisen viittausmuuttujan kautta, kunhan kutsuttava metodi on määritelty myös yliluokassa. • Yliluokan olioon ei voi viitata aliluokan tyyppisen viittausmuuttujan kautta. • Aliluokan oliota voidaan käsitellä kuten yliluokan oliota. © Jukka Harju, Jukka Juslin 17

Monimuotoisuus / esimerkki • Toteutetaan palkanlaskentaohjelmisto monimuotoisuutta hyödyntäen. • Alussa vain yksi työntekijätyyppi: kuukausipalkkainen.

Monimuotoisuus / esimerkki • Toteutetaan palkanlaskentaohjelmisto monimuotoisuutta hyödyntäen. • Alussa vain yksi työntekijätyyppi: kuukausipalkkainen. • Myöhemmin halutaan laajentaa ohjelmaa esim. tuntipalkkaisilla työntekijöillä. © Jukka Harju, Jukka Juslin 18

Monimuotoisuus / esimerkki • Alkutilanne on oheisen luokkakaavion mukainen. • Tyontekija-luokassa määritellään kaikille aliluokille

Monimuotoisuus / esimerkki • Alkutilanne on oheisen luokkakaavion mukainen. • Tyontekija-luokassa määritellään kaikille aliluokille yhteisen attribuutit ja metodit. • Kuukausipalkkainenluokkaan on lisätty tarvittava kuukausipalkka-attribuutti. © Jukka Harju, Jukka Juslin 19

Monimuotoisuus / esimerkki • Tyontekija-luokan Java-toteutus /** * Tyontekija-luokka kuvaa työntekijöiden yhteiset * ominaisuudet

Monimuotoisuus / esimerkki • Tyontekija-luokan Java-toteutus /** * Tyontekija-luokka kuvaa työntekijöiden yhteiset * ominaisuudet ja toiminnot * @author Jukka Harju */ public class Tyontekija { private String etunimi; private String sukunimi; private String hetu; public Tyontekija(String etunimi, String sukunimi, String hetu) { set. Etunimi(etunimi); set. Sukunimi(sukunimi); set. Hetu(hetu); } public String get. Etunimi() { return etunimi; } public void set. Etunimi(String etunimi) { if ((etunimi != null) && (etunimi. length() > 0)) { this. etunimi = etunimi; } else { System. out. println("Etunimi " + etunimi + " ei ole sallittu!"); } } © Jukka Harju, Jukka Juslin 20

Monimuotoisuus / esimerkki public String get. Hetu() { return hetu; } public void set.

Monimuotoisuus / esimerkki public String get. Hetu() { return hetu; } public void set. Hetu(String hetu) { if ((etunimi != null) && (hetu. length() == 11)) { this. hetu = hetu; } else { System. out. println("Hetu " + hetu + " ei ole sallittu!"); } } public String get. Sukunimi() { return sukunimi; } public void set. Sukunimi(String sukunimi) { if ((sukunimi != null) && (sukunimi. length() > 0)) { this. sukunimi = sukunimi; } else { System. out. println("Sukunimi " + sukunimi + " ei ole sallittu!"); } } public String to. String() { return "Henkilo: " + etunimi + " " + sukunimi + ", hetu: " + hetu; } } © Jukka Harju, Jukka Juslin 21

Monimuotoisuus / esimerkki • Kuukausipalkkainen-luokan Java-toteutus /** * Kuukausipalkkainen-luokka kuvaa kuukausipalkkaisen * työntekijän ominaisuudet

Monimuotoisuus / esimerkki • Kuukausipalkkainen-luokan Java-toteutus /** * Kuukausipalkkainen-luokka kuvaa kuukausipalkkaisen * työntekijän ominaisuudet ja toiminnot * @author Jukka Harju */ public class Kuukausipalkkainen extends Tyontekija { private double kuukausipalkka; public Kuukausipalkkainen( String etunimi, String sukunimi, String hetu, double kuukausipalkka) { super(etunimi, sukunimi, hetu); set. Kuukausipalkka(kuukausipalkka ); } public double get. Kuukausipalkka() { return kuukausipalkka; } public void set. Kuukausipalkka(double kuukausipalkka) { if (kuukausipalkka > 0) { this. kuukausipalkka = kuukausipalkka; } else { System. out. println( "Kuukausipalkka " + kuukausipalkka + " ei ole sallittu!"); } } public String to. String() { return super. to. String() + ", palkka: " + kuukausipalkka; } © Jukka Harju, Jukka Juslin } 22

Monimuotoisuus / esimerkki • Monimuotoisuuden hyödyntäminen sovellusluokassa. /** * Sovellus hyödyntää monimuotoisuutta työntekijöiden käsittelemisessä.

Monimuotoisuus / esimerkki • Monimuotoisuuden hyödyntäminen sovellusluokassa. /** * Sovellus hyödyntää monimuotoisuutta työntekijöiden käsittelemisessä. * @author Jukka Harju */ public class Palkkasovellus { public void kaynnista. Sovellus() { //alustetaan henkilöstön tiedot Tyontekija[] henkilosto = new Tyontekija[4]; henkilosto[0] = new Kuukausipalkkainen("Larry", "Brown", "010168 -1112", 5500); henkilosto[1] = new Kuukausipalkkainen("Paul", "Anderson", "131175 -5531", 7500); henkilosto[2] = new Kuukausipalkkainen("Mark", "Johnson", "010163 -882 A", 11800); henkilosto[3] = new Tyontekija("Marty", "Hall", "020371 -2234"); //tulostetaan koko henkilöstön tiedot for (int i = 0; i < henkilosto. length; i++) { if(henkilosto[i] != null) { System. out. println(henkilosto[i ]); } } public static void main(String[] args) { Palkkasovellus = new Palkkasovellus(); sovellus. kaynnista. Sovellus (); } © Jukka Harju, Jukka Juslin } 23

Monimuotoisuus / esimerkki • • • Toteutetaan ohjelmaan laajennus: lisätään tuntipalkkainen työntekijä. Hyödynnetään laajentamisessa

Monimuotoisuus / esimerkki • • • Toteutetaan ohjelmaan laajennus: lisätään tuntipalkkainen työntekijä. Hyödynnetään laajentamisessa monimuotoisuutta: luokkien Tyontekija ja Tuntipalkkainen koodia ei tarvitse mitenkään muuttaa. Myös sovelluksen tietyt osat (esimerkissämme tulostus) toimivat ilman että niitä tarvitsee lainkaan muuttaa. © Jukka Harju, Jukka Juslin 24

Monimuotoisuus / esimerkki • Tuntipalkkainen-luokan Java-toteutus. /** * Tuntipalkkainen-luokka kuvaa tuntipalkkaisen * työntekijän ominaisuudet

Monimuotoisuus / esimerkki • Tuntipalkkainen-luokan Java-toteutus. /** * Tuntipalkkainen-luokka kuvaa tuntipalkkaisen * työntekijän ominaisuudet ja toiminnot * * @author Jukka Harju */ public class Tuntipalkkainen extends Tyontekija { private double tuntipalkka; private double tehdyt. Tunnit; public Tuntipalkkainen(String etunimi, String sukunimi, String hetu, double tuntipalkka, double tehdyt. Tunnit) { super(etunimi, sukunimi, hetu); set. Tuntipalkka(tuntipalkka ); set. Tehdyt. Tunnit(tehdyt. Tunnit ); } public double get. Tehdyt. Tunnit() { return tehdyt. Tunnit; } © Jukka Harju, Jukka Juslin 25

Monimuotoisuus / esimerkki public void set. Tehdyt. Tunnit(double tehdyt. Tunnit) { if ((tehdyt. Tunnit

Monimuotoisuus / esimerkki public void set. Tehdyt. Tunnit(double tehdyt. Tunnit) { if ((tehdyt. Tunnit > 0) && (tehdyt. Tunnit <= (4 * 80))) { this. tehdyt. Tunnit = tehdyt. Tunnit; } else { System. out. println( "Tunteja saa tehdä vain välillä 0 -80 per viikko. "); } } public double get. Tuntipalkka() { return tuntipalkka; } public void set. Tuntipalkka(double tuntipalkka) { if (tuntipalkka > 0) { this. tuntipalkka = tuntipalkka; } else { System. out. println( "Tuntipalkka " + tuntipalkka + " ei ole sallittu!"); } } public String to. String() { return super. to. String() + ", tuntipalkka: " + tuntipalkka + ", tehdyt tunnit: " + tehdyt. Tunnit; } } © Jukka Harju, Jukka Juslin 26

Monimuotoisuus / esimerkki • Laajennettu sovellus Javalla. /** * Sovellus hyödyntää monimuotoisuutta työntekijöiden käsittelemisessä.

Monimuotoisuus / esimerkki • Laajennettu sovellus Javalla. /** * Sovellus hyödyntää monimuotoisuutta työntekijöiden käsittelemisessä. * @author Jukka Harju */ public class Palkkasovellus { Ainoa tarvittava public void kaynnista. Sovellus() { muutos on uuden //alustetaan henkilöstön tiedot Tyontekija[] henkilosto = new Tyontekija[4]; työntekijätyypin käyttäminen olion henkilosto[0] = luonnissa! new Kuukausipalkkainen("Larry", "Brown", "010168 -1112", 5500); henkilosto[1] = new Kuukausipalkkainen("Paul", "Anderson", "131175 -5531", 7500); henkilosto[2] = new Tuntipalkkainen("Mark", "Johnson", "010163 -882 A", 45. 5, 165); henkilosto[3] = new Tyontekija("Marty", "Hall", "020371 -2234"); //tulostetaan koko henkilöstön tiedot for (int i = 0; i < henkilosto. length; i++) { if(henkilosto[i] != null) { System. out. println(henkilosto[i ]); } } public static void main(String[] args) { Palkkasovellus = new Palkkasovellus(); sovellus. kaynnista. Sovellus (); } © Jukka Harju, Jukka Juslin } 27

Monimuotoisuus Sisältö 1. Mitä on monimuotoisuus? 2. Monimuotoisuus / viittausmuuttujien käyttö 3. Monimuotoisuus /

Monimuotoisuus Sisältö 1. Mitä on monimuotoisuus? 2. Monimuotoisuus / viittausmuuttujien käyttö 3. Monimuotoisuus / metodien kutsuminen 4. Monimuotoisuuden hyödyntämisen esimerkki 5. Abstraktit luokat ja metodit 6. Abstraktit luokat ja metodit : esimerkki 7. Rajapintaluokka 8. Rajapintaluokka : esimerkki © Jukka Harju, Jukka Juslin 28

Abstrakti luokka • Abstraktit luokka esiintyy aina yliluokkana. • Abstraktista luokasta ei voida luoda

Abstrakti luokka • Abstraktit luokka esiintyy aina yliluokkana. • Abstraktista luokasta ei voida luoda oliota abstraktia luokkaa käytetään aina siitä periytettyjen konkreettisten luokkien kautta. • Abstraktissa luokassa toteutetaan vain aliluokille yhteisen komponentit, useimmiten abstraktit luokat eivät edes toimisi kunnolla vaikka niistä voisikin luoda olion. • UML-luokkakaaviossa abstraktin luokan nimi kirjoitetaan kursiivilla. © Jukka Harju, Jukka Juslin 29

Abstrakti luokka & Java • Javassa abstraktin luokan määrittelyssä käytetään avainsanaa abstract. • Abstrakti

Abstrakti luokka & Java • Javassa abstraktin luokan määrittelyssä käytetään avainsanaa abstract. • Abstrakti luokka sisältää tyypillisesti yhden tai useampia abstrakteja metodeja public abstract double laske. Viikkopalkka(); • Abstrakti metodi: – Pelkkä metodin määrittely, ei sisällä lainkaan { }-merkkien sisään (metodilohkoon) tulevaan toteutusta. – Abstraktit metodit täytyy korvata aliluokassa. © Jukka Harju, Jukka Juslin 30

Esimerkki: Abstraktien luokkien ja metodien käyttö • Tehtävä: luo palkkaohjelmisto – Käytä abstrakteja metodeja

Esimerkki: Abstraktien luokkien ja metodien käyttö • Tehtävä: luo palkkaohjelmisto – Käytä abstrakteja metodeja ja monimuotoisuutta. • Ongelman asettelu – 2 työntekijätyyppiä, palkat maksetaan viikoittain • Kuukausipalkkainen (kiinteä palkka, työtunneilla ei väliä) • Tuntipalkkainen (ylityö [>40 tuntia] maksetaan 1, 5 – kertaisena) © Jukka Harju, Jukka Juslin 31

Esimerkki: Abstraktien luokkien ja metodien käyttö • Toteutetaan yliluokkaan Tyontekija abstrakti metodi laske. Viikkopalkka

Esimerkki: Abstraktien luokkien ja metodien käyttö • Toteutetaan yliluokkaan Tyontekija abstrakti metodi laske. Viikkopalkka (palauttaa palkan). – Yliluokassa Tyontekija on oltava määriteltynä metodi laske. Viikkopalkka, sillä muutoin monimuotoisuutta ei voida käyttää. – Metodi on abstrakti koska palkka riippuu työntekijän tyypistä. – Geneeriselle työntekijälle ei voida laskea palkkaa. • Kielletään samalla Tyontekija-luokan olioiden luonti, koska jokaiselle työntekijälle on oltava tiedossa palkka tehdään Tyontekijaluokasta abstrakti. © Jukka Harju, Jukka Juslin 32

Esimerkki: Abstraktien luokkien ja metodien käyttö /** * Tyontekija-luokka kuvaa työntekijöiden yhteiset Tyontekija-luokka on

Esimerkki: Abstraktien luokkien ja metodien käyttö /** * Tyontekija-luokka kuvaa työntekijöiden yhteiset Tyontekija-luokka on * ominaisuudet ja toiminnot määritelty abstraktiksi. * @author Jukka Harju */ public abstract class Tyontekija { private String etunimi; private String sukunimi; private String hetu; public Tyontekija(String etunimi, String sukunimi, String hetu) { set. Etunimi(etunimi); set. Sukunimi(sukunimi); set. Hetu(hetu); } Luokassa määritelty abstrakti . metodi laske. Viikkopalkka. //tästä välistä on poistettu koodia. public abstract double laske. Viikkopalkka(); } © Jukka Harju, Jukka Juslin 33

Esimerkki: Abstraktien luokkien ja metodien käyttö /** * Kuukausipalkkainen-luokka kuvaa kuukausipalkkaisen * työntekijän ominaisuudet

Esimerkki: Abstraktien luokkien ja metodien käyttö /** * Kuukausipalkkainen-luokka kuvaa kuukausipalkkaisen * työntekijän ominaisuudet ja toiminnot * @author Jukka Harju */ public class Kuukausipalkkainen extends Tyontekija { private double kuukausipalkka; . //tästä välistä on poistettu koodia. /** * Metodi laskee ja palauttaa työntekijan kuukauden palkan. Kuukausipalkkainen * luokassa korvataan yliluokan * @return kuukausipalkka abstrakti metodi */ laske. Viikkopalkka. public double laske. Viikkopalkka() { return kuukausipalkka / 4; } } © Jukka Harju, Jukka Juslin 34

Esimerkki: Abstraktien luokkien ja metodien käyttö /** * Tuntipalkkainen-luokka kuvaa tuntipalkkaisen * työntekijän ominaisuudet

Esimerkki: Abstraktien luokkien ja metodien käyttö /** * Tuntipalkkainen-luokka kuvaa tuntipalkkaisen * työntekijän ominaisuudet ja toiminnot * @author Jukka Harju */ public class Tuntipalkkainen extends Tyontekija { private double tuntipalkka; private double tehdyt. Tunnit; . //tästä välistä on poistettu koodia. public double laske. Viikkopalkka() { double palkka = 0; Tuntipalkkainen-luokassa korvataan yliluokan abstrakti metodi laske. Viikkopalkka. if (tehdyt. Tunnit <= 40) { palkka = tehdyt. Tunnit * tuntipalkka; } else { Mahdollinen ylityö tulee palkka = huomioida. palkka + (40 * tuntipalkka) + ((tehdyt. Tunnit - 40) * 1. 5 * tuntipalkka); } return palkka; } } © Jukka Harju, Jukka Juslin 35

Esimerkki: Abstraktien luokkien ja metodien käyttö public class Palkkasovellus 2 { public void kaynnista.

Esimerkki: Abstraktien luokkien ja metodien käyttö public class Palkkasovellus 2 { public void kaynnista. Sovellus() { //alustetaan henkilöstön tiedot Tyontekija[] henkilosto = new Tyontekija[4]; henkilosto[0] = new Kuukausipalkkainen("Larry", "Brown", "010168 -1112", 5500); henkilosto[1] = new Kuukausipalkkainen("Paul", "Anderson", "131175 -5531", 7500); Tyontekija henkilosto[2] = luokasta ei voida new Tuntipalkkainen("Mark", "Johnson", "010163 -882 A", 100, 50); enää luoda oliota. //henkilosto[3] = new Tyontekija("Marty", "Hall", "020371 -2234"); //tulostetaan koko henkilöstön tiedot: nimi ja palkka ja viikkopalkka Tulostetaan myös for (int i = 0; i < henkilosto. length; i++) { viikkopalkka. if (henkilosto[i] != null) { System. out. println(henkilosto[i ]); System. out. println( "viikkopalkka = " + henkilosto[i]. laske. Viikkopalkka () + "n"); } } public static void main(String[] args) { Palkkasovellus 2 sovellus = new Palkkasovellus 2(); sovellus. kaynnista. Sovellus (); } } © Jukka Harju, Jukka Juslin 36

Kertaus: final-metodit ja -luokat • final-metodit – Ei voida korvata. – private-metodit ovat implisiittisesti

Kertaus: final-metodit ja -luokat • final-metodit – Ei voida korvata. – private-metodit ovat implisiittisesti määriteltyjä final-tyyppisiksi. – static-metodit ovat implisiittisesti määriteltyjä final-tyyppisiksi. • final-luokat – Eivät voi olla yliluokkana. – final–luokkien metodit ovat implisiittisesti määriteltyjä final-tyyppisiksi. – esim. luokka String • final-attribuutit? © Jukka Harju, Jukka Juslin 37

Monimuotoisuus Sisältö 1. Mitä on monimuotoisuus? 2. Monimuotoisuus / viittausmuuttujien käyttö 3. Monimuotoisuus /

Monimuotoisuus Sisältö 1. Mitä on monimuotoisuus? 2. Monimuotoisuus / viittausmuuttujien käyttö 3. Monimuotoisuus / metodien kutsuminen 4. Monimuotoisuuden hyödyntämisen esimerkki 5. Abstraktit luokat ja metodit 6. Abstraktit luokat ja metodit : esimerkki 7. Rajapintaluokka 8. Rajapintaluokka : esimerkki © Jukka Harju, Jukka Juslin 38

Rajapintaluokka • Määrittely alkaa avainsanalla interface. • Sisältää vain public abstract –tyyppisiä metodeja. •

Rajapintaluokka • Määrittely alkaa avainsanalla interface. • Sisältää vain public abstract –tyyppisiä metodeja. • Luokkien (jotka toteuttavat rajapinnan) täytyy toteuttaa kyseiset metodit. • Ei sisällä lainkaan attribuutteja. • Luokat toteuttavat rajapinnan (ja sen metodit) – avainsana implements: public class Tietokone implements Taltioitava © Jukka Harju, Jukka Juslin 39

Rajapintaluokat UML luokkakaaviossa • UML-luokkakaaviossa luokalla ei attribuutteja • Luokan nimen edessä <<interface>>-merkintä. •

Rajapintaluokat UML luokkakaaviossa • UML-luokkakaaviossa luokalla ei attribuutteja • Luokan nimen edessä <<interface>>-merkintä. • Rajapinnan toteuttaminen : nuolityyppi muuten kuten periytymisessä, mutta katkoviivalla. © Jukka Harju, Jukka Juslin 40

Rajapintojen luominen ja käyttö • Useiden rajapintojen toteuttaminen – Toteutettavat rajapinnat luetellaan pilkulla eroteltuina

Rajapintojen luominen ja käyttö • Useiden rajapintojen toteuttaminen – Toteutettavat rajapinnat luetellaan pilkulla eroteltuina avainsanan implements jälkeen. • Vakiotiedot voidaan määritellä rajapintaa käyttäen public interface VAKIOT { public static final int YKSI = 1; public static final int KAKSI = 2; public static final int KOLME = 3; } © Jukka Harju, Jukka Juslin 41

Esimerkki: Rajapintaluokan käyttö • Rajapintaluokassa Taltioitava taltioitava määritellään metodit taltioi. Tiedot ja palauta. Tiedot,

Esimerkki: Rajapintaluokan käyttö • Rajapintaluokassa Taltioitava taltioitava määritellään metodit taltioi. Tiedot ja palauta. Tiedot, jotka tulee toteuttaa rajapinnan mukaisissa luokissa. /** * Taltioitava-rajapinta määrittelee taltioitavalle * oliolle pakolliset metodit. * @author Jukka Harju */ public interface Taltioitava { public abstract String taltioi. Tiedot(); public abstract void palauta. Tiedot(String tiedot); } Rajapintaluokassa vain abstrakteja metodeja! © Jukka Harju, Jukka Juslin 42

Luokka Tietokone toteuttaa rajapinnan Taltioitava. Esimerkki: Rajapintaluokan käyttö public class Tietokone implements Taltioitava {

Luokka Tietokone toteuttaa rajapinnan Taltioitava. Esimerkki: Rajapintaluokan käyttö public class Tietokone implements Taltioitava { private int muisti; Tässä kohden normaalisti set-, get private String prosessori; . . . - yms. metodit, esimerkistä näkyy /** vain osa. * Taltioi attribuuttien arvot merkkijonoon * '|'-merkillä eroteltuina. * * @return tiedot Attribuuttien taltioidut arvot. */ public String taltioi. Tiedot() { String tiedot = muisti + "r" + prosessori; return tiedot; Luokkaan on toteutettava } rajapinnan Taltioitava /** määräämät metodit. * Palauttaa arvot attribuuteille. * * @param tiedot Merkkijono jossa palautettavat arvot * sijaitsevat. */ public void palauta. Tiedot(String tiedot) { if (tiedot != null) { String[] attribuutit = tiedot. split("r"); muisti = Integer. parse. Int(attribuutit[ 0]); prosessori = attribuutit[1]; } else { System. out. println("Tietojen palautus ei onnistunut!"); } } © Jukka Harju, Jukka Juslin } 43

Esimerkki: Rajapintaluokan käyttö Sovellus luo Tietokone-olion ja tallettaa sen tiedot tiedostoon. Tiedostosta tiedot palautetaan

Esimerkki: Rajapintaluokan käyttö Sovellus luo Tietokone-olion ja tallettaa sen tiedot tiedostoon. Tiedostosta tiedot palautetaan toiselle Tietokone-luokan oliolle. public class Taltiointisovellus { private void aja() { Tietokone oma. Kone = new Tietokone(2048, "Intel"); String oman. Koneen. Tiedot = oma. Kone. taltioi. Tiedot(); /* * Tähän koodi jossa tiedot kirjoitetaan tiedostoon! */ /* * Tähän koodi jossa tiedot luetaan tiedostosta! */ Tietokone palautettu. Oma. Kone = new Tietokone(); palautettu. Oma. Kone. palauta. Tiedot(oman. Koneen. Tiedot ); } public static void main(String[] args) { Taltiointisovellus ohjelma = new Taltiointisovellus(); ohjelma. aja(); } } © Jukka Harju, Jukka Juslin 44