7. Oliot ja viitteet 7.1

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

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

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

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

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

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

Olio-ohjelmointi Javalla

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

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

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

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

Mikä yhteyssuhde on?

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

14. Poikkeukset 14.1

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

4. Olio-ohjelmoinista lyhyesti 4.1

2. Olio-ohjelmoinista lyhyesti 2.1

17. Javan omat luokat 17.1

19. Olio-ohjelmointia Javalla 19.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

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

14. Poikkeukset 14.1

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

20. Javan omat luokat 20.1

16. Javan omat luokat 16.1

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

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

Metodien tekeminen Javalla

Oliot viestivät metodeja kutsuen

Sisällys. 15. Lohkot. Lohkot. Lohkot

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

Javan perusteita. Janne Käki

1. Omat operaatiot 1.1

9. Periytyminen Javassa 9.1

Listarakenne (ArrayList-luokka)

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

9. Periytyminen Javassa 9.1

Java-kielen perusteet

12. Monimuotoisuus 12.1

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

7. Näytölle tulostaminen 7.1

17. Javan omat luokat 17.1

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

7/20: Paketti kasassa ensimmäistä kertaa

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

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

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

Luokan sisällä on lista

8. Näppäimistöltä lukeminen 8.1

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

11. Javan valintarakenteet 11.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

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

Java-kielen perusteet

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

1 Tehtävän kuvaus ja analysointi

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

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

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

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

8. Näppäimistöltä lukeminen 8.1

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

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

YHTEYSSUHDE (assosiation)

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

Rajapinta (interface)

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

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

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

Muuttujat ja kontrolli. Ville Sundberg

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

Sisällys. 16. Lohkot. Lohkot. Lohkot

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

12. Näppäimistöltä lukeminen 12.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

KOHDELUOKAN MÄÄRITTELY

ITKP102 Ohjelmointi 1 (6 op)

Osoitin ja viittaus C++:ssa

11/20: Konepelti auki

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

ITKP102 Ohjelmointi 1 (6 op)

15. Ohjelmoinnin tekniikkaa 15.1

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

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

Tietokannat II -kurssin harjoitustyö

Poikkeustenkäsittely

Luokat ja oliot. Ville Sundberg

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

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmointi 2, välikoe

12. Monimuotoisuus 12.1

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmoinnin jatkokurssi, kurssikoe

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

ITKP102 Ohjelmointi 1 (6 op)

13. Loogiset operaatiot 13.1

Olio-ohjelmointi Virhetilanteiden käsittely

Transkriptio:

7. Oliot ja viitteet 7.1

Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin parametrina. Muuttumattomat ja muuttuvat merkkijonot. 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 liittyvän viitetyyppisen muuttujan eli viitteen (reference) avulla. Viite määrittää olion identiteetin. Viite toteutetaan teknisesti yhden tai useamman suojatun osoittimen (pointer) avulla. Javan viitteet eri asia kuin osoittimet ja C++:n viitteet. 7.3

Olion luominen Tunnuksen esittely varaa muistia viitteelle (viitetyyppiselle muuttujalle), mutta ei oliolle. Java alustaa automaattisesti viitteen tyhjäksi (null-arvo) tai ilmoittaa, että viite on alustettava. Oliolle varataan muistia new-operaatiolla, joka palauttaa viitteen. Viitetyyppinen muuttuja ja olio liittyvät toisiinsa, kun newoperaation paluuarvona saatava viite sijoitetaan muuttujan arvoksi. 7.4

Olion luominen Kissa rontti = null; rontti null Olion viitteen esittely ja alustaminen tyhjäksi. rontti = new Kissa(); rontti "musta" "kippura" Sijoituksen seurauksena rontti-viite viittaa samaan olioon kuin paluuarvona saatu viite. "musta" "kippura" Lauseke new Kissa(); luo olion, alustaa sen attribuutit rakentajassa ja palauttaa paluuarvona olioon liittyvän tunnuksettoman viitteen. 7.5

