Luokan muodostimet (Constructors)

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

YHTEYSSUHDE (assosiation)

KOHDELUOKAN MÄÄRITTELY

Lista luokan sisällä

Metodien tekeminen Javalla

public static void main (String [] args)

Listarakenne (ArrayList-luokka)

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

UML ja luokkien väliset suhteet

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

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

Olio-ohjelmointi Javalla

Rajapinta (interface)

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

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

Mikä yhteyssuhde on?

Periytyminen (inheritance)

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Vahva koostumussuhde (Composition)

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

Java-kielen perusteita

Ehto- ja toistolauseet

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

Java-kielen perusteet

Metodien tekeminen Javalla

Java kahdessa tunnissa. Jyry Suvilehto

// // whiledemov1.c // #include <stdio.h> int main(void){ int luku1 = -1; int luku2 = -1;

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

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

Taulukoiden käsittely Javalla

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

Luokan sisällä on lista

Java-kielen perusteet

Taulukot. Jukka Harju, Jukka Juslin

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

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

2. Olio-ohjelmoinista lyhyesti 2.1

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

11. Javan valintarakenteet 11.1

Oliot viestivät metodeja kutsuen

Mitä poikkeuskäsittely tarkoittaa?

Java-kielen perusteet

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

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

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

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

Java-kielen perusteita

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

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

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

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

Java-kielen perusteita

9. Periytyminen Javassa 9.1

4. Olio-ohjelmoinista lyhyesti 4.1

Olio-ohjelmointi Syntaksikokoelma

Javan perusteita. Janne Käki

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

14. Poikkeukset 14.1

Poikkeustenkäsittely

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

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

9. Periytyminen Javassa 9.1

11. Javan valintarakenteet 11.1

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)

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Muuttujat ja kontrolli. Ville Sundberg

Ohjelmoinnin jatkokurssi, kurssikoe

16. Javan omat luokat 16.1

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

1 Tehtävän kuvaus ja analysointi

Lauseet. Ehdollinen lause. Tämän osan sisältö. Ehdollinen lause. Esimerkkejä. Yksinkertainen ehto. Lohkosulut ja sisennys. Ehdollinen lause if

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

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

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmoinnin perusteet, kurssikoe

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Ohjelmointi 2, välikoe

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

19. Olio-ohjelmointia Javalla 19.1

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

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

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

TIETORAKENTEET JA ALGORITMIT

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

Merkkien ja merkkijonojen käsittelyä Javalla

Tietokannat II -kurssin harjoitustyö

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Ohjelmointiharjoituksia Arduino-ympäristössä

1. Omat operaatiot 1.1

Osio2: Taulukot Jukka Juslin

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

7. Näytölle tulostaminen 7.1

20. Javan omat luokat 20.1

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

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

7. Oliot ja viitteet 7.1

1. Mitä tehdään ensiksi?

Transkriptio:

Mikä on muodostin? Luokan muodostimet (Constructors) Millaisia muodostimia on? Oletusmuodostin (Default Constructor) Parametrillinen muodostin Kopiointimuodostin (Copy Constructor) this-muuttuja Miten ylläpidän taulukosta viitattavia olioita?

Mikä on muodostin? (s. 121-122) Muodostin on luokkaan tehtävä metodi, jota kutsutaan automaattisesti, kun luokan oliota luodaan new operaattorilla Muodostimessa attribuuteille annetaan alkuarvot Kun luokkaan ei ole tehty muodostinta ja olio luodaan, kutsutaan automaattisesti Object-luokan oletusmuodostinta, jolloin attribuutit saavat seuraavat alkuarvot: numeerinen attribuutti (int, double, ) saa tyyppinsä mukaisen nollan char: ns. null-merkki \u0000 boolean: false viittaustyyppinen attribuutti saa arvon null

Millaisia muodostimia on? (s. 121-122) Muodostimia on kolmenlaisia eli muodostin on metodi ja se voidaan kuormittaa: oletusmuodostin ( 1 / luokka ) parametrillinen muodostin ( useita / luokka) kopiointimuodostin ( 1 / luokka ). MITÄ MUODOSTINTA KÄÄNTÄJÄ KUTSUU AUTOMAATTISESTI, ON SIDOKSISSA SIIHEN, MITEN OLION LUODAAN (luontilause on kirjoitettu).

