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());