Java kahdessa tunnissa Jyry Suvilehto
Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min
Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi, vaan luotan kysymyksiin Tyhmiä kysymyksiä ei ole Teidän pitäisi tietää mitä ette tiedä
Muuttujia int i = 3; double d = 13.37; char c = 'a'; boolean b = false; String s = moi maailma ; Mikä ei kuulu joukkoon?
Kahdenlaisia muuttujia Alkeistyypit Pelkkä arvo Ohjelmoinnin selkäranka Oliomuuttujat luokkien ilmentymiä näille voi kutsua metodeita yleensä kentissä alkeistyyppisiä muuttujia
Sijoituslause int i; Sijoitusoperaattori ei vertailumerkki! i = 8 + (5*7); esitellään muuttuja i lasketaan lausekkeen arvo ja sijoitetaan se muuttujaan i oikopolkuja: +=, -=, *=, ++, --
Mitä se koodi oikein onkaan? Joukko peräkkäisiä käskyjä, jotka tietokone suorittaa Käytännöllinen abstraktio: ohjelman kulku visuaalisena Javassa ohjelmakoodi on luokkien metodeissa int numero = 1; numero++; numero=numero*8; numero--;
Metodi Luokan osa, joka tekee jonkun tietyn tehtävän, esimerkiksi public String tostring(){ } return moi ; metodin nimi ja parametrit muodostavat metodin identiteetin, eräänlaisen puumerkin public void tee(int i, String s)!= public void tee(string s, int i)
Metodin kutsuminen Metodeja kutsutaan ns. pistenotaatiolla olio.metodinnimi(parametrit); Metodissa voidaan kutsua myös metodia itseään public void kertoma(int luku){ } if (luku <=1) return 1; else return luku*this.kertoma(luku-1); Rekursio
Ohjausrakenteet Kaikkea koodia ei aina haluta suorittaa ja joitain kohtia halutaan suorittaa useasti if else, silmukat ohjaavat muun koodin suoritusta --> ei puolipistettä if (ehto){ teejotain(); }else{ teejotainmuuta(); }
Miksi kannattaa sanoa return aina kun se on mahdollista return palauttaa metodin paluuarvon mikäli metodi ei palauta mitään (void) riittää pelkkä return; demo taululla
Silmukkarakenteet - for for (int i = 0; i < raja; i++){ /*taikaa*/ } Ei On Alustuslause Onko ehto tosi? Taikaa Edistyslauseke
Silmukkarakenteet while ja do while int i = 0; while (i < raja){ } /*taikaa*/ i++; aivan yhtä voimakas kuin for int i = 0; do { /*taikaa*/ i++; }while (i < raja) tarkastus tehdään vasta kun koodi on ajettu kerran
Kaksi taikasanaa break lopettaa silmukan suorituksen kertaheitolla continue aloittaa silmukan suorittamisen alusta (ja forrakenteessa suorittaa edistyslauseen) varo while-loopeissa!
Muuttujien näkyvyydestä Edellisen esimerkin for- ja while-lauseet eivät vastanneet aivan täysin toisiaan while-lauseessa muuttuja i jäi näkymään vielä silmukan jälkeen Nyrkkisääntö: muuttuja on näkyvissä vain niiden aaltosulkeiden sisällä, joissa se on esitelty (ja tietenkin sisempien) Koodin sisennys auttaa havainnollistamaan tätäkin
Taulukoista Yleisin tapa säilöä paljon tietoa Tai jos tarvittavien muuttujien määrä ei ole tiedossa; int[] taulu = new int{0, 3, 6, 8}; taulu[0] = 1; taulu[taulu.length-1] = 5; Indeksointi alkaa nollasta 0, 3, 6, 8 1, 3, 6, 8 1, 3, 6, 5 length on taulukon pituus, mutta yhtä suurempi kuin viimeisen alkion indeksi
Taulukoista (jännempää) Taulukoita voi tehdä myös kaksi- tai useampiulotteisina int[][] isotaulukko = new int[2][2]; taulukko[1][1] = 8; 0 0 0 8 0 0 0 0
Esimerkki taulukon läpikäynnistä String[] merkkijonot = new String[10]; // kaikki alkiot ovat nulleja for(int i = 0; i < merkkijonot.length; i++){ } if (i%2 == 0) merkkijonot[i] = new String( Toisto on opintojen äiti ); else merkkijonot[i] = new String( Parittomuus ei ole kivaa );
ArrayList -laiskan miehen tietorakenne ArrayList on listatyyppinen tietorakenne siinä kaikki alkiot ovat ketjussa sen koko voi vaihdella, eikä ohjelmoijan tarvitse huolehtia sen täyttymisestä taustalla taulukko, mutta ArrayList-olio huolehtii indeksoinnista Arraylistin voi alustaa sisältämään mitä tahansa olioita (alkeistietotyypeille on olemassa ns. kääreluokkia kuten Integer)
ArrayList - käyttö ArrayList<Object> lista= new ArrayList<Object>(); lista.get(int index) lista.add(object o) laittaa automaattisesti listan viimeiseksi lista.add(int index, Object o)
Scanner tuo ihana lukijaluokka Wanhaan hyvään aikaan näppäimistösyötteen lukeminen opetettiin vasta ohjelmoinnin peruskurssin lopussa Reader-luokat heittävät paljon poikkeuksia ja niiden käsittely ei kuulu kurssin alkuun Näppäimistösyötettä luettaessa käytännössä Scanner lukija = new Scanner(System.in); muuttuja joku = lukija.readmuuttuja(); String rivi = lukija.readline();
Tauko Vihdoinkin hetki hengähtää
Luokka public class SuomalainenMies{ private String nimi; public SuomalainenMies(String etunimi){ this.nimi = etunimi; } public String tostring(){ return this.nimi + tahtoo hernekeittoa! ; } }
Olio SuomalainenMies matti = new SuomalainenMies( Masa ); Matti on olio eli luokan instanssi Mutta mitä tässä tapahtuikaan? Java kutsuu SuomalainenMies-luokan konstruktoria parametrilla Masa new-sana varaa muistia SuomalainenMies-oliolle konstruktori alustaa arvon luokan kenttään ja palauttaa olion joka talletetaan muuttujaan matti, joka on viittaus new:n varaamaan muistiin
Viittaustyypeistä Viittaukset olioihin ovat viittaustyyppisiä muuttujia myös taulukot ovat olioita Oliot ovat kuin ilmapalloja Viittaukset olioihin ovat naruja Ilmapallossa voi olla monta narua kiinni Kun viimeinenkin naru irtoaa, ilmapallo karkaa maailman tuuliin (eli Javan roskienkeruu poistaa sen)
Perintä public class TamperelainenMies extends SuomalainenMies{ } public TamperelainenMies(String etunimi){ } super(etunimi); /*emme voi suoraan asettaa arvoa muuttujaan (miksi?)*/ //korvaa (overriding) yläluokan metodin public String tostring(){ } return super.tostring() + Ja mustamaggaraa kans! ;
Perintä sanoin Perinnällä saadaan monenlaiset palikat sopimaan samasta muotista TamperelainenMies voidaan tallentaa SuomalainenMies[] -taulukkoon tostring()-metodi palauttaa kuitenkin luokan mukaan merkkijonon tämä on polymorfismia
Object Minkä luokan SuomalainenMies perii? Kaikki luokat javassa perivät oletusarvoisesti luokan Object, jos muuta ei mainita tostring() on Object-luokan metodi, joka usein korvataan, koska alkuperäinen ei palauta mitään järkevää
Abstraktit luokat Jos ei haluta, että yliluokasta tehdään instanssi, voidaan siitä tehdä abstrakti Tällöin tehdään vain metodien puumerkit public abstract boolean onkototta(boolean tottako); aliluokkien on pakko korvata abstrakti metodi omallaan
Rajapinnat Luokka voi periä vain yhden luokan, joka voi periä yhden luokan jne... Kuitenkin on usein haluttavaa, että sama luokka voi olla yhteensopiva useampaan muottiin Luokka voi ilmaista täyttävänsä rajapintoja, joiden määrää ei ole rajoitettu Esimerkiksi luokka TamperelainenMies voisi myös täyttää rajapinnan MurteenPuhuja, joka määritelee metodin puhumullehassuja()
Rajapinta public interface MurteenPuhuja{ } public String puhumullehassuja(); public class TamperelainenMies extends SuomalainenMies implements MurteenPuhuja { }... public String puhumullehassuja(){ } return Tanpere! Tappara! Hervanta! ;
Lopuksi Kiitos ja anteeksi kaikille tamperelaisille Onnea tenttiin! Kysymyksiä saa esittää kunnes onnistun karkaamaan paikalta