Olion elinikä Olio on olemassa ( elää ) niin kauan kun siihen liittyy yksi tai useampia viitteitä. Viitetyyppiset muuttujat elävät alkeistyyppisten muuttujien tapaan vain esittelylohkossaan: Esimerkiksi metodissa esitelty viite tuhoutuu metodista poistuttaessa, koska sen tunnus on paikallinen. Olion elinikä voi kuitenkin poiketa olioon muistinvarauksen yhteydessä asetetun viitteen eliniästä, koska olioon voidaan liittää myös muissakin lohkoissa kuin esittelylohkossa eläviä viitteitä. 7.6

Olion tuhoutuminen Olio tuhoutuu, kun siihen ei liity viitteitä. Viitteettömien olioiden poistaminen hoidetaan automaattisesti Javan virtuaalikoneen toimesta. Toimenpidettä kutsutaan roskankeruuksi (garbage collection). Virtuaalikone kerää roskia automaattisesti, kun tarvitaan lisää muistitilaa. Java-ohjelmoijan ei siis tarvitse huolehtia olioiden poistamisesta ohjelmallisesti. 7.7

Olion tuhoutuminen Javan virtuaalikonetta voi myös käskeä tuhoamaan tarpeettomat oliot System-luokan gc-metodilla. Monissa kielissä varattu muisti vapautetaan ohjelmoijan toimesta erityisellä operaatiolla. Operaattorin käyttö on tehokkaampaa kuin automaattinen muistin vapautus, mutta altistaa myös muistivuodoille (memory leak). 7.8

Viitteiden sijoitus Viitetyyppiseen muuttujaan x voidaan sijoittaa toinen viitetyyppinen muuttuja y lauseella: x = y; missä muuttujien x ja y tyyppi (luokka) on sopiva. Sijoitus irrottaa viitteen x siihen mahdollisesti liittyvästä oliosta ja kiinnittää viitteen y:n olioon. Sijoituksen jälkeen muuttuja x viittaa muuttujan y viittaamaan olioon. Sijoitus ei kopioi y:n viittaaman olion tietoja x:n viittaaman olion tietojen päälle! Kopiointiin tähän tarvitaan oma metodi. 7.9

Viitteiden sijoitus Esimerkki. Osoittakoon viite x olioon a ja viite y olioon b, kun viitteiden tyyppi oletetaan samaksi. Alkutilanne x a y b Sijoitus x = y; x x a y b Lopputilanne xa x y b 7.10

Viitteiden sijoitus Sijoituksen kautta yhteen olioon voi viitata useampia tunnuksia. Olion identiteetti säilyy, vaikka olioon olisi useampia viitteitä, koska viitteet liittyvät samaan olioon. Sijoituksen sivuvaikutuksena olioon ei välttämättä enää ole viitteitä, jolloin olio jää roskankerääjän saaliiksi. Olion viitteet voidaan myös poistaa asettamalla ne tyhjiksi eli null-arvoisiksi. 7.11

