metodit – arvotyyppi

41
1 Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua Metodi voi palauttaa alkeistyypin tai olion Tällöin ”return X;”-lauseke on pakollinen. Metodissa ei saa olla suorituspolkuja, joilla return-lausekkeeseen ei päädytä. X on palautettava arvo, joka on arvotyypin tyyppinen.

Upload: italia

Post on 14-Jan-2016

28 views

Category:

Documents


0 download

DESCRIPTION

Metodit – Arvotyyppi. Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua Metodi voi palauttaa alkeistyypin tai olion - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Metodit – Arvotyyppi

1

Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen

arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa

pakollinen, vaikka sen käyttö on sallittua Metodi voi palauttaa alkeistyypin tai olion

Tällöin ”return X;”-lauseke on pakollinen. Metodissa ei saa olla suorituspolkuja, joilla return-lausekkeeseen ei päädytä. X on palautettava arvo, joka on arvotyypin tyyppinen.

Page 2: Metodit – Arvotyyppi

2

Metodit – Arvotyyppi Esimerkki

public static String viikonpaiva(int luku) { switch(luku) { case 1: return ”Ma”; case 2: return ”Ti”; ... } return ””;}

Page 3: Metodit – Arvotyyppi

3

Metodit – Parametrit Parametrit annetaan sulkeissa Alkeistyypit ovat arvoparametreja

Arvon muuttaminen metodin sisällä ei muuta alkuperäistä arvoa

Oliot ovat viiteparametreja Saman olion käyttö metodin sisällä

muuttaa myös alkuperäistä arvoa

Page 4: Metodit – Arvotyyppi

4

Metodit – Parametrit

public static void test(int i, String s, Student r) { i=0; s=”Muutettu”; r.setName(”Pekka”);}

...// Esimerkkikutsuint j=1; String t = ”A”; Student u = new Student(”B”);test(j, t, u);System.out.println(

”Tulos: ” + j +” ”+ t + ” ” + u.getName());// Tuloste: ”Tulos: 1 A Pekka”!

Page 5: Metodit – Arvotyyppi

5

Metodit – Kuormittaminen Samannimisiä metodeja voidaan

toteuttaa eri parametreilla Paluuarvojen tulee samannimisillä

metodeilla olla aina samat Samannimisten metodien

toteuttamista eri parametreilla kutsutaan metodin kuormittamiseksi

Page 6: Metodit – Arvotyyppi

6

Metodit – Kuormittaminen Esimerkki

public void tulosta(final int luku) { System.out.println( luku );}public void tulosta(final String str) { System.out.println( str );}...// Kutsuesimerkkitulosta(12); // Käyttää ylemää metodiatulosta(”Teksti”); // Käyttää alempaa metodia

Page 7: Metodit – Arvotyyppi

7

Metodit – Rekursio Jos ohjelmassa on metodi, joka kutsuu

sisällään itseään uudestaan, käytetään siitä nimitystä rekursiivinen metodi Rekursiiviset metodit kutsuvat itseään eri

parametreilla Parametrien perusteella metodi kutsuu

itseään tai mikäli ollaan päästy perustapaukseen ei kutsua enää suoriteta

Page 8: Metodit – Arvotyyppi

8

Metodit – Rekursio Rekursiossa jokaisella kutsulla

lähestytään aina jotakin perustapausta Rekursio on perinteisissä

proseduraalisissa ja olio-ohjelmointikielissä hidasta Teoriassa kaikki rekursiiviset metodit

voidaan purkaa auki iteratiivisiksi versioiksi Rekursiota rajoittaa suurissa tapauksissa

käytössä oleva muistin määrä

Page 9: Metodit – Arvotyyppi

9

Metodit – Rekursio – Fibonaccin luvut Fibonaccin lukuja ovat:

0, 1, 1, 2, 3, 5, 8, 13, ... Ensimmäinen luku on 0, toinen luku 1 ja

siitä eteenpäin seuraava luku saadaan aina kahden edellisen summana

Fibonnaccin lukuja voidaan laskea rekursiivista metodia hyväksikäyttäen Huomattavasti tehokkaampiakin

