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



Samankaltaiset tiedostot
7. Oliot ja viitteet 7.1

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

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

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

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

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

Mikä yhteyssuhde on?

Java-kielen perusteet

2. Olio-ohjelmoinista lyhyesti 2.1

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

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

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

4. Olio-ohjelmoinista lyhyesti 4.1

Olio-ohjelmointi Javalla

19. Olio-ohjelmointia Javalla 19.1

Javan perusteita. Janne Käki

Listarakenne (ArrayList-luokka)

14. Poikkeukset 14.1

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

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

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

17. Javan omat luokat 17.1

Muuttujat ja kontrolli. Ville Sundberg

Metodien tekeminen Javalla

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

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

ITKP102 Ohjelmointi 1 (6 op)

1. Omat operaatiot 1.1

16. Javan omat luokat 16.1

12. Monimuotoisuus 12.1

Java-kielen perusteet

20. Javan omat luokat 20.1

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

Oliot viestivät metodeja kutsuen

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

Java-kielen perusteet

Sisällys. 15. Lohkot. Lohkot. Lohkot

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

9. Periytyminen Javassa 9.1

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

17. Javan omat luokat 17.1

Taulukot. Jukka Harju, Jukka Juslin

1 Tehtävän kuvaus ja analysointi

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

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

7. Näytölle tulostaminen 7.1

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

ITKP102 Ohjelmointi 1 (6 op)

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; } 16.3

YHTEYSSUHDE (assosiation)

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

Luokan sisällä on lista

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

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

9. Periytyminen Javassa 9.1

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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++?

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

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

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

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

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

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

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

Ohjelmointi 2 / 2010 Välikoe / 26.3

Rajapinta (interface)

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

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

12. Monimuotoisuus 12.1

11/20: Konepelti auki

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

Tietokannat II -kurssin harjoitustyö

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

ITKP102 Ohjelmointi 1 (6 op)

Harjoitustyö: virtuaalikone

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

15. Ohjelmoinnin tekniikkaa 15.1

Poikkeustenkäsittely

Ehto- ja toistolauseet

Olio-ohjelmointi Virhetilanteiden käsittely

ITKP102 Ohjelmointi 1 (6 op)

Java kahdessa tunnissa. Jyry Suvilehto

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

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

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

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

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

12 Mallit (Templates)

Merkkijonon tutkiminen matches-metodilla

Metodien tekeminen Javalla

C++11 lambdat: [](){} Matti Rintala

7/20: Paketti kasassa ensimmäistä kertaa

Transkriptio:

Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 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 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. Olion luominen Tunnuksen esittely varaa muistia viitteelle (viitetyyppiselle muuttujalle), mutta ei oliolle. Java alustaa automaattisesti viitteen tyhjäksi (nullarvo) tai ilmoittaa, että viite on alustettava. Oliolle varataan muistia new-operaatiolla, joka palauttaa viitteen. Viitetyyppinen muuttuja ja olio liittyvät toisiinsa, kun new-operaation paluuarvona saatava viite sijoitetaan muuttujan arvoksi. 7.3 7.4

Olion luominen Kissa rontti = null; rontti rontti = new Kissa(); rontti null olio Sijoituksen seurauksena rontti-viite viittaa samaan olioon kuin paluuarvona saatu viite. Olion viitteen esittely ja alustaminen tyhjäksi. olio Lauseke new Kissa(); luo olion, alustaa sen attribuutit ja palauttaa paluu-arvona olioon liittyvän tunnuksettoman viitteen. 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.5 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. 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.7 7.8

Viitteiden sijoitus Viitetyyppiseen muuttujaan voidaan sijoittaa toinen viitetyyppinen muuttuja y lauseella = y;, missä muuttujien ja y tyyppi (luokka) on sopiva. Sijoitus irrottaa viitteen siihen mahdollisesti liittyvästä oliosta ja kiinnittää viitteen y:n olioon. Sijoituksen jälkeen muuttuja viittaa muuttujan y viittaamaan olioon. Sijoitus ei kopioi y:n viittaaman olion tietoja :n viittaaman olion tietojen päälle! (Tähän tarvitaan oma metodi.) Viitteiden sijoitus Esim. Osoittakoon viite olioon a ja y olioon b. Viitteiden tyyppi oletetaan samaksi. Alkutilanne Sijoitus = y; Lopputilanne a a A y y y b b b 7.9 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. Viitteiden sijoitus public class ViiteTesti { // Esitellään viitteet ja varataan muistia. String = new String("a"); String y = new String("b"); // Kiinnitetään viite viitteen y osoittamaan olioon. = y; System.out.println( + " " + y); // b b // Irrotetaan viitteet b-oliosta. = y = null; System.out.println( + " " + y); // null null 7.11 7.12

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-metodit. Viitteiden vertailu public class VertailuTesti { // Esitellään viitteet ja varataan muistia. String eka1 = new String("eka"); String eka2 = new String("eka"); // Vertaillaan viitteitä. System.out.println(eka1 == eka2); // Vertaillaan olioita. System.out.println(eka1.equals(eka2)); // false // true 7.13 7.14 Tyhjät (null-arvoiset) viitteet Metodin kutsu tyhjän viitteen kautta aiheuttaa ajonaikaisen virheen (poikkeuksen), joka pysäyttää ohjelman suorituksen. Metodissa voi varautua null-arvoiseen parametriin joko if-lauseella: if (viite!= null) { // Viite liittyy olioon, sitä voidaan käsitellä. tai try-catch-lauseella: try { // Tällä käsitellään viitettä. Poikkeus siepataan tarvittaessa. catch (NullPointerEception e) { // Viite oli tyhjä. 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; t // Olio säilyy metodista poistuttaessa, // koska olioon liitetään uusi viite t. String t = palauta(); System.out.println(t); // abc t s "abc" s "abc" "abc" Viitetyyppisiä muuttujia voidaan antaa metodeille parametriksi aivan kuten alkeistyyppisiä muuttujia. Esim. 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 metodissa tehty muutos katoaa, kun metodista poistutaan. 7.17 7.18 Viitetyyppiseen parametriin liittyvään olioon metodissa tehty muutos jää voimaan! Olio ei kopioidu, jolloin viitetyyppinen parametri viittaa samaan olioon kuin metodikutsussa annettu viite. Olkoon viite luokan A olioon a ja m void-tyyppinen metodi, jolla on A-tyyppinen parametri y. A = new A(); m(); Metodissa void m(a y) {... y a Ennen tai jälkeen metodikutsun a public class ParametriTesti { /* Annetaan alkeistyyppiselle parametrille uusi arvo. public static void korota2potenssiin(int p) { p = p * p; /* Annetaan viitetyyppiselle parametrille uusi arvo. public static void luomaatiainen(kissa k) { k = new Kissa("kirjava", "tavallinen"); /* Muutetaan olion tietoja. public static void leikita(kissa k) { if (k!= null) k.hanta("levoton"); 7.19 7.20

// Yritetään muuttaa alkeistyyppisen muuttujan arvoa. int luku = 4; korota2potenssiin(luku); System.out.println(luku); // 4 // Yritetään muuttaa viitetyyppisen muuttujan arvoa. Kissa katti = new Kissa(); // musta, kippura luomaatiainen(katti); System.out.println(katti.vari()); // musta System.out.println(katti.hanta()); // kippura // Muutetaan olion tietoja. leikita(katti); System.out.println(katti.vari()); // musta System.out.println(katti.hanta()); // levoton 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"; 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. Muutetun merkkijonon palauttaminen onnistuu paluuarvona tai StringBufferja StringBuilder-luokkia käyttäen. 7.21 7.22