Viitteiden sijoitus public class ViiteTesti { public static void main(string[] args) { // Esitellään viitteet ja varataan muistia. String x = new String("a"); String y = new String("b"); // Kiinnitetään viite x viitteen y osoittamaan olioon. x = y; System.out.println(x + " " + y); // b b // Irrotetaan viitteet b-oliosta. x = y = null; System.out.println(x + " " + y); // null null 7.12

Viitteiden sijoitus Taulukoiden käsittelyssä on huomattava, että sijoitus ei riitä taulukon alkioiden kopiointiin. Taulukon sisältö on kopioitava toiseen taulukkoon joko silmukoilla tai Arraysluokan metodeilla. Viitetyyppiset alkiot voi olla tarpeen syvä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 liittyvät // jälkimmäiseen olioon. luvut1[0] = 6; System.out.println(luvut1[0]); // 6 System.out.println(luvut2[0]); // 6 7.13

Viitteiden vertailu Viitetyyppisiä muuttujia voidaan myös vertailla yhtä- 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 liittyvät eri olioihin. System.out.println(eka1 == eka2); // Vertaillaan olioita. Tulostuu true, // koska olioiden tiedot ovat samat. System.out.println(eka1.equals(eka2)); 7.14

Null-arvoisiin viitteisiin varautuminen Metodin kutsu null-arvoisen tyhjän viitteen kautta aiheuttaa ajonaikaisen virheen (poikkeuksen), joka pysäyttää ohjelman suorituksen. Metodissa voidaan välttää virhe if-lauseella: if (parametrinasaatuviite!= null) { // Viite liittyy olioon, sitä voidaan käsitellä. Vaihtoehtoisesti voidaan käyttää try-catch-lausetta. Tyhjää viitettä ei huomioida, jos voidaan olettaa, että tyhjän viitteen aiheuttama poikkeus käsitellään muualla. 7.15

Viite metodin paluuarvona Metodin tunnukset ovat paikallisia (lokaaleja) - ne ovat olemassa vain metodin suorituksen ajan. Jos metodissa luotu olio halutaan säilyttää, 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 esitelty olio elää alkuperäistä viitettään vanhemmaksi. 7.16

Viite metodin paluuarvona public class ViitePaluuarvona { /* Palautetaan viite luotuun merkkijono-olioon. */ public static String palauta() { String s = new String("abc"); return s; public static void main(string[] args) { // Olio säilyy metodista poistuttaessa, t // koska olioon liitetään uusi viite t. String t = palauta(); System.out.println(t); // abc t s "abc" s x "abc" "abc" 7.17

Viite metodin parametrina Viitetyyppisiä muuttujia voidaan antaa metodeille parametriksi aivan kuten alkeistyyppisiä muuttujia. Esimerkiksi. int kertoma(int luku) {... void nimi(string nimi) {... double keskiarvo(double[] luvut) {... Java sijoittaa sekä alkeis- että viitetyyppisen parametrin arvoksi alkuperäisen arvon kopion (pass-by-value). Parametrin arvoon tehty muutos katoaa, kun metodista poistutaan. Parametriin liittyvän olion tilaan tehty muutos jää voimaan! Olio ei kopioidu, jolloin viitetyyppinen parametri viittaa samaan olioon kuin metodikutsussa annettu viite. 7.18

Viite metodin parametrina public class ViiteParametrina { /* Olion tietoja muuttava metodi. */ public static void leikita(kissa k) { if (k!= null) k.hanta("levoton"); public static void main(string[] args) { Kissa katti = new Kissa(); // musta, kippura // Muutetaan olion tietoja. leikita(katti); System.out.println(katti.vari()); // musta System.out.println(katti.hanta()); // levoton Olio luotu katti k katti x "musta" "kippura" Metodiin tultaessa "musta" "kippura" Metodista poistuttaessa k katti Lopuksi katti "musta" "levoton" "musta" "levoton" 7.19

Viite metodin parametrina public class MerkkijonoParametrina { /* Olion tiedot muuttuvat. */ public static void muuta(stringbuffer s) { s.append("d"); /* Olion tiedot eivät muutu. */ public static void muuta(string s) { s = s + "d"; public static void main(string[] args) { StringBuffer sb = new StringBuffer("abc"); String s = new String("abc"); muuta(sb); System.out.println(sb); // abcd muuta(s); System.out.println(s); // abc String-luokka on toteutettu siten, että String-tyyppisten muuttujien tietoihin ei voida tehdä muutoksia. Lisäysoperaattori muodostaa operadeistaan uuden olion. Muutetun merkkijonon palauttaminen onnistuu paluuarvona tai StringBufferja StringBuilder-luokkia käyttäen. 7.20