menetelmiä on olemassa

Page 10: Metodit – Arvotyyppi

10

Metodit – Rekursio – Fibonaccin luvut

// Palauttaa n:nnen Fibonaccin luvunpublic int fib(int n) { if (n==1) return 0; else if (n==2) return 1; else return fib(n-1) + fib(n-2);}

Esim: fib(4)

fib(3)

fib(2)

fib(2) fib(1)

01

1

1

fib(4)2

Page 11: Metodit – Arvotyyppi

11

Näkyvyysalueet ja muuttujien elinaika

private, publicpaikalliset muuttujat

Page 12: Metodit – Arvotyyppi

12

Näkyvyysalueen valinta Ohjelmissa kannattaa aina valita

mahdollisimman pieni näkyvyysalue jokaiselle muuttujalle ja metodille

Kaikki luokan attribuutit kannattaa sijoittaa private-näkyvyysalueeseen

Luokan yleiseen käyttöön tarkoitetut metodit sijoitetaan public-näkyvyysalueeseen, kaikki muut private-näkyvyysalueeseen

Lisäksi on olemassa protected-näkyvyysalue, joka on ikään kuin public:n ja private:n välimaastossa oleva. Käyttö on tarpeellista lähinnä kun hyödynnetään perintää.

Page 13: Metodit – Arvotyyppi

13

Paikallinen muuttuja vai luokan attribuutti Muuttujat sijoitetaan aina pienimpään

mahdolliseen käyttöalueeseensa. Mikäli muuttujan käyttö on

tarpeellista monissa luokan metodeissa tai se kuvaa olion tilaa, tehdään siitä attribuutti.

Mikäli käyttö on tarpeellista vain yksittäisessä metodissa, käytetään paikallista muuttujaa.

Page 14: Metodit – Arvotyyppi

14

Paikallisen muuttujan määrittely - esimerkki

Paikallinenkin muuttuja kannattaa sijoittaa aina mahdollisimman rajattuun alueeseen.

Esimerkki:public void printMembers() { Vector members = getAllMembers();

for (int i=0;i<members.size();i++) {Member member = members.getAt(i);String name = member.getName();System.out.println(”Jäsen: ” +

name);}

}Muuttujien esittelyt voitaisiin sijoittaa katkoviivalla osoitettuun paikkaan,mutta koska niitä ei käytetä kuin toistorakenteen sisällä, on ne sijoitettu toiston sisältämän lohkon sisään.

Page 15: Metodit – Arvotyyppi

15

Muuttujien elinaika Jokaisella muuttujalla on

näkyvyysalueen lisäksi ns. elinaika, jolloin se on olemassa Luokkamuuttujat on olemassa aina kun

olion konstruktoria on kutsuttu, olemassaolo loppuu kun olioon ei ole enää yhtään viitettä

Paikalliset muuttujat ovat olemassa lohkonsa sisällä. Kun lohko päättyy, paikallisen muuttujan elinaika päättyy.

Page 16: Metodit – Arvotyyppi

16

Taulukot

Taulukoiden määrittely, käsittely ja kopiointiVaihtoehdot taulukoille

Page 17: Metodit – Arvotyyppi

17

Taulukot Usein on tarvetta käsitellä ryhmää

samantyyppisiä olioita tai perustietotyyppejä On raskasta ja virhealtista kirjoittaa

esimerkiksi kymmeniä samantyyppisiä muuttujia peräkkäin ja suorittaa niille kaikille samaa operaatiota

Apua tuovat taulukot, joissa yhteen muuttujaan pystytään sijoittamaan useita olioita

Page 18: Metodit – Arvotyyppi

18

Yksiulotteinen taulukko Yksiulotteinen merkkijonotaulukko

esitellään ja luodaan:String[] names = new String[4];

Rivi varaa tilan neljälle String-tyyppiselle oliolle. Se jättää kuitenkin kaikki oliot null-arvoiksi.

Mikäli taulukko on luotu jostakin perustietotyypistä, ovat taulukon indeksit suoraan käytössä (ei tarvitse new:llä luoda joka paikkaan oliota)

