******************************* Java-ohjelmointi, syksy 2007 Kurssikoe 10.12.2007 Tehtävä 2, arvosteluperusteita Janne Salo ******************************* Tehtävänanto ------------ Selitä lyhyesti mutta täsmällisesti seuraavat: a. luokan lataaminen ja olion luonti b. luokkametodi ja ilmentymämetodi c. yliluokka ja aliluokka d. polymorfismi Yleistä ------- Pisteitä tehtävästä oli jaossa 16, ja koska kohtia tehtävässä oli neljä ja ne olivat suunnilleen yhtä hankalia (tai helppoja), on luontevaa pitää jokaista kohtaa neljän pisteen arvoisena. Tehtävässä pyydettiin "lyhyttä, mutta täsmällistä" selitystä, joten oli sallittua, jopa suotavaa, olettaa, että ohjelmoinnin ja Javan peruskäsitteet ovat lukijalle tuttuja, eikä niitä tarvitse erikseen vastauksessa määritellä tai selittää. Kustakin kohdasta sai täydet pisteet, jos oli osannut selittää käsitteet ymmärrettävästi ja ilman suurempia puutteita. Pienten esimerkkien antamisesta oli usein etua. Epäselvyydet tai puutteet vastauksissa johtivat yleensä 1-2 pisteen menetykseen ja selvät asiavirheet tai käsitteiden sekoittaminen 3 tai jopa 4 pisteen menetykseen. Arvosteluperusteet kohdittain ----------------------------- a. Kurssimateriaalista: "Kun suoritetettava ohjelma viittaa ensimmäisen kerran johonkin luokkaan, tuo luokka ladataan (load) muistiin. Tällöin luokan staattinen kalusto asetetaan alkutilaan: luokkamuuttujat saavat alkuarvonsa, mahdolliset staattiset alustuslohkot - - suoritetaan." sekä: "Aina kun suoritettava ohjelma luo olion eli luokan ilmentymän new-operaatiolla, tuon olion oma kalusto asetetaan alkutilaan: ilmentymän muuttujat saavat alkuarvonsa ja jokin konstruktori suoritetaan (nimenomaan tässä järjestyksessä!)." Mm. seuraavista asioista sai pisteitä (aivan kaikkea ei ollut pakko mainita): - Luokan lataaminen tapahtuu ensimmäisen luokkaan kohdistuvan viittauksen yhteydessä - Luokan lataamisen yhteydessä luokan kalusto alustetaan (ja staattiset alustuslohkot suoritetaan) - Olion kalusto alustetaan olion luonnin yhteydessä (new-operaatio) - Jokin konstruktoreista suoritetaan Yleisimpiä virheitä: - Moni oli sekoittanut import-ilmauksen ja luokan lataamisen keskenään ja puhunut pelkästään siitä - Muutamat väittivät, että luokan lataaminen ja olion luonti on sama asia b. Kurssimateriaalista: "Luokkametodeita voi kutsua vaikkei luokasta olisi luotu ensimmäistäkään ilmentymää. Luokkametodi määritellään käyttäen static-määrettä. Kutsu on muotoa: Luokka.metodi(parametrit). Luokkametodi voi käyttää vain luokkamuuttujia ja kutsua vain toisia luokkametodeita! Ilmentymämetodeita voi kutsua vain olioihin soveltaen: olio.metodi(parametrit). Se määritellään ilman static-määrettä. Ilmentymämetodi voi käyttää sekä ilmentymämuuttujia että luokkamuuttujia ja kutsua sekä ilmentymämetodeita että luokkametodeita." Mm. seuraavista asioista sai pisteitä: - Luokkametodeja voi kutsua, vaikka luokasta ei olisi luotu ilmentymää - Static-määre - Luokkametodi voi käyttää vain luokkamuuttujia ja kutsua vain toisia luokkametodeita - Ilmentymämetodeita voi kutsua vain olioihin soveltaen - Ei static-määrettä - Ilmentymämetodi voi käyttää sekä ilmentymämuuttujia että luokkamuuttujia ja kutsua sekä ilmentymämetodeita että luokkametodeita Yleisimpiä virheitä: - Muutamat olivat sekoittaneet termit keskenään - Monet olivat sekoittaneet käsitteet näkyvyyksiin tai johonkin muuhun kurssilla käsiteltyyn asiaan c. (Tämä kohta oli osattu ilahduttavan hyvin!) Kurssimateriaalista: "Periytyminen (inheritance) on luokan piirteiden - kenttien ja metodien - siirtymistä toiselle luokalle. Saava luokka on aliluokka (subclass), antava luokka on yliluokka (superclass). - - Aliluokka täydentää, erikoistaa, yliluokan määrittelyitä. - - Aliluokalla voi itselläänkin olla aliluokkia. Näin periytymisellä voidaan rakentaa puumainen luokkien hierarkia." Mm. seuraavista asioista sai pisteitä: - Periytyminen ja luokkahierarkia - Yliluokan metodit (ei konstruktorit) ja muuttujat periytyvät aliluokalle - Aliluokassa voi määritellä uusia toimintoja - Yliluokan metodeita voi erikoistaa: peittää ja kuormittaa - Luokka voi olla vain yhden luokan välitön perillinen - Koodin uudelleenkäyttö Yleisimpiä virheitä: - Joissakin vastauksissa väitettiin, että private-kalusto ei periytyisi aliluokalle - Monissa vastauksissa selostettiin, mitä tapahtuu, kun aliluokasta luodaan ilmentymä (yliluokan konstruktoria kutsutaan jne.). Tästä ei saanut pisteitä (ei tosin vähennettykään, vaikka selostuksessa olisi ollut virheitä). d. Kurssimateriaalista: "Metodin korvaaminen eli syrjäyttäminen (overriding) tarkoittaa perityn metodin korvaamista uudella samantyyppisellä, samannimisellä ja samaparametrisella metodilla. - - Korvaavan metodin valinta liittyy dynaamisesti olion tyyppiin, ei muuttujan tyyppiin! Tätä kutsutaan polymorfismiksi eli monimuotoisuudeksi." Mm. seuraavista asioista sai pisteitä: - Kutsuttavan metodin valinta määräytyy luokan ilmentymän tyypin, ei muuttujan tyypin mukaan - vaikkapa toString-metodin käyttäminen esimerkkinä Yleisimpiä virheitä: - Monissa vastauksissa oli puhuttu rajapintaluokista ja niiden toteuttamisesta käsittelemättä juurikaan polymorfismia. Tällaisista vastauksista sai yleensä 0-1 pistettä. - Monet olivat myös puhuneet pelkästään metodien korvaamisesta aliluokissa. Tämä tietenkin liittyy läheisesti polymorfismiin, mutta ei yksinään riittänyt täysiin pisteisiin (max 2p). - Jotkut olivat sekoittaneet polymorfismin kurssilla esillä olleeseen geneerisyyteen