Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Luokkien ja olioiden käyttäminen Jukka Juslin

Samankaltaiset esitykset


Esitys aiheesta: "Luokkien ja olioiden käyttäminen Jukka Juslin"— Esityksen transkriptio:

1 Luokkien ja olioiden käyttäminen Jukka Juslin

2 Luokkien ja olioiden käyttäminen
Voimme luoda mielenkiintoisia ohjelmia käyttämällä Java API:sta jo löytyviä luokkia ja tekemällä niistä olioita Seuraavassa tutustumme näihin: Olion luonti ja olioon viittaaminen String luokasta lisää ja sen metodeista Javan standardi luokkakirjasto Random ja Math luokat Wrapper luokat © Jukka Juslin 2006

3 Missä ollaan? Olioiden luonti String luokka Paketit Wrapper luokat
© Jukka Juslin 2006

4 Olioiden luonti Muuttuja pitää sisällään joko primitiivityyppiä tai viittausta olioon Luokan nimeä voidaan käyttää tyyppinä kun tehdään tietyn luokan tyyppinen attribuutti String nimi; Tämä lauseke ei luo oliota Olion viittausmuuttuja sisältää osoitteenolioon Olio itse on luotava erikseen (kun sellainen halutaan luoda) © Jukka Juslin 2006

5 Olioiden luonti Yleisesti käytämme new operaattoria olioden luomiseen
nimi = new String (“Jukan JavaKirja”); Tämä kutsuu Stringin muodostinta (konstruktoria, constructor), joka on metodi, joka luo olion annetuilla arvoilla Olion luontia kutsutaan instantioinniksi Olio on tietyn luokan instanssi © Jukka Juslin 2006