Taulukon indeksointi alkaa aina nollasta.

Page 19: Metodit – Arvotyyppi

19

Yksiulotteinen oliotaulukko Oliotaulukon sisältö olisi luonnin jälkeen:

0 null

1 null

2 null

3 null

Taulukon yksittäiseen olioon voidaan viitata []:n avulla:names[0] = new String(”Pekka”);

Edellinen rivi luo taulukon ensimmäiseen paikkaan uuden merkkijono-olion

Page 20: Metodit – Arvotyyppi

20

Yksiulotteinen taulukko Yksiulotteisen taulukon kokoa

voidaan muuttaa vain luomalla uusi taulukko.

Taulukon kokoon saa length:llä:int size = names.length;

Taulukon sallittuja sijoitus- ja lukupaikkoja ovat [0..length-1]. Mikäli yritetään käyttää muita paikkoja, heittää Java ajonaikaisen virheen.

Page 21: Metodit – Arvotyyppi

21

Yksiulotteinen oliotaulukko Käytettäessä String-luokkaa,

voidaan kirjoittaa hieman lyhyemmin:names[0] = ”Pekka”;

koska Java luo automaattisesti ””:lla erotetusta merkkijonosta uuden String-olion

Page 22: Metodit – Arvotyyppi

22

Taulukon alustaminen Taulukkoon voidaan sijoittaa arvoja

luonnin yhteydessä:final int[] daysInMonth =

