Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

© Jukka Harju, Jukka Juslin1 Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 13 Monimuotoisuus.

Samankaltaiset esitykset


Esitys aiheesta: "© Jukka Harju, Jukka Juslin1 Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 13 Monimuotoisuus."— Esityksen transkriptio:

1 © Jukka Harju, Jukka Juslin1 Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 13 Monimuotoisuus

2 © Jukka Harju, Jukka Juslin2 Nämä kalvot on lisensoitu Creative Commons Attribution-ShareAlike 1.0 -lisenssillä. Lisäys edelliseen lisenssiin: Kalvojen muokkaaminen on sallittu vain opettajille, joiden kursseilla käytetään kurssikirjana Tuloksellinen Java-ohjelmointi – tai Java ohjelmointi opas ammattimaiseen osaamiseen -kirjaa.Creative Commons Attribution-ShareAlike 1.0 -lisenssillä

3 © Jukka Harju, Jukka Juslin3 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

4 © Jukka Harju, Jukka Juslin4 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.

5 © Jukka Harju, Jukka Juslin5 Monimuotoisuus / viittausmuuttujien käyttö •Aiemmin viittausmuuttujan tyyppi on aina ollut olion luokan mukainen. –Esim. Tietokone laite = new Tietokone(); 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 ). Viittausmuuttujan tyyppi

