Lataa esitys
Esittely latautuu. Ole hyvä ja odota
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
Samankaltaiset esitykset
© 2024 SlidePlayer.fi Inc.
All rights reserved.