Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Samankaltaiset tiedostot
7. Oliot ja viitteet 7.1

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

4. Luokan testaus ja käyttö olion kautta 4.1

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisältö. 2. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Olio-ohjelmointi Javalla

2. Olio-ohjelmoinista lyhyesti 2.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Mikä yhteyssuhde on?

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi.

14. Poikkeukset 14.1

Javan perusteita. Janne Käki

ITKP102 Ohjelmointi 1 (6 op)

4. Olio-ohjelmoinista lyhyesti 4.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

Java-kielen perusteet

12. Monimuotoisuus 12.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

16. Javan omat luokat 16.1

19. Olio-ohjelmointia Javalla 19.1

Listarakenne (ArrayList-luokka)

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Metodien tekeminen Javalla

Osoitin ja viittaus C++:ssa

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Java-kielen perusteet

17. Javan omat luokat 17.1

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

1. Omat operaatiot 1.1

Java-kielen perusteet

9. Periytyminen Javassa 9.1

Oliot viestivät metodeja kutsuen

Sisällys. 15. Lohkot. Lohkot. Lohkot

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

20. Javan omat luokat 20.1

Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Ta

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

17. Javan omat luokat 17.1

7/20: Paketti kasassa ensimmäistä kertaa

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

9. Periytyminen Javassa 9.1

11/20: Konepelti auki

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

12. Monimuotoisuus 12.1

15. Ohjelmoinnin tekniikkaa 15.1

Luokan sisällä on lista

Ohjelmointi 2 / 2010 Välikoe / 26.3

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Taulukot. Jukka Harju, Jukka Juslin

Muuttujat ja kontrolli. Ville Sundberg

KOHDELUOKAN MÄÄRITTELY

7. Näytölle tulostaminen 7.1

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

15. Ohjelmoinnin tekniikkaa 15.1

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

1 Tehtävän kuvaus ja analysointi

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Jakso 4 Aliohjelmien toteutus

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Olio-ohjelmointi Syntaksikokoelma

Tietueet. Tietueiden määrittely

Sisällys. 16. Lohkot. Lohkot. Lohkot

Luento 4 Aliohjelmien toteutus

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Rajapinnat ja olioiden välittäminen

ITKP102 Ohjelmointi 1 (6 op)

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

YHTEYSSUHDE (assosiation)

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

13. Loogiset operaatiot 13.1

Lyhyt kertaus osoittimista

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Transkriptio:

Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot. 7.1 7.2 Olio Java-kielessä Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään siihen epäsuorasti liittvän viitetppisen muuttujan eli viitteen (reference) avulla. Viite määrittää olion identiteetin. Viite toteutetaan teknisesti hden tai useamman suojatun osoittimen (pointer) avulla. Javan viitteet eri asia kuin osoittimet ja C++:n viitteet. Olion luominen Tunnuksen esittel varaa muistia viitteelle (viitetppiselle muuttujalle), mutta ei oliolle. Java alustaa automaattisesti viitteen thjäksi (null-arvo) tai ilmoittaa, että viite on alustettava. Oliolle varataan muistia new-operaatiolla, joka palauttaa viitteen. Viitetppinen muuttuja ja olio liittvät toisiinsa, kun newoperaation paluuarvona saatava viite sijoitetaan muuttujan arvoksi. 7.3 7.4