{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

Page 23: Metodit – Arvotyyppi

23

Yksiulotteinen taulukko - esimerkki

String[] students = new String[3];students[0] = new String(”Matti”);students[1] = new String(”Maija”);students[2] = new String(”Antti”);

for (int i=0;i<students.length;i++) {System.out.println(students[i]);

}

Page 24: Metodit – Arvotyyppi

24

Yksiulotteinen taulukko – esimerkki 2

private String [] m_students;public void createStudents() {

m_students = new String[3];m_students[0] = new String(”Matti”);m_students[1] = new String(”Maija”);m_students[2] = new String(”Antti”);

}

public void printStudents() {for (int i=0;i<m_students.length;i++) {

System.out.println(m_students[i]);}

}

Page 25: Metodit – Arvotyyppi

25

Taulukon käyttöongelma Koon muuttaminen ei ole

yksinkertaista Soveltuu huonommin tilanteisiin,

joissa kokoa ei tunneta ennalta tai koko muuttuu usein

Page 26: Metodit – Arvotyyppi

Taulukon koon muuttaminen

public class StudentArray { private String [] m_students; public StudentArray() { setArraySize(3); m_students[0] = new String(”Matti”); m_students[1] = new String(”Maija”); m_students[2] = new String(”Antti”); }

public void setArraySize(int newSize) { String[] newArray = new String[newSize]; int minLength; if (m_students.length<newSize) minLength = m_students.length; else minLength = newSize; for (int i=0;i<minLength;i++) { newArray[i] = m_students[i]; } m_students = newArray; }}

Page 27: Metodit – Arvotyyppi

27

Moniulotteiset taulukot Taulukot voivat olla moniulotteisia,

koska yksittäinen taulukon alkio voi sisältää toisen taulukon

[1]

[0]

[1][0] [2] [3]

Page 28: Metodit – Arvotyyppi

28

Moniulotteiset taulukot Esimerkiksi kaksiulotteinen

taulukko:String[][] stringArray = new String[2][4];stringArray[0][0] = new String(”Ruutu (0,0)”);stringArray[0][1] = new String(”Ruutu (0,1)”);int sizeX = stringArray.length; // == 2int sizeY = stringArray[0].length; // == 4String oneItem = stringArray[1][2];

[1]

[0]

[1][0] [2] [3]

Page 29: Metodit – Arvotyyppi

Kokonaislukutaulukon järjestäminen

lisäyslajittelu

public void insertionSort(int [] intArray) { for (int i=1;i<intArray.length;i++) { int tmp = intArray[i]; int j = i; while (j > 0 && intArray[j-1] > tmp) { intArray[j] = intArray[j-1]; j--; } intArray[j] = tmp; }}

Page 30: Metodit – Arvotyyppi

30

Vector-luokka Vector-luokalla voidaan toteuttaa

samat toiminnot kuin taulukolla. Lisäksi sillä on monia muita helpottavia ominaisuuksia. Kopiointi Koon muuttaminen Lisäys, poisto

Vector-luokka löytyy java.util-paketista (import java.util.Vector)

Page 31: Metodit – Arvotyyppi

31

Vector-luokka – esimerkki import java.util.Vector;...

Vector vector = new Vector();vector.add(”Pekka”);vector.add(”Tomppa”);

vector.remove(0);String firstItem = (String)vector.get(0);

vector.add(”Satu”);

for (int i=0;i<vector.size();i++) {System.out.println( (String)vector.get(i) );

}

Page 32: Metodit – Arvotyyppi

32

Tiedostojen käsittely

Tiedoston luku ja tallennusPoikkeusten käsittely

TietovirratOliot tiedostoissa

Page 33: Metodit – Arvotyyppi

33

Tiedostot Tiedostojen käyttöä tarvitaan kun

halutaan esimerkiksi säilyttää tietoa eri ohjelman ajokertojen välillä Rekisterit Asetustiedostot Tulosteet

Page 34: Metodit – Arvotyyppi

34

Tiedostot Tiedostoja käsitellään Javassa

tietovirtojen kautta Vastaavia tietovirtoja käytetään

Javassa komentoikkunaan tulostukseen ja verkon yli tapahtuvaan tiedonvälitykseen

Page 35: Metodit – Arvotyyppi

35

File-luokkaFile

+File(String)+boolean canRead()+boolean canWrite()+boolean exists()+String getAbsolutePath()+boolean isFile()+boolean isDirectory()+boolean length()+boolean createNewFile()+boolean delete() +boolean mkdir()...

Javan File-luokka sisältää yksittäisen tiedoston tai hakemiston käsittelyyn liittyviä toimintoja

File-luokka löytyy java.io-paketista (import java.io.File)

Page 36: Metodit – Arvotyyppi

36

File-luokka – esimerkki import java.io.File;...File file = new File(”phonebook.txt”);if (!file.exists()) { if (file.createNewFile()) System.out.println(”File created succesfully.”); else System.out.println(”Couldn’t create file.”);}else { System.out.println(”File phonebook.txt already exists.”);}

Esimerkki vaatii toimiakseen poikkeusten käsittelyn.

Page 37: Metodit – Arvotyyppi

37

Poikkeukset Tiedostojen käsittelyssä voi

tapahtua monentyyppisiä virheitä Oikeudet järjestelmässä Levytila Tiedostojen olemassaolo

Virheiden helppoa hallinnointia varten on Java-kielessä käytössä poikkeukset

Page 38: Metodit – Arvotyyppi

38

Poikkeukset Poikkeukset ovat olioita, joita

ohjelmakoodista voidaan heittää (throw)

Poikkeukset on otettava kiinni koodissa (catch)

Poikkeuksia sisältävän koodin suoritus tehdään try-catch -lohkossa

Page 39: Metodit – Arvotyyppi

39

Poikkeukset tiedostojen käsittelyssä Tiedostojen käsittelyssä File-luokka

voi heittää IOException-tyyppisen poikkeuksen (löytyy java.io.IOException-paketista)

Kääntäjä ei käännä koodia ellei poikkeuksia ole otettu kiinni

Page 40: Metodit – Arvotyyppi

40

Poikkeusten käsittely

import java.io.*;...try { // Poikkeuksia mahdollisesti aiheuttava koodi tähän}catch (IOException e) { // Poikkeuksen käsittely}

Page 41: Metodit – Arvotyyppi

41

Poikkeusten käsittely Javan API-luokkien metodien

heittämät poikkeukset on kuvattu Javan API-dokumentaatiossa

Poikkeusten kiinniotto kuuluu kurssin sisältöön, mutta niiden heittäminen ei