6 © Jukka Harju, Jukka Juslin6 monimuotoisuus / viittausmuuttujien käyttö Esimerkki 1. monimuotoisuus / viittausmuuttujien sallittuja käyttötapoja. public class TietokoneSovellus { public void kaynnistaSovellus(){ //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 laite1 = new Kannettava(); Object laite2 = new Tietokone(); }... }

7 © Jukka Harju, Jukka Juslin7 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!

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

9 © Jukka Harju, Jukka Juslin9 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 Monimuotoisuus

10 © Jukka Harju, Jukka Juslin10 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.

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

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

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

14 © Jukka Harju, Jukka Juslin14 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 Object -luokan metodia.

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

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

17 © Jukka Harju, Jukka Juslin17 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.

18 © Jukka Harju, Jukka Juslin18 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ä.

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

20 © Jukka Harju, Jukka Juslin20 •Tyontekija -luokan Java-toteutus Monimuotoisuus / esimerkki /** * 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) { setEtunimi(etunimi); setSukunimi(sukunimi); setHetu(hetu); } public String getEtunimi() { return etunimi; } public void setEtunimi(String etunimi) { if ((etunimi != null) && (etunimi.length() > 0)) { this.etunimi = etunimi; } else { System.out.println("Etunimi " + etunimi + " ei ole sallittu!"); } }

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

22 © Jukka Harju, Jukka Juslin22 •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); setKuukausipalkka(kuukausipalkka); } public double getKuukausipalkka() { return kuukausipalkka; } public void setKuukausipalkka(double kuukausipalkka) { if (kuukausipalkka > 0) { this.kuukausipalkka = kuukausipalkka; } else { System.out.println( "Kuukausipalkka " + kuukausipalkka + " ei ole sallittu!"); } } public String toString() { return super.toString() + ", palkka: " + kuukausipalkka; } } Monimuotoisuus / esimerkki

23 © Jukka Harju, Jukka Juslin23 •Monimuotoisuuden hyödyntäminen sovellusluokassa. /** * Sovellus hyödyntää monimuotoisuutta työntekijöiden käsittelemisessä. * @author Jukka Harju */ public class Palkkasovellus { public void kaynnistaSovellus() { //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-882A", 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 sovellus = new Palkkasovellus(); sovellus.kaynnistaSovellus(); } } Monimuotoisuus / esimerkki

24 © Jukka Harju, Jukka Juslin24 •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. Monimuotoisuus / esimerkki

25 © Jukka Harju, Jukka Juslin25 •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 tehdytTunnit; public Tuntipalkkainen(String etunimi, String sukunimi, String hetu, double tuntipalkka, double tehdytTunnit) { super(etunimi, sukunimi, hetu); setTuntipalkka(tuntipalkka); setTehdytTunnit(tehdytTunnit); } public double getTehdytTunnit() { return tehdytTunnit; } Monimuotoisuus / esimerkki

26 © Jukka Harju, Jukka Juslin26 public void setTehdytTunnit(double tehdytTunnit) { if ((tehdytTunnit > 0) && (tehdytTunnit 0) { this.tuntipalkka = tuntipalkka; } else { System.out.println( "Tuntipalkka " + tuntipalkka + " ei ole sallittu!"); } } public String toString() { return super.toString() + ", tuntipalkka: " + tuntipalkka + ", tehdyt tunnit: " + tehdytTunnit; } } Monimuotoisuus / esimerkki

27 © Jukka Harju, Jukka Juslin27 •Laajennettu sovellus Javalla. /** * Sovellus hyödyntää monimuotoisuutta työntekijöiden käsittelemisessä. * @author Jukka Harju */ public class Palkkasovellus { public void kaynnistaSovellus() { //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 Tuntipalkkainen("Mark", "Johnson", "010163-882A", 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 sovellus = new Palkkasovellus(); sovellus.kaynnistaSovellus(); } } Ainoa tarvittava muutos on uuden työntekijätyypin käyttäminen olion luonnissa! Monimuotoisuus / esimerkki

28 © Jukka Harju, Jukka Juslin28 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

29 © Jukka Harju, Jukka Juslin29 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.

30 © Jukka Harju, Jukka Juslin30 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 laskeViikkopalkka(); •Abstrakti metodi: –Pelkkä metodin määrittely, ei sisällä lainkaan { }-merkkien sisään (metodilohkoon) tulevaan toteutusta. –Abstraktit metodit täytyy korvata aliluokassa.

31 © Jukka Harju, Jukka Juslin31 •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) Esimerkki: Abstraktien luokkien ja metodien käyttö

32 © Jukka Harju, Jukka Juslin32 •Toteutetaan yliluokkaan Tyontekija abstrakti metodi laskeViikkopalkka (palauttaa palkan). –Yliluokassa Tyontekija on oltava määriteltynä metodi laskeViikkopalkka, 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 Tyontekija -luokasta abstrakti. Esimerkki: Abstraktien luokkien ja metodien käyttö

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

34 © Jukka Harju, Jukka Juslin34 /** * 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. * * @return kuukausipalkka */ public double laskeViikkopalkka() { return kuukausipalkka / 4; } } Kuukausipalkkainen - luokassa korvataan yliluokan abstrakti metodi laskeViikkopalkka. Esimerkki: Abstraktien luokkien ja metodien käyttö

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

36 © Jukka Harju, Jukka Juslin36 public class Palkkasovellus2 { public void kaynnistaSovellus() { //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 Tuntipalkkainen("Mark", "Johnson", "010163-882A", 100, 50); //henkilosto[3] = new Tyontekija("Marty", "Hall", "020371-2234"); //tulostetaan koko henkilöstön tiedot: nimi ja palkka ja viikkopalkka for (int i = 0; i < henkilosto.length; i++) { if (henkilosto[i] != null) { System.out.println(henkilosto[i]); System.out.println( "viikkopalkka = " + henkilosto[i].laskeViikkopalkka() + "\n"); } } } public static void main(String[] args) { Palkkasovellus2 sovellus = new Palkkasovellus2(); sovellus.kaynnistaSovellus(); } } Tyontekija - luokasta ei voida enää luoda oliota. Tulostetaan myös viikkopalkka. Esimerkki: Abstraktien luokkien ja metodien käyttö

37 © Jukka Harju, Jukka Juslin37 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?

38 © Jukka Harju, Jukka Juslin38 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

39 © Jukka Harju, Jukka Juslin39 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

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

41 © Jukka Harju, Jukka Juslin41 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; }

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

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

44 © Jukka Harju, Jukka Juslin44 Esimerkki: Rajapintaluokan käyttö public class Taltiointisovellus { private void aja() { Tietokone omaKone = new Tietokone(2048, "Intel"); String omanKoneenTiedot = omaKone.taltioiTiedot(); /* * Tähän koodi jossa tiedot kirjoitetaan tiedostoon! */ /* * Tähän koodi jossa tiedot luetaan tiedostosta! */ Tietokone palautettuOmaKone = new Tietokone(); palautettuOmaKone.palautaTiedot(omanKoneenTiedot); } public static void main(String[] args) { Taltiointisovellus ohjelma = new Taltiointisovellus(); ohjelma.aja(); } } Sovellus luo Tietokone -olion ja tallettaa sen tiedot tiedostoon. Tiedostosta tiedot palautetaan toiselle Tietokone -luokan oliolle.


Lataa ppt "© Jukka Harju, Jukka Juslin1 Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 13 Monimuotoisuus."

Samankaltaiset esitykset


Iklan oleh Google