Oletusmuodostin (Default Constructor) Luokassa voi olla vain yksi oletusmuodostin Oletusmuodostimen tehtävänä on asettaa olion attribuuteille sellaiset arvot, jotka ymmärretään oletusarvoiksi Kun ohjelmoija tekee oletusmuodostimen, muodostimen nimi on LUOKAN NIMI, sillä EI ole TYYPPIÄ, EIKÄ PARAMETREJA ja näkyvyys pitää olla public. public class Luokka { public Luokka() { // oletusmuodostin Oletusmuodostimen kutsu tapahtuu automaattisesti, kun olio luodaan seuraavasti: Luokka a = new Luokka();

Oletusmuodostin esimerkki public class Aika { // piilotetut attribuutit private int tunnit; private int minuutit; private int sekunnit; // oletusmuodostin, oletus aika: 0:00:00 public Aika() { tunnit = 0; minuutit = 0; sekunnit = 0; OLETUSMUODOSTIMEN KUTSU tapahtuu automaattisesti, kun olio luodaan seuraavasti: Aika nyt = new Aika(); // tai Aika nyt; nyt = new Aika() ;

Parametrillinen muodostin Kun luokassa on parametrillisen muodostimen (ohjelmoija tekee aina itse), olion attribuutit saavat olion luojan antamat alkuarvot. Parametrillisia muodostimia voi olla useita riippuen käyttötarpeesta Jos ohjelmoija tekee parametrillisen muodostimen, Object-luokan oletusmuodostin ei ole enää käytettävissä, joten oletusmuodostin on ohjelmoijan tehtävä itse, mikäli hän haluaa sitä käyttää. Kun ohjelmoija tekee parametrillisen muodostimen, muodostimen nimi on LUOKAN NIMI, sillä EI ole TYYPPIÄ, näkyvyys pitää olla public ja sillä ON PARAMETREJA public class Luokka { public Luokka(int a, double b) { // parametrillinen muodostin

Parametrillinen muodostin esimerkki public class Aika { private int tunnit; private int minuutit; private int sekunnit; // parametrillinen muodostin public Aika (int tunnit, int minuutit, int ssekunnit){ settunnit(tunnit); setminuutit(minuutit); setsekunnit (sekunnit); // 2. parametrilinen muodostin public Aika (int tunnit){ minuutit = sekunnit = 0; settunnit(tunnit); Esim. kutsu: Aika nyt = new Aika (12,22,30); Esim. kutsu: Aika nyt = new Aika (14);

Kopiointimuodostin (Copy Constructor) Kopiointimuodostin on Javassa parametrillisen muodostimen eräs versio, jonka ohjelmoijan on aina tehtävä itse Olion attribuutit saavat arvonsa toiselta saman luokan oliolta Jos ohjelmoija tekee kopiointimuodostimen, Object-luokan oletusmuodostin ei ole enää käytettävissä, joten oletusmuodostin on ohjelmoijan tehtävä itse, mikäli hän haluaa sitä käyttää. Kopiointimuodostimen nimi on LUOKAN NIMI, sille EI määritellä TYYPPIÄ, PARAMETRINA tulee olla SAMAN LUOKAN OLIO ja näkyvyys on public. public class Luokka { public Luokka( Luokka a) { // kopiointimuodostin

Kopiointimuodostin esimerkki public class Aika { private int tunnit; private int minuutit; private int sekunnit; // kopiointimuodostin public Aika (Aika aika) { this(); // oletusmuodostimen kutsu if (aika!= null){ tunnit = aika.tunnit; minuutit = aika.minuutit; sekunnit = aika.sekunnit; Esim. KOPIOINTIMUODOSTIMEN kutsu: Aika nyt = new Aika (17, 38, 20) ; // param.muod. kutsu Aika kopioaika = new Aika ( nyt ); // kopiointimuod. kutsu

Harjoitus: Mitä muodostimia kutsutaan? Aika aika1 = new Aika ( ) ; Aika aika2 = new Aika ( 12, 56, 9 ); Aika aika3 = new Aika ( 22 ); Aika aika4 = new Aika ( aika2 );

public class OpiskelijaSovellus { public void aja() { Harjoitus: Tee Opiskelija-luokka, jotta OpiskelijaSovellus-ohjelma toimii Opiskelija op1, op2, op3, op4; op1 = new Opiskelija(); System.out.println(op1.toString()); op2 = new Opiskelija(1001, "Uolevi", "Ulfsson"); System.out.println(op2.toString()); op3 = new Opiskelija(1010); op3.setetunimi("bertil"); op3.setsukunimi("jansson"); System.out.println(op3.toString()); Opiskelija-luokan attribuutit ovat: numero, etunimi, sukunimi op4 = new Opiskelija(op3); System.out.println(op4.getEtunimi()+ " " + op4.getsukunimi() + " : " + op4.getnumero());

this-muuttuja Jokaisella oliolla on oma this-muuttuja, jonka arvo on olion keskusmuistiosoite tai viittaus olioon eli tai this: 100X1 this: 100x1 saa arvonsa kun olio luodaan, eikä sen arvoa voi muuttaa käytetään mm. kun olion attribuutti täytyy erottaa parametrista tai paikallisesta muuttujasta

this-muuttuja jatkuu public class Hedelma { private String nimi; private double kilohinta; public void setkilohinta(double kilohinta) { this.kilohinta = 0; if (kilohinta > 0) this.kilohinta = kilohinta; // palauttaa kilohinnan muodossa 99,99 public String getkilohinta() { DecimalFormat form = new DecimalFormat("# ##0.00"); String kilohinta = form.format(this.kilohinta); return kilohinta;

Miten ylläpidän (lisään, poistan, etsin ja muutan) taulukosta viitattavia olioita? Kun taulukkoon lisätään ja poistetaan oliota ohjelman aikana, syntyy ongelmia 1. Mihin kohtaan taulukkoa lisään uuden olion? 2. Kun poistan taulukosta olion, jääkö olion kohta tyhjäksi vai tiivistänkö taulukon? Ratkaisuja on kaksi 1. Ohjelman attribuutit ovat taulukko ja muuttuja, joka kertoo, montako alkiota taulukkoon on lisätty Opiskelija [] taulu; int lkm = 0; 2. Ohjelman attribuutti on pelkkä taulukko Opiskelija [] taulu

Ratkaisujen attribuutit ja oletusmuodostimet: public class OpiskelijaYllapito { private Scanner input; private Opiskelija [] taulu; // taulukko private int lkm; // montako lisätty public OpiskelijaYllapito() { // oletusmuodostin input = new Scanner(System.in);.. taulu = new Opiskelija[10]; lkm=0; public class OpiskelijaYllapitoB { private Scanner input; private Opiskelija [] taulu; // pelkkä taulukko public OpiskelijaYllapitoB() { // oletusmuodostin input = new Scanner(System.in); taulu = new Opiskelija[10];

Ohjelman logiikka eli aja-metodi: public void aja(){ // kummankin ohjelman logiikka eli aja-metodi int valinta; do { System.out.println("1) lisää opiskelija"); System.out.println("2) poista opiskelija"); System.out.println("3) etsi opiskelija"); System.out.println("4) tulosta opiskelijat"); System.out.println("valitse:"); valinta = input.nextint(); switch (valinta) { case 0: break; case 1: lisaaopiskelija(); break; case 2: poistaopiskelija(); break; case 3:etsiOpiskelija(); break; case 4: tulostaopiskelijat(); break; default: System.out.println("Anna luku 0-4"); while (valinta!= 0);

private void lisaaopiskelija(){ int numero; String etunimi, sukunimi; if (lkm < taulu.length){ do{ Lisää opiskelija private Opiskelija [] taulu; // taulukko private int lkm; // montako lisätty System.out.println("Anna opiskelijan numero ( >0 )"); numero = input.nextint(); while (numero <=0); System.out.println("Anna opiskelijan etunimi:"); etunimi = input.next(); System.out.println("Anna opiskelijan sukunimi:"); sukunimi = input.next(); taulu[lkm] = new Opiskelija(numero, etunimi, sukunimi); lkm++; else System.out.println("taulukko on täynnä");

Lisää opiskelija private Opiskelija [] taulu; // taulukko private void lisaaopiskelija(){ int i=0; int numero; String etunimi, sukunimi; while (i<taulu.length && taulu[i]!= null) // etsi tyhjä paikka i++; if (i < taulu.length) {// löytyikö tyhjä paikka? do{ else System.out.println("Anna opiskelijan numero ( >0 )"); numero = input.nextint(); while (numero <=0); System.out.println("Anna opiskelijan etunimi:"); etunimi = input.next(); System.out.println("Anna opiskelijan sukunimi:"); sukunimi = input.next(); taulu[i] = new Opiskelija(numero, etunimi, sukunimi); System.out.println("taulukko on täynnä");

Poista opiskelija private Opiskelija [] taulu; // taulukko private int lkm; // montako lisätty private void poistaopiskelija(){ int numero; int i; if (lkm > 0){ do{ System.out.println("Anna opiskelijan numero ( >0 )"); numero = input.nextint(); while (numero <=0); i = etsiopiskelija(numero); if (i < lkm) { System.out.println("Poistetaan : "+taulu[i].tostring()); taulu[i] = null; tiivistataulukko(i); // tiivistetään taulukko: else System.out.println("opiskelijaa " + numero +" ei ole"); else System.out.println("Opiskelijoita ei ole!");

Poista opiskelija private Opiskelija [] taulu; // taulukko private int lkm; // montako lisätty private int etsiopiskelija(int numero) { int i=0; while (i<lkm && taulu[i].getnumero()!= numero) i++; return i; private void tiivistataulukko(int kohta) { for (int i = kohta ; i < lkm-1 ; i++) taulu[i] = taulu[i+1]; lkm--; // lukumäärän vähennys

private void poistaopiskelija(){ int numero; int i; do{ Poista opiskelija private Opiskelija [] taulu; // taulukko System.out.println("Anna opiskelijan numero ( >0 )"); numero = input.nextint(); while (numero <=0); i = etsiopiskelija(numero); if (i < taulu.length){ System.out.println("Poistetaan opiskelija: " + taulu[i].tostring()); taulu[i] = null; else System.out.println("Opiskelijaa " + numero + " ei ole!");

Poista opiskelija private Opiskelija [] taulu; // taulukko int etsiopiskelija(int numero) { int i=0; while ( i < taulu.length ) if (taulu [i]!= null && taulu[i].getnumero()==numero) break; // löytyi else i++; return i;

Etsi opiskelija private void etsiopiskelija(){ int numero; int i; if (lkm > 0){ do{ else private Opiskelija [] taulu; // taulukko private int lkm; // montako lisätty System.out.println("Anna opiskelijan numero ( >0 )"); numero = input.nextint(); while (numero <=0); i = etsiopiskelija(numero); if (i < lkm){ System.out.println("Opikelijan tiedot:"); System.out.println("numero: " + taulu[i].getnumero()); System.out.println("etunimi: " + taulu[i].getetunimi()); System.out.println("sukunimi: " + taulu[i].getsukunimi()); else System.out.println("opiskelijaa " + numero +" ei ole"); System.out.println("Opiskelijoita ei ole!");

private void etsiopiskelija(){ int numero; int i; do{ Etsi opiskelija private Opiskelija [] taulu; // taulukko System.out.println("Anna opiskelijan numero ( >0 )"); numero = input.nextint(); while (numero <=0); i = etsiopiskelija(numero); if (i < taulu.length){ else System.out.println("Opikelijan tiedot:"); System.out.println("numero: " + taulu[i].getnumero()); System.out.println("etunimi: " + taulu[i].getetunimi()); System.out.println("sukunimi: " + taulu[i].getsukunimi()); System.out.println("Opiskelijaa " + numero + " ei ole!");

Tulosta opiskelijat Tulosta opiskelijat private Opiskelija [] taulu; // taulukko private int lkm; // montako lisätty private void tulostaopiskelijat(){ for (int i=0; i < lkm ; i++) System.out.println(taulu[i].toString()); Tulosta opiskelijat private Opiskelija [] taulu; // taulukko private void tulostaopiskelijat() { for (int i=0; i < taulu.length ; i++) if (taulu[i]!= null) System.out.println(taulu[i].toString());