6 Oletusmuodostimista eli konstruktoreista (constructors)
Seuraavassa on esimerkki luokasta, jolla on oletuskonstruktori: public class JukanInttiTaulukko { private int elementtiMaara; private int taulukko[] = new int[25]; public JukanInttiTaulukko() { elementtiMaara = 25; } © Jukka Juslin 2006

7 Oletuskonstruktoreista
Kun uusi String-luokan olio luotiin kaksi kalvoa sitten, silloin tultiin new-avainsanan myötä kutsuneeksi String-luokan konstruktoria Konstruktori on erityinen metodi, jolla ei ole palautustyyppiä (ei edes void, eli ei mitään) Jos konstruktorille erehtyy laittamaan palautustyypin konstruktori käyttäytyy kuten metodi, esimerkiksi jos olisi olemassa Math.Math(luku) metodi, jonka oli tarkoitus olla konstruktori © Jukka Juslin 2006

8 UML luokkakaavioista JukanInttiTaulukko-luokalle UML luokkakaavio näyttäisi seuraavalta: Miinusmerkki tarkoittaa private näkyvyyttä! Luokan nimet Attribuutit Palautus- tyypit (void eli ei mitään) Plusmerkki tarkoittaa public näkyvyyttä! Set-void: SEVO sääntö koostumussuhde Metodit Riippuvuus © Jukka Juslin 2006

9 JukanInttiTaulukon lähdekoodi
JukanInttiTaulukon lähdekoodiin ja sen testaamiseen käytetyt luokat voit ladata tästä hakemistosta: © Jukka Juslin 2006

10 Luokkakaavion merkityksestä
Luokkakaavio on hyödyllinen väline kuvattaessa esimerkiksi Java-ohjelmien ns. staattista eli ”pysähtynyttä” rakennekuvaa – luokkakaavio ei siis kuvaa ohjelman dynaamista toimintaa Luokkakaavio mahdollistaa ohjelman helpomman hahmottamisen graafisen esitystapansa vuoksi! Hyvä suunnitteluväline Useat nykytyökalut, esim. MS Visual Studio 2005 ja perinteisesti Rational Rose tuottavat luokkakaavioita automaattisesti Java-ohjelmakoodista Näistä sinun ei tarvitse välittää tällä kurssilla © Jukka Juslin 2006

11 Metodien kutsuminen Kun olio on luotu, voidaan käyttää piste (.) operaattoria kutsumaan yhtä olion metodeista pituus = nimi.length(); Metodi voi palauttaa arvon, jota voidaan käyttää sijoituksessa tai parametrinä esim. Toiselle metodille Metodin kutsumista voidaan ajatella niin, että pyydämme oliota suorittamaan tietyn palvelun (pyydämme pankkitiliämme antamaan rahaa yms.) © Jukka Juslin 2006

12 toString() metodi Luokkaan voidaan (ja kannattaa) toteuttaa metodi nimeltään toString() Esim: public String toString() { String out = etunimi + ” ” + sukunimi; return(kokoNimi) } toString metodin merkitys on, että kun kutsumme käyttävästä luokasta esimerkiksi System.out.println(olionNimi); -> saamme tulostettua ko. olion sisältämät tiedot -> mitä tulostuu esim. Nimi oliosta ilman toStringiä? © Jukka Juslin 2006

13 this avainsana Kun java-luokkia tehdään, usein on tarpeen tehdä set-metodi ko. luokalle: Esim: public class Nimi { private etunimi; private sukunimi; public void setNimi(String etunimi, String sukunimi) { this.etunimi = etunimi; this.sukunimi = sukunimi; } … } Tässä Java ei pysty erottelemaan parametrinä tullutta String etunimeä ja String sukunimeä: this auttaa ja Java Tietää kyseessä olevan private etunimi ja sukunimi, jotka tehdään luokan alussa. © Jukka Juslin 2006

14 Viittaukset Huomaa, että primitiivityyppi sisältää itse arvon mutta muusta luokasta tehty olio sisältää olion osoitteen Olioviittaus voidaan ajatella kuin osoittimena olion paikkaan (käytännössä on ns. Oid tunnus) Usein mieluummin kuvaamme viittausta mieluummin graafisesti, kuin käytämme muistiosoitteita kuvaamaan olion sijaintia “Bill Gates" nimi1 num1 38 © Jukka Juslin 2006

15 Muuttujien sijoitus (=)
Sijoituksessa otetaan kopio arvosta ja sijoitetaan se muuttujaan Tavallaan Java kielen virhe käyttää = merkkiä sijoittamista merkitsemään, esim =: olisi saattanut olla parempi. Mutta: That’s Life. Java kieli perustuu syntaksiltaan eli kielen sanoiltaan C-ohjelmointikieleen josta ko. asiat ovat jääneet. Primitiivityypeille: num1 38 num2 96 Ennen: num2 = num1; num1 38 num2 Jälkeen: © Jukka Juslin 2006

16 Viittausmuuttuja (reference assignment)
Olioviittauksille, sijoitus kopioi osoitteen (OID) eikä itse oliota: nimi1 nimi2 Ennen: “Bill Gates" “Paul Allen" nimi2 = nimi1; nimi1 nimi2 Jälkeen: “Bill Gates" Eikä tässä vielä kaikki! © Jukka Juslin 2006

17 Aliakset Kahta tai useampaa viittausta, jotka viittavaat samaan olioon kutsutaan toistensa aliaksiksi Se luo mielenkiintoisen tilanteen: yhteen olioon päästään käsiksi käyttäen erilaisia viittausmuuttujia Aliakset voivat olla hyödyllisiä, mutta niitä pitää hallita erittäin viisaasti Olion muuttaminen yhden viittauksen kautta päivittää olion näkymään uudella tavalla kaikista aliaksista käsin. Kyseessä on aina yksi ja sama olio, eikä sen kopiot © Jukka Juslin 2006

18 Roskien keruu (garbage collection)
Kun olioon ei enää ole viittauksia, siihen ei enää päästä käsiksi ohjelman kautta Näin oliosta tule hyödytön, ja siksi sitä kutsutaan roskaksi (garbage) Java suorittaa automaattista roskienkeruuta ajoittain, palauttaen olion käyttämän muistitilan järjestelmän myöhempään käyttöön Muissa ohjelmointikielissä ohjelmoija on vastuussa roskien keruun suorittamisesta © Jukka Juslin 2006

19 Missä ollaan? Olioiden luominen String luokka Paketit
EXTRA: Tulosteen muokkaaminen EXTRA: Enumeroidut tyypit Wrapper luokat © Jukka Juslin 2006

20 kirja = "Javan perusteet";
String luokka Koska merkkijonot ovat niin yleisiä, meidän ei tarvitse käyttää new-operaattoria luodessamme String oliota kirja = "Javan perusteet"; Tämä erikoissyntaksi (eli kirjoitusmuoto) koskee ainoastaan merkkijonoja (Stringejä) Jokainen string literaali (laitettuna lainausmerkkeihin) esittää String oliota © Jukka Juslin 2006

21 String metodit Kun String olio on luotu, sen arvoa eikä pituutta ei voi muuttaa Siksi sanomme, että String luokan olio on pysyvä (immutable). Eli mutaattoreilla eli settereillä ei tälläisia voi muutella. Kuitenkin, monet String luokan metodit palauttavat uusia String olioita, jotka ovat muutettuja versiota alkuperäisestä Katso lista String metodeista Java API:sta (Application Programming Interface): © Jukka Juslin 2006

22 String indeksit Joskus on hyödyllistä viitata tiettyyn merkkiin Stringin sisällä Tämä voidaan tehdä määrittämällä merkin numeerinen indeksi Indeksit alkavat nollasta jokaisessa stringissä Stringissä “Moro", merkki ‘M' on indeksissä 0 ja merkki 'o' is at indeksissä 1 ja 3 © Jukka Juslin 2006

23 Missä ollaan? Olioiden luominen String luokka Paketit
EXTRA:Tulosteen muotoileminen EXTRA:Enumeroidut tyypit Wrapper luokat © Jukka Juslin 2006

24 Luokka (Class) kirjastot
Luokkakirjasto (class library) on kokoelma luokkia, joita voimme käyttää kun kehitämme ohjelmia Javan standardi luokkakirjasto on osa mitä tahansa Java kehitysympäristöä Luokkakirjaston luokat eivät ole osa Java-kielen ydintä, mutta jo yksinkertainenkin ohjelma luottaa ko. Luokkiin vahvasti Useita luokkia on jo käytetty System, String (esimerkki hyödyllisestä luokasta on uusi Scanner luokka). Nämä kaikki ovat osa Javan standardi luokkakirjastoa Muihin luokkakirjastoihin voidaan päästä käsiksi kolmannen osapuolen vendorien kautta (alihankkijat), tai voit luoda oman peruskirjastosi itse! © Jukka Juslin 2006

25 Paketit Java standardin luokkakirjaston luokat on organisoitu paketeiksi paketeiksi. Voit kysyä harjoituksissa, kuinka voit itse tehdä ko. paketteja. Muutamia paketteja Javan standardissa luokkakirjastossa ovat: Paketti java.lang java.applet java.awt javax.swing java.net java.util javax.xml.parsers Tarkoitus Yleinen tuki Appletit www:tä varten Grafiikka ja GUI:t Lisää GUI toiminnallisuutta Verkkoviestintä Työkaluja XML tiedoston käsittely © Jukka Juslin 2006

26 import java.util.Scanner;
import lause Kun haluat käyttää luokkaa paketista, voit aina käyttää luokan täydellistä nimeä (fully qualified name). Pitkien nimien kirjoittaminen moneen kertaan on vain aika työlästä. Esimerkki: java.util.Scanner Tai voit ns. importata eli tuoda luokan aivan ohjelman alussa ja sitten käyttää vain luokan nimeä: import java.util.Scanner; Jos haluat tuoda kaikki luokat tietystä paketista, voit käyttää * villiäkorttia (wildcard) import java.util.*; © Jukka Juslin 2006

27 import lause Kaikki luokat java.lang paketista tuodaan automaattisesti kaikkiin ohjelmiin Aivan kuin kaikki ohjelmat näkymättömästi sisältäisivät rivin: import java.lang.*; Tämän vuoksi meidän ei täytynyt tuoda System tai String luokkia aikaisemmissa ohjelmissa Scanner luokka esimerkiksi, toisaalta on osa JDK 1.5:den java.util pakettia ja siksi se pitää tuoda kirjoittamalla ko. import rivi © Jukka Juslin 2006

28 Random luokka Random luokka on osa java.util pakettia
Se tarjoaa metodeita luoda satunnaislukuja (todella satunnaisia) Random olio suorittaa monimutkaisia laskutoimituksia perustuen siemenarvoon (seed value) tuottaakseen virran lukuja, jotka näyttävät satunnaisilta © Jukka Juslin 2006

29 Math luokka Math luokka on osa java.lang pakettia
Math luokka sisältää metodit, jotka suorittavat muutamia matemaattisia funktioita Näihin sisältyvät: Absoluuttisen arvon laskeminen Neliöjuuri Eksponentit (potenssiin laskeminen) Trigonometriset funktiot © Jukka Juslin 2006

30 arvo = Math.cos(90) + Math.sqrt(delta);
Math luokka Math luokan metodit ovat staattisia metodeita (kutsutaan myös luokkametodeiksi) Staattisia metodeja voidaan kutsua luokan nimen kautta, Math luokan oliota ei tarvitse ensin tehdä! arvo = Math.cos(90) + Math.sqrt(delta); Staattisia metodeja käsitellään myöhemmin opintojaksolla lisää © Jukka Juslin 2006

31 Missä ollaan? Olioiden luominen String luokka Paketit
EXTRA:Tulosteen muotoilu EXTRA: Enumeroidut tyypit Wrapper luokat © Jukka Juslin 2006

32 Tulosteen muotoilu On usein tarpeen muotoilla arvoja niin, että ne voidaan esittää sopivalla tavalla. Ajatellaan esimerkiksi eurosumman tulostamista double muuttujasta. Tässä olisi toivottavaa että desimaaleja esitettäisiin vain kaksi (eli sentit) Javan standardi luokkakirjasto sisältää luokkia, jotka tarjoavat tulosteen muotoiluun (formatting) keinoja NumberFormat luokka muotoilee lukuja automaattisesti esimerkiksi valuutaksi (rahaksi) tai prosenteiksi DecimalFormat luokka mahdollistaa arvojen muotoilun perustuen vapaavalintaiseen patterniin (malliin) Molemmat ovat osa java.text pakettia © Jukka Juslin 2006

33 getCurrencyInstance() getPercentInstance()
Tulosteen muotoilu NumberFormat luokalla on staattiset metodit, jotka palauttavat muotoillun olion: getCurrencyInstance() getPercentInstance() Jokaisella formatter oliolla on metodi nimeltään format , joka palauttaa stringin halutussa muodossa ja halutulla sisällöllä © Jukka Juslin 2006

34 Tulosteen muotoilu DecimalFormat luokkaa voidaan käyttää liukuluvun (double) muotoilemiseen monella tavoin Esimerkiksi, voit määritellä että numero pitää katkaista kolmen desimaalin tarkkuuteen (ota huomioon pyöristäminen…) DecimalFormat luokan konstruktori ottaa stringin parametrinä, joka esittää mallia (patternia) johon muokattu olio halutaan © Jukka Juslin 2006

35 Missä ollaan? Olioiden luonti String luokka Paketit
EXTRA: Tulosteen muotoileminen EXTRA: Enumeroidut tyypit Wrapper luokat © Jukka Juslin 2006

36 enum Vuodenaika {talvi, kevät, kesä, syksy};
Enumeroidut tyypit Java mahdollistaa sinulle määrittää enumeroidun tyypin, jota voidaan sitten käyttää muuttujien esittelemisessä (käytössä) Enumeroitu tyyppi luo kaikki mahdolliset arvot tämän tyyppiselle muuttujalle Arvot ovat tunnisteita, jotka Sinä valitset tunnistamaan muutujan eri tiloja Seuraavat määritteet luovat enumeroidun tyypin nimeltään Vuodenaika enum Vuodenaika {talvi, kevät, kesä, syksy}; Mikä tahansa määrä arvoja voidaan listata Miten määrittelisit Kurssi enum-muutujan, jossa on ict02d ja ict01d ? © Jukka Juslin 2006

37 Vuodenaika vuodenaika; vuodenaika = Vuodenaika.syksy;
Enumeroidut tyypit Kun tyyppi on määritetty, ko. Tyypin mukainen muuttuja voidaan esitellä Vuodenaika vuodenaika; ja esim. vuodenaika voidaan sijoittaa tähän muuttujaan vuodenaika = Vuodenaika.syksy; Arvot määritellään käyttäen määrittelyssä enumeroidun tyypin nimeä Enumeroidut tyypit ovat tyyppiturvallisia (type-safe) vrt. Tilanne, jossa loppukäyttäjät ovat osaamattomia/huolimattomia ja antavat ohjelmalle yhdeltä merkiltään poikkeavaa syötettä (vertaa ict02d vs. ICT02D) – et voi sijoittaa Enum-tyyppiin muuta kuin niitä joita on tyypin tekemisen yhteydessä lueteltu Enum. tyyppi vastaa siis hiukan esim. www-sivuilla olevia alasvetolistoja. Estää väärän syötteen tulemista ohjelmaan. © Jukka Juslin 2006

38 Järjestysluvut Sisäisesti, jokaisen enumeroidun tyypin arvo talletetaan integerinä, jota kutsutaan järjestysluvuksi (ordinal value) Ensimmäiselläl arvolla enumeroidussa tyypissä on järjestyslukuarvo 0, toisella 1, ja niin edelleen Kuitenkin, et voi sijoittaa numeerista arvoa enumeroituun tyyppiin, et vaikka se vastaisi järjestyslukua johon listassa numero laitettaisiin © Jukka Juslin 2006

39 Enumeroidut tyypit Enumeroidun tyypin määrittely on erityinen tyyppi luokasta, ja tässä jokainen muuttuja on olio (enumeroidun tyypi määrittelyn sisällä) ordinal metodi (järjestysluku) palauttaa olion järjestysluvun name metodi palauttaa tunnistimen (ns. avaimen) nimen, joka viittaa ko. arvoon © Jukka Juslin 2006

40 Missä ollaan? Olioiden luonti String luokka Paketit (vrt. Jar-paketit)
EXTRA: Tulosteen muotoilu EXTRA: Enumeroidut tyypit Wrapper luokat © Jukka Juslin 2006

41 Wrapper luokat java.lang paketti sisältää wrapper luokkia jotka vastaavat kutakin primitiivityyppiä: Primitiivityyppi Wrapper luokka byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean void Void © Jukka Juslin 2006

42 Integer ikä = new Integer(40);
Wrapper luokat Seuraava rivi luo Integer olion, joka esittää integerin (muuttujan tyyppiä int) 40 oliona Integer ikä = new Integer(40); Wrapper luokan oliota voidaan käyttää missä tahansa tilanteessa, kun primitiivityyppinen int-arvo ei riitä. Integerillä on laaja määrä metodeja, joita voi käyttää: Esimerkiksi tietyssä oliossa voidaan säilyttää muutamaa Integer arvoa. Wrapper olio voi toimia tälläisenä säilönä (container), mutta Wrapper containeriin ei voi primitiivityyppisiä arvoa (kuten int) vaan intit pitäisi ilmaista Integerinä © Jukka Juslin 2006

43 Wrapper luokat Wrapper luokat sisältävät myös staattisia metodeja, jotka auttavat hallitsemaan luokan määrittämään tyyppiä Esimerkiksi Integer luokassa on metodi, jonka avulla Stringistä saadaan int arvo parsittua. Eli konvertoitua String int-tyyppiseksi arvoksi. Integer-luokka voidaan ajatella wrapper luokkana ja parseInt on staattinen metodi. Integeriä ei siis tarvitse erikseen luoda vaan se on jo olemassa staattisena num = Integer.parseInt(str); Wrapper luokissa on myös usein hyödyllisiä vakioita, kuten seuraavasta huomaammel Esimerkiksi, Integer luokka sisältää MIN_VALUE ja MAX_VALUE vakiot, jotka pitävät muistissa pienintä ja suurinta int arvoa (katsotaan esimerkkinä Java APIA © Jukka Juslin 2006

44 Yhteenveto Tänään käsittelimme seuraavat asiat:
Olion luonti ja olioviittaukset (object reference) String luokka ja sen metodit Java standardi luokkakirjasto (API: SUN www-sivut!) Random ja Math luokat EXTRA: Tulosteen muotoilu (JDK 1.5) EXTRA: enumeroidut tyypit Wrapper luokat © Jukka Juslin 2006


Lataa ppt "Luokkien ja olioiden käyttäminen Jukka Juslin"

Samankaltaiset esitykset


Iklan oleh Google