Olion luominen Kissa rontti = null; rontti rontti = new Kissa(); rontti null Sijoituksen seurauksena rontti-viite viittaa samaan olioon kuin paluuarvona saatu viite. Olion viitteen esittel ja alustaminen thjäksi. Lauseke new Kissa(); luo olion, alustaa sen attriuutit rakentajassa ja palauttaa paluuarvona olioon liittvän tunnuksettoman viitteen. 7.5 Olion elinikä Olio on olemassa ( elää ) niin kauan kun siihen liitt ksi tai useampia viitteitä. Viitetppiset muuttujat elävät alkeistppisten muuttujien tapaan vain esittellohkossaan: Esimerkiksi metodissa esitelt viite tuhoutuu metodista poistuttaessa, koska sen tunnus on paikallinen. Olion elinikä voi kuitenkin poiketa olioon muistinvarauksen htedessä asetetun viitteen eliniästä, koska olioon voidaan liittää mös muissakin lohkoissa kuin esittellohkossa eläviä viitteitä. 7.6 Olion tuhoutuminen Olio tuhoutuu, kun siihen ei liit viitteitä. Viitteettömien olioiden poistaminen hoidetaan automaattisesti Javan virtuaalikoneen toimesta. Toimenpidettä kutsutaan roskankeruuksi (garage collection). Virtuaalikone kerää roskia automaattisesti, kun tarvitaan lisää muistitilaa. Java-ohjelmoijan ei siis tarvitse huolehtia olioiden poistamisesta ohjelmallisesti. Olion tuhoutuminen Javan virtuaalikonetta voi mös käskeä tuhoamaan tarpeettomat oliot Sstem-luokan gc-metodilla. Monissa kielissä varattu muisti vapautetaan ohjelmoijan toimesta eritisellä operaatiolla. Operaattorin kättö on tehokkaampaa kuin automaattinen muistin vapautus, mutta altistaa mös muistivuodoille (memor leak). 7.7 7.8

