JAVA Mer om klasser och objektorientering Begreppet package - paket Package används när man t ex vill skapa ett eget bibliotek med klasser. Sen är det då meningen att man ska importera detta paket i det program som vill utnyttja någon klass i paketet. Man måste ställa om i autoexec.bat så Java-kompilatorn och Java-interpretatorn vet var de finns. Tyvärr kan vi inte trixa med det i skolan. Det kan även vara lite knöligt att få till det även hemma. Men vi ska känna till möjligheten. Läs s 85-90 i boken. Inkapsling - synlighet Vi kan styra om våra klasser, variabler(medlemmar) och funktioner(metoder) ska vara synliga från andra klasser. Det gör vi genom att sätta dom som private, protected, public. Se sid 62-63 i boken. Konstruktorer - initiering av objekt Det finns en speciell typ av metoder som kallas konstruktormetoder, som anropas varje gång ett nytt objekt av den aktuella klassen skapas. Konstruktormetoder har ALLTID samma namn som klassen de tillhör. Konstruktormetoder är mycket praktiska eftersom de kan tvinga användaren att bifoga t.ex. några värden för att överhuvudtaget tillåtas skapa ett objekt. Först går vi tillbaks till följande klassdefinition (som vi känner igen från förra lektionen): class Elev int provpoäng; //variabel String elevnamn; //variabel void skrivut() //metod System.out.println("Namn: " + elevnamn + " Poäng: " + provpoäng); Lägg till följande konstruktormetod någonstans mellan klamrarna som ramar in klassen Elev. Lämplig plats är efter variablerna och före befintliga metoder. Elev(int pp, String enamn) provpoäng = pp; //konstruktor2 Notera att om man inte lägger till någon egen konstruktormetod lägger Java automatiskt till en egen tom metod för att ändå möjliggöra konstruktion av objektet. Denna "default"-konstruktor kan vi omdefiniera, dessutom kan vi överlagra med flera konstruktorer (som har olika antal argument eller olika typer av argument. Först omdefiniering av default-konstruktorn: Elev() provpoäng = 0; elevnamn = "NoName"; Sen en ytterliggare överlagring av konstruktorn: Elev(String enamn) provpoäng = 0; // initieras till noll(0) Sida 1
Test av klassen Elev Börja med att skapa filen TestaElev.java i samma bibliotek som Elev.class befinner sig i. För att undersöka klassen Elev lite närmare skapar vi ytterligare en liten klass som vi döper till TestaElev. Skriv in följande rader i filen TestaElev.java. class TestaElev //En klass vid namn TestaElev skapas. public static void main(string args[]) //Skapa objekt av typen Elev. Student1.skrivut(); //student1 s namn och resultat skrivs ut Student2.skrivut(); //student1 s namn och resultat skrivs ut Student3.skrivut(); //student1 s namn och resultat skrivs ut (Notera att texten efter snedstrecken (//) inte behöver skrivas in eftersom de bara är kommentarer.) Kompilera och kör programmet. Försök att lista ut hur utskrifterna kommer att bli. Här kommer koden till programmet: import java.io.*; class Elev int provpoäng; String elevnamn; Elev() provpoäng = 0; elevnamn = "NoName"; //OBS!! För att komma åt in och utmatnings-metoder Elev(String enamn) provpoäng = 0; // initieras till noll(0) Elev(int pp, String enamn) provpoäng = pp; void skrivut() class TestaElev public static void main(string args[]) //Skapa objekt av typen Elev. student1.skrivut(); //student1 s namn och resultat skrivs ut student2.skrivut(); //student2 s namn och resultat skrivs ut student3.skrivut(); //student3 s namn och resultat skrivs ut Sida 2
Överlagring av metoder På samma sätt som vi kan överlagra konstruktorer kan vi överlagra metoder. Dvs metoderna har samma namn men olika antal parametrar och/eller olika typer av argument.(sid 81-82 i boken.) I vårt exempel ovan kan vi t ex lägga till en funktion skrivut med ett heltalsargument enligt följande: void skrivut(int x) for (int i=1; i<=x; i++) Inte så praktiskt kanske men det duger för att visa överlagring utan att vi behöver utöka med nya metoder!! Vår testklass utökas lite: class TestaElev public static void main(string args[]) //Skapa objekt av typen Elev. student1.skrivut(); //student1 s namn och resultat skrivs ut student2.skrivut(); //student2 s namn och resultat skrivs ut student3.skrivut(); //student3 s namn och resultat skrivs ut student1.skrivut(4); //student1 s info skrivs ut 4ggr (Notera att texten efter snedstrecken (//) inte behöver skrivas in eftersom de bara är kommentarer.) Kompilera och kör programmet. Försök att lista ut hur utskrifterna kommer att bli. Sida 3
Här kommer koden till hela programmet: import java.io.*; class Elev int provpoäng; String elevnamn; Elev() provpoäng = 0; elevnamn = "NoName"; //OBS!! För att komma åt in och utmatnings-metoder Elev(String enamn) provpoäng = 0; // initieras till noll(0) Elev(int pp, String enamn) provpoäng = pp; void skrivut() void skrivut(int x) for (int i=1; i<=x; i++) class TestaElev public static void main(string args[]) //Skapa objekt av typen Elev. student1.skrivut(); //student1 s namn och resultat skrivs ut student2.skrivut(); //student2 s namn och resultat skrivs ut student3.skrivut(); //student3 s namn och resultat skrivs ut student1.skrivut(4); //student1 s info skrivs ut 4ggr Sida 4
Begreppet static - klassvariabler, klassmetoder Det reserverade ordet static talar om att variabler och metoder är klassvariabler respektive klassmetoder. Vi känner igen det genom att vår main-metod är av typen static. Med det menas att de skapas en gång och tillhör själva klassen. Varje objekt som skapas av klassen kommer då åt denna gemensamma variabel respektive metod. Dvs flera objekt från en klass kan ha en gemensam variabel. Vår main-metod, den finns där och tillhör klassen utan att vi måste skapa något objekt av klassen. (Sid 91-97 i boken.) Ex: package testastatic; import java.io.*; class Nr static int antal; int nummer; Nr(int x) antal++; nummer = x; //OBS!! För att komma åt in och utmatnings-metoder //klassvariabel //variabel i varje nytt objekt //konstruktor void skrivut() //metod System.out.println("Nr: "+nummer+" Antal: "+antal); class TestaNr public static void main(string args[]) Nr tal1 = new Nr(7); Nr tal2 = new Nr(3); Nr tal3 = new Nr(5); tal1.skrivut(); tal2.skrivut(); tal3.skrivut(); Standardklassen Math Se sid 98-99 i boken. Sida 5
Övningar Övning 1 Tiita på exempelprogrammen i denna lektion, mer om klasser och objektorientering, och försök förstå vad som händer i programmet rad för rad. Eventuellt skriv av och kör. Övning 2 Utöka din klass Boll från förra lektionen. Skapa en klass Boll enligt nedan, skapa sen en klass TestaBollar som utnyttjar klassen Boll, där den skapar en boll, sätter färg och radie på den samt skriver ut info om aktuell boll. Skriv en egen default-konstruktor som initierar radie till 0 färg till tom sträng. Skriv också en konstruktor där du skickar med värdena som argument till klassmedlemmarna radie och färg. class Boll int radie; String färg; //Plats för dina konstruktorer //---------------------------- void skrivutbollinfo( ) System.out.println( Bollfärg : +färg+ Radie = +radie); Skriv nu klassen TestaBollar som innehåller main-funktionen och kör sen applikationen. Skalet till TestaBollar: public class TestaBollar public static void main(string args[]) //skapa minst tre bollar //sätt färg och radie på de bollar som inte har några värden!! //skriv ut info om bollarna Övning 3 Utöka ovanstående Boll-klass med flera skrivutinfo-metoder. De ska vara överlagrade. Dvs ha samma namn. Ändra i testklassen så att du använder samtliga skrivutinfo-metoder. Övning 4 Skapa en klassvariabel i klassen Boll som håller reda på hur många bollar som finns "just nu" när programmet körs. Skapa en metod för att "hämta" värdet. Varför inte göra den som en klassmetod!! Testa om det fungerar. Övning 5 Skriv ett program som skriver ut i 4 kolumner följande: heltalet, roten ur heltalet, heltalet i kvadrat, talet e upphöjt i heltalet. Skapa en tabell genom att skriva ut ovanstående för heltalen 1 till 10. Övning 6 Utgå från programmet i övning 4. Sätt private framför klassmedlemmarna och public framför konstruktorer och metoder. Försök få programmet att fungera. Eventuellt måste du skriva några ytterliggare metoder!! Läxa: Läs noggrant igenom detta häfte. Läs s 81-100. Läs även 101-120 om Objektorienterad programutveckling. Gör klart övningarna. Hitta på ett eget exempel där du utnyttjar det du lärt dig. Sida 6