Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet
Pakkaukset ja määreet Toisiinsa liittyvät luokkatiedostot voidaan koota pakkauksiksi. Luo hierarkiaa ja järjestystä ohjelmistotuotteeseen. Helpottaa uudelleenkäyttöä. Näkyvyysmääreet (muuntimet) säätelevät luokkien näkyvyyttä ja käytettävyyttä. Suojaa ohjelmistokehittäjiä virheiltä ja sivuvaikutuksilta. public ja private metodien ja instanssimuuttujien yhteydessä ovat esimerkkejä määreistä. Vesa Ollikainen & Outi Grotenfelt 2
Pakkaukset ja määreet Pakkaukset ovat nimettyjä luokkaryhmiä. Pakkaukset voivat sisältää toisia pakkauksia. Yllä kutsutaan javax-pakkaukseen kuuluvan swing-pakkauksen JOptionPane-luokan staattista metodia ShowMessageDialog(). pakkaus on graafinen käyttöliittymäkirjasto Vesa Ollikainen & Outi Grotenfelt 3
Pakkausten tuonti Yllä import-lauseella tuodaan kaikki javax.swingpakkaukseen kuuluvat luokat näkyville. Pakkauksen nimeä ei tarvitse erikseen antaa. NetBeans-/JBuilder-ympäristössä lähdekoodit menevät oletusarvoisesti oletuspakkaukseen. pakkauksen nimen voi vaihtaa luokkaa luotaessa. Saman projektin toisen pakkauksen luokat saa näkyville lauseella import pakkauksennimi.*; Vesa Ollikainen & Outi Grotenfelt 4
Luokkien näkyvyys Luokka voi olla julkinen tai pakkauskohtainen Julkinen luokka (public-määre) näkyy kaikkiin muihin luokkiin Pakkauskohtainen luokka (ei määrettä) näkyy samaan pakkaukseen Vesa Ollikainen & Outi Grotenfelt 5
Metodien ja muuttujien näkyvyys Metodit ovat näkyvyydeltään julkisia (public) pakkauksen sisälle ja aliluokkiin näkyviä (protected) pakkauksen sisäisiä (ei määrettä) luokan sisäisiä (private) Myös asetus- ja saantimetodien ( setterit ja getterit ) näkyvyys on syytä harkita tapauskohtaisesti Asetetaan pienin riittävä näkyvyys Kaikille ei tarvitse antaa samaa näkyvyyttä. Vesa Ollikainen & Outi Grotenfelt 6
final-muunnin final-luokka ei voi saada aliluokkaa. Esimerkiksi String-luokka on final-määreinen. motiivina kielen perusteiden selkeys final-muuttuja on vakio. Arvoa ei voi koskaan muuttaa. Arvo asetetaan käännöksen tai suorituksen aikana. Kääntäjä vaatii, että arvo asetetaan ennen käyttöä. final-metodia ei voi ylikirjoittaa aliluokassa. Konstruktorien kutsumista metodeista suositellaan tehtävän final-määreisiä. Tällöin aliluokassa ylikirjoitettu koodi ei voi aiheuttaa sivuvaikutuksia konstruktorin toimintaan. Vesa Ollikainen & Outi Grotenfelt 7
Esimerkki: final-muuttuja Yllä olevassa esimerkissä on kaksi vakiota. vakion eka arvo asetetaan käännösaikaisesti. vakion toka arvo asetetaan suorituksen aikana. Vesa Ollikainen & Outi Grotenfelt 8
Esimerkki: final-metodi Kulkuneuvo-luokan konstruktori kutsuu parannaääntä()- metodia. Jos konstruktorin kutsuma metodi ylikirjoitettaisiin aliluokassa, koodin modulaarisuus kärsisi. Asetetaan metodilla final-määre. Nyt kulkuneuvon luonti hoidetaan varmasti kokonaan tässä luokassa. Vesa Ollikainen & Outi Grotenfelt 9
final-määreisen metodin parannaääntä() ylikirjoitusyritys aiheuttaa käännösaikaisen virheilmoituksen. Vesa Ollikainen & Outi Grotenfelt 10
Staattiset metodit ja muuttujat Staattinen metodi tai muuttuja (static-määre) on yhteinen luokan kaikille olioille. Staattista metodia kutsutaan luokkametodiksi. Staattista muuttujaa kutsutaan luokkamuuttujaksi. Metodin tai muuttujan vaatima muistitila varataan vain kerran. Staattisiin muuttujiin voi koota luokan olioille yhteiset tiedot. Staattinen metodi ei voi suoraan viitata luokan instanssimuuttujaan. tarvitaan olioviittaus myös this-avainsana on kielletty. ei ole olemassa ilmentymää, johon this viittaisi. Vesa Ollikainen & Outi Grotenfelt 11
Esimerkki 1: Staattinen muuttuja public class Countable { private static int instancecount = 0; public Countable() { instancecount++; // increments the static field } public int getinstancecount(){ return instancecount; // number of created instances } } public class StaticDemo { public static void main(string[] args) { int objectcount; Countable obj1 = new Countable(); Countable obj2 = new Countable(); Countable obj3 = new Countable(); } } objectcount = obj1.getinstancecount(); System.out.print("Countable class has +objectcount+" objects."); Outi Grotenfelt 12
Esimerkki2: Staattinen muuttuja ja metodi Muuttuja henkilöidenlkm on laskuri luoduille luokan olioille. Olioille yhteisenä muuttujana se määritellään luokkamuuttujaksi (static). Staattisen muuttujan arvo haetaan staattisella metodilla gethenkilöidenlkm(). Vesa Ollikainen & Outi Grotenfelt 13
Esimerkki2: Staattinen muuttuja ja metodi.. Huomaa luokkametodin kutsu. Myös kutsu eka.gethenkilöidenlkm() olisi syntaktisesti oikein, mutta olioviittauksen käyttö tässä olisi harhaanjohtavaa koodia. Vesa Ollikainen & Outi Grotenfelt 14
public class PassObject { public static void main(string[] args) { Rectangle box = new Rectangle(14.0, 3.3); System.out.println("Contents of the box object:" + "\n length: "+box.getlength()+ "\n widht: "+box.getwidth()); changerectangle(box); System.out.println("Contents of the box object now:" + "\n length: "+box.getlength()+ "\n widht: "+box.getwidth()); } } public static void changerectangle(rectangle r){ r.setlength(0.0); r.setwidth(0.0); } 15 20/9/12 Helsinki Metropolia
import javax.swing.joptionpane; public class ReturnObject { public static void main(string[] args) { BankAccount myaccount; myaccount = getaccount(); JOptionPane.showMessageDialog(null, "Your account has + the balance of "+ myaccount.getbalance()); } public static BankAccount getaccount(){ String input; double balance; input = JOptionPane.showInputDialog("Give the account + balance:"); balance = Double.parseDouble(input); } } return new BankAccount(balance); 16 20/9/12 Helsinki Metropolia
Abstraktit luokat ja metodit Abstraktista luokasta ei voi luoda ilmentymää. Abstraktista metodista ei määritellä toteutusta. Toteutus on määriteltävä abstraktin luokan aliluokassa. Aliluokan määritys kelpaa kääntäjälle vasta, kun yliluokan abstrakti metodi on saanut toteutuksen. AccessSpecifier abstract class ClassName; Luokka on määriteltävä abstraktiksi (avainsana abstract) aina, jos sillä on vähintään yksi abstrakti metodi. AccessSpecifier abstract ReturnType MethodName(ParameterList); Vesa Ollikainen & Outi Grotenfelt 17
Esimerkki: abstraktit luokat ja metodit Abstraktin skaalaa()-metodin määritys pakottaa toteuttamaan skaalausoperaation kaikissa Kuvio-luokalle määriteltävissä aliluokissa. Vesa Ollikainen & Outi Grotenfelt 18
Esimerkki: abstraktit luokat ja metodit.. Vesa Ollikainen & Outi Grotenfelt 19
Esimerkki: abstraktit luokat ja metodit.. Vesa Ollikainen & Outi Grotenfelt 20
Esimerkki: abstraktit luokat ja metodit.. Vesa Ollikainen & Outi Grotenfelt 21
KIITOS! www.metropolia.fi www.facebook.com/metropoliaamk Outi.grotenfelt@metropolia.fi