Viitetppiseen muuttujaan voidaan sijoittaa toinen viitetppinen muuttuja lauseella: = ; missä muuttujien ja tppi (luokka) on sopiva. Sijoitus irrottaa viitteen siihen mahdollisesti liittvästä oliosta ja kiinnittää viitteen :n olioon. Sijoituksen jälkeen muuttuja viittaa muuttujan viittaamaan olioon. Sijoitus ei kopioi :n viittaaman olion tietoja :n viittaaman olion tietojen päälle! Kopiointiin tähän tarvitaan oma metodi. Esimerkki. Osoittakoon viite olioon a ja viite olioon, kun viitteiden tppi oletetaan samaksi. Alkutilanne Sijoitus = ; Lopputilanne a a A 7.9 7.10 Sijoituksen kautta hteen olioon voi viitata useampia tunnuksia. Olion identiteetti säil, vaikka olioon olisi useampia viitteitä, koska viitteet liittvät samaan olioon. Sijoituksen sivuvaikutuksena olioon ei välttämättä enää ole viitteitä, jolloin olio jää roskankerääjän saaliiksi. Olion viitteet voidaan mös poistaa asettamalla ne thjiksi eli null-arvoisiksi. pulic class ViiteTesti { // Esitellään viitteet ja varataan muistia. String = new String("a"); String = new String(""); // Kiinnitetään viite viitteen osoittamaan olioon. = ; Sstem.out.println( + " " + ); // // Irrotetaan viitteet -oliosta. = = null; Sstem.out.println( + " " + ); // null null 7.11 7.12

Viitteiden vertailu Taulukoiden käsittelssä on huomattava, että sijoitus ei riitä taulukon alkioiden kopiointiin. Taulukon sisältö on kopioitava toiseen taulukkoon joko silmukoilla tai Arrasluokan metodeilla. Viitetppiset alkiot voi olla tarpeen sväkopioida. // Esitellään viite, luodaan olio // ja liitetään viite olioon. int[] luvut1 = { 1, 1 ; int[] luvut2 = { 2, 3, 4 ; // Sijoitetaan viite. luvut1 = luvut2; // Molemmat viitteet liittvät // jälkimmäiseen olioon. luvut1[0] = 6; Sstem.out.println(luvut1[0]); // 6 Sstem.out.println(luvut2[0]); // 6 Viitetppisiä muuttujia voidaan mös vertailla htä- ja erisuuruusoperaattoreilla (== ja!=). Vertailu kohdistuu viitteisiin eikä viitattuihin olioihin. Olioiden sisällön vertailuun pitää kirjoittaa erillinen metodi. Equals- ja compareto. // Esitellään viitteet ja varataan muistia. String eka1 = new String("eka"); String eka2 = new String("eka"); // Vertaillaan viitteitä. Tulostuu false, // koska viitteet liittvät eri olioihin. Sstem.out.println(eka1 == eka2); // Vertaillaan olioita. Tulostuu true, // koska olioiden tiedot ovat samat. Sstem.out.println(eka1.equals(eka2)); 7.13 7.14 Null-arvoisiin viitteisiin varautuminen Metodin kutsu null-arvoisen thjän viitteen kautta aiheuttaa ajonaikaisen virheen (poikkeuksen), joka psättää ohjelman suorituksen. Metodissa voidaan välttää virhe if-lauseella: if (parametrinasaatuviite!= null) { // Viite liitt olioon, sitä voidaan käsitellä. Vaihtoehtoisesti voidaan kättää tr-catch-lausetta. Thjää viitettä ei huomioida, jos voidaan olettaa, että thjän viitteen aiheuttama poikkeus käsitellään muualla. Viite metodin paluuarvona Metodin tunnukset ovat paikallisia (lokaaleja) - ne ovat olemassa vain metodin suorituksen ajan. Jos metodissa luotu olio halutaan säilttää, voidaan sen viite palauttaa metodin paluuarvona ja paluuarvo sijoittaa muuttujaan kutsuvassa metodissa. Olio ei tuhoudu, vaikka paikallinen viite tuhoutuu, koska olioon asetetaan toisen lohkon viite. Näin toimien paikallisesti esitelt olio elää alkuperäistä viitettään vanhemmaksi. 7.15 7.16

Viite metodin paluuarvona pulic class ViitePaluuarvona { /* Palautetaan viite luotuun merkkijono-olioon. pulic static String palauta() { String s = new String("ac"); return s; // Olio säil metodista poistuttaessa, t // koska olioon liitetään uusi viite t. String t = palauta(); Sstem.out.println(t); // ac t s "ac" s "ac" "ac" Viitetppisiä muuttujia voidaan antaa metodeille parametriksi aivan kuten alkeistppisiä muuttujia. Esimerkiksi. int kertoma(int luku) {... void nimi(string nimi) {... doule keskiarvo(doule[] luvut) {... Java sijoittaa sekä alkeis- että viitetppisen parametrin arvoksi alkuperäisen arvon kopion (pass--value). Parametrin arvoon teht muutos katoaa, kun metodista poistutaan. Parametriin liittvän olion tilaan teht muutos jää voimaan! Olio ei kopioidu, jolloin viitetppinen parametri viittaa samaan olioon kuin metodikutsussa annettu viite. 7.17 7.18 pulic class ViiteParametrina { /* Olion tietoja muuttava metodi. pulic static void leikita(kissa k) { if (k!= null) k.hanta("levoton"); Kissa = new Kissa(); // musta, kippura // Muutetaan olion tietoja. leikita(); Sstem.out.println(.vari()); // musta Sstem.out.println(.hanta()); // levoton Olio luotu k Metodiin tultaessa Metodista poistuttaessa k Lopuksi "levoton" "levoton" 7.19 pulic class MerkkijonoParametrina { /* Olion tiedot muuttuvat. pulic static void muuta(stringbuffer s) { s.append("d"); /* Olion tiedot eivät muutu. pulic static void muuta(string s) { s = s + "d"; StringBuffer s = new StringBuffer("ac"); String s = new String("ac"); muuta(s); Sstem.out.println(s); // acd muuta(s); Sstem.out.println(s); // ac String-luokka on toteutettu siten, että String-tppisten muuttujien tietoihin ei voida tehdä muutoksia. Lisäsoperaattori muodostaa operadeistaan uuden olion. Muutetun merkkijonon palauttaminen onnistuu paluuarvona tai StringBufferja StringBuilder-luokkia kättäen. 7.20