Tuloksellinen Javaohjelmointi Luku 11 Monimuotoisuus Jukka Harju Jukka












































- Slides: 44

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: 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 / 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 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. – 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. 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 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! 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 / 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 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. 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 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 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ä 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 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 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 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. • 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 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 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. 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 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ä. * @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 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 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 > 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ä. * @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 / 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 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 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 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 (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 * 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 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 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. 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 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 / 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. • 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ä. • 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 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, 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 { 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 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
Jukka harju konkurssi
Poke wilma
Terttu harju
Harju maakonnaplaneering
Harju elekter
Kirjallisuuden lajityypit
Harju elekter
Harju sport
Padlet harju
Harju maakonnaplaneering
Topografska karta znakovi
Rahoitustulos
1960-luvun muoti
Alkuainemolekyyli
E^x derivaatta
1980 luvun muoti
Kuutiojuuri
Kartografski znakovi
2000-luvun suomalaiset naisartistit
Jukka latva-rasku
Jukka juslin
Kuvauslaite
Jukka pietarinen
Teleradiologia
Jukka söderdahl
Jukka harmainen
Jukka koskenkanto
Jukka juslin
Glukoosimetabolia
Jukka sainio
Jukka lammervo
Jukka pekola
Jukka harmainen
Jukka kohtanen
Jukka kohtanen
Jukka juslin
Jukka juslin
Kyllästyskosteus taulukko
Jukka harno
Primtask
Jukka jauhiainen
Fixed window
Tulvavedet viivytys
Antitrombootit
Jukka jauhiainen