Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 8 ( ) INNEHÅLL:Klasser: -Konstruktorer -Klassvariabler -Instansmetoder -Privata variabler -Klassmetoder
2Jonny Karlsson Klasser: konstruktorer När man skapar en ny instans/objekt av en klass med nyckel ordet new anropas alltid en metod som kallas konstruktor. Konstruktorn har alltid samma namn som klassen den är knuten till. Konstruktorn returnerar aldrig ett värde. Man behöver inte definiera en konstruktor för en klass. Om man inte definierar en konstruktor för en viss klass anropas alltid en default konstruktor när man skapar ett nytt objek/en ny instans av klassen. Default konstruktorn skapar helt enkelt bara ett nytt objekt/en ny instans av klassen.
3Jonny Karlsson Klasser: konstruktorer En egen definierad konstruktor behövs bl.a. i följande fall: Man vill initialisera instansen med data i samband med att den skapas Man vill att den skapade instansen skall få ett speciellt tillstånd genast då den skapas Ifall man definierar en konstruktor i en klass finns det inte längre någon default konstruktor för den klassen.
4Jonny Karlsson Klasser: konstruktorer Exempel: public class Bil { int arsmodell; String marke; public Bil(int a, String m)//konstruktor { arsmodell = a; marke = m; }} //En ny instans av klassen Bil skapas: Bil opel = new Bil(1999, ”Opel”);//anropar vår egen definierade konstruktor och //ger märke och årsmodell som argument
5Jonny Karlsson Klasser: klassvariabler Instansvariabler (som vi gick igenom förra veckan) är bundna till en viss instans av klassen, dvs. varje instans av en klass har egna instansvariabler. Med andra ord, instansvariabler bestämmer tillståndet hos en viss instans av klassen. Klassvariabler bestämmer tillståndet hos en klass som helhet, inte enskilt för varje instans. Dvs. alla instanser av en viss klass delar på en och samma klassvariabel. En klassvariabel deklareras liksom en instanvariabel inne i en klassdefinition men till skillnad från instansvariabeln markeras klassvariabeln med nyckelordet static. Klassvariabler brukar även kallas för statiska variabler. Statisk innebär här att variabeln endast förekommer i ett exempler. Klassvariabler och instansvariabler initialiseras automatiskt på samma sätt som tabellvärden. (Numeriska värden initialiseras till 0, strängar till NULL osv...)
6Jonny Karlsson Klasser: klassvariabler Exempel: Klassvariabler behövs t.ex. om man vill hållla reda på hur många instanser av en viss klass som skapas under programmets gång. Man vill t.ex. i föregående bil-exempel hålla reda på hur många bilar som skapas. public class Bil { int arsmodell;//instansvariabel String marke;//instansvariabel static antalBilar;//klassvariabel public Bil(int a, String m)//konstruktor { antalBilar++;//värdet i antalBilar inkrementeras för varje gång arsmodell = a;//en ny instans av klassen Bil skapas. marke = m; }} //En ny instans av klassen Bil skapas: Bil opel = new Bil(1999, ”Opel”);//anropar vår egen definierade konstruktor och //ger märke och årsmodell som argument
7Jonny Karlsson Klasser: klassvariabler En klassvariabel är åtkomlig både via en instans/objekt av en klass eller också direkt via klassnamnet. Bil opel = new Bil(1999, ”Opel”);//en ny instans av klassen bil skapas System.out.println(”Så här många bilar har skapats: ” + Bil.antalBilar); //eller System.out.println(”Så här många bilar har skapats: ” + opel.antalBilar); EX
8Jonny Karlsson Klasser: instansmetoder Som vi tidigare konstaterat, bestäms tillståndet hos en instans av en viss klass med instansvariabler. Ett objekt/en instans av en klass har normalt inte endast olika tillstånd utan även ett visst beteende. M.a.o instanser av klasser kan ofta även utföra vissa operationer. Dessa operationer definieras som instansmetoder. En instansmetod är helt enkelt en helt vanlig metod som definieras inne i en klassdefinition. En metod definierad inne i en klass som inte är markerad som static, är en instansmetod.
9Jonny Karlsson Klasser: instansmetoder Exempel public class Bil { int arsmodell;//instansvariabel String marke;//instansvariabel static antalBilar;//klassvariabel public Bil(int a, String m)//konstruktor { antalBilar++;//värdet i antalBilar inkrementeras för varje gång arsmodell = a;//en ny instans av klassen Bil skapas. marke = m; } public void presentera()//instansmetod { System.out.println(”Marke: ” + marke); System.out.println(”Arsmodell: ” + arsmodell); }}
10Jonny Karlsson Klasser: instansmetoder En instansmetod skall alltid vara markerad som public. Om en instansmetod är markerad public (offentlig) betyder det att den är åtkomlig från andra klasser. Om man inte ger någon markering alls åt en metod blir den automatiskt public. En instansmetod är åtkomlig från en annan klass precis på samma sätt som en instansvariabel dvs med punktnotation. Exempel: Bil opel = new Bil(1999, ”Opel”); opel.presentera();
11Jonny Karlsson Klasser: privata variabler En instansvariabel blir automatiskt public (offentlig) om man inte anger någon markering för den (precis som för instansmetoder). En offentlig instansvariabel kommer man åt från vilken klass som helst genom att först skapa en instans/ett objekt av klassen och sedan använda punktnotation (som i övning 16 och övning 17) Vanligtvis brukar man markera instansvariabler som private (privata) vilket betyder att variablerna inte kan uppdateras från övriga klasser förutom den klass variabeln är deklarerad i. Orsaken till att man föredrar att använda privata instansvariabler är att man vill kontrollera en ”användares” användning av variabeln för att förhindra felaktiga värden i dessa variabler.
12Jonny Karlsson Klasser: privata variabler Exempel: Vi antar att vi har en klass som definierar en person. Personen skall ha egenskapen ålder. Vi vill kontrollera uppdateringen av ålder på så vis att om man från en annan klass försöker ge ett negativt värde eller ett värde som är över 120 så tolkas det som orimligt och godkänns inte. Då väljer vi att markera instansvariabeln ålder som private och definierar i stället en instansmetod via vilken man kan uppdatera ålder variabeln. I instansmetoden ”uppdateraAlder” har vi satt in en kontroll för inmatning av korrekt ålder. Se källkoden på nästa sida
13Jonny Karlsson Klasser: privata variabler Exempel (fortsätter): class Person { private int alder;//privat instansvariabel public void uppdateraAlder(int a)//offentlig instansmetod via vilken man {//kan uppdatera ålder-variabeln if(a 120)//om felaktig ålder ges visas det ett {//felmeddelande System.out.println(”Felektig alder!!”); } elsealder = a; }} //Så här skulle man uppdatera en persons ålder från en annan klass Person ville = new Person(); ville.uppdateraAlder(55);
14Jonny Karlsson Klasser: privata variabler Exempel 2: Det är också oftast skäl att markera klassvariabler (statiska variabler) som private. I exemplet där vi hade en klassvariabel som höll reda på hur många bilar som skapats, se koden nedan, skulle det vara orimligt att göra uppdatering från andra klasser möjligt. Detta p.g.a. att det då lätt kommer ett felaktigt värde i variabeln antalBilar. Då väljer vi i stället att markera klassvariablen antalBilar som private och låter variabeln uppdateras i konstruktorn, dvs varje gång en ny instans av klassen skapas. public class Bil { int arsmodell;//instansvariabel String marke;//instansvariabel private static antalBilar;//klassvariabel public Bil(int a, String m)//konstruktor { antalBilar++;//värdet i antalBilar inkrementeras för varje gång arsmodell = a;//en ny instans av klassen Bil skapas. marke = m; }}EX
15Jonny Karlsson Klasser: klassmetoder Metoder kan liksom variabler vara markerade som static. En statisk metod definierad inne i en klass är gemensam för alla instanser/objekt som skapas av klassen. Dvs. till skillnad från instansmetoder finns det bara ett enda exemplar av en statisk metod. En statisk metod kallas för klassmetod.
16Jonny Karlsson Klasser: klassmetoder Exempel: Vi återgår igen till Bil-exemplet på föregående sida där vi hade en statisk variabeln antalBilar. Eftersom denna klassvariabel är privat är den ej åtkomlig från andra klasser. Fast man inte vill att det ska gå att uppdatera variablen från en annan klass kan det däremot finnas behov av att kontrollera variabelns värde från en annan klass. Då behöver vi en metod via vilken man kan se på innehållet. Eftersom variabeln antalBilar är statisk är det ju helt onödigt att införa en instansmetod som visar innehållet. Vi definierar därför istället en statisk metod för ändamålet: public class Bil { int arsmodell;//instansvariabel String marke;//instansvariabel private static int antalBilar;//klassvariabel public static int getAntal()//klassmetod { return antalBilar;//returnerar värdet i antalBilar }}
17Jonny Karlsson Klasser: klassmetoder För klassmetoder gäller liksom för klassvariabler att de kan användas med antingen en instans av klassen eller klassen själv som syfting: Bil opel = new Bil(); //instansmetoden getAntal kan antingen anropas via instansen/objektet: System.out.println(”Antal bilar: ” + opel.getAntal()); //eller via själva klassen: System.out.println(”Antal bilar: ” + Bil.getAntal());
18Jonny Karlsson Klasser: klassmetoder Det är även vanligt att man definierar klasser som endast innehåller statiska variabler. Orsaken till att man definierar sådana klasser är vanligen att man vill samla ihop en mängd operationer (metoder) som hör till en viss kategori. T.ex. klassen input innehåller metoder för inläsning av värden av olika datatyper från tangentbordet. Alla dessa metoder är statiska och däför anropar vi dem genom att använda klassnamnet (input) som syfting: input.readInt();input.readFloat();input.readString();......
19Jonny Karlsson Sammandrag över nyckelorden för ”åtkomst” privateVariabeln/metoden är endast åtkomlig från innevarande klass. publicVariabeln/metoden är åtkomlig från andra klasser. staticVariablen/metoden är statisk, dvs. det finns endast ett exemplar av den och även om flera objekt/instanser av klassen där den statiska variabeln/metoden är definierad skapas kopieras inte variablen utan den är gemensam för alla instanser/objekt.