Klassarv och inkapsling ITK:P1 Föreläsning 3 Klassarv och inkapsling DSV Marie Olsson
En programmeringsprincip Divide and Conquer En urgammal princip Att dela upp koden i hanterbara delar Ju större program, desto större behov av modularisering Ett system delas upp i klasser Klasser delas in i paket (package)
Klassarv En basklass håller reda på gemensamma saker och kodupprepning undviks En subklass innehåller de specifika delar som innebär en utökning av basklassen I Java anges arv genom det reserverade ordet extends public class Cykel extends Fordon
Klassarv
Inkapsling och datagömning Inkapsling = Encapsulation Datagömning = Information hiding Data kapslas in och göms för andra klasser Data nås genom publika åtkomstmetoder private int x; public int getX(){ return x; }
Inkapsling och datagömning På samma sätt bygger man även metoder som kan ändra värdet på instansvariabler: private int x; public void setX(int i){ x = i; } Accessmetoder Inspektorer – Mutatorer
Metoder Ett annat sätt att dela upp koden i lagom stora enheter som utför en uppgift är att skriva metoder. Metoder har en returtyp (eller void) Metoder kan ta argument: public int addera (int a, int b) { return a + b; }//en rätt onödig exempelmetod
Överlagring Metoder och konstruktorer i samma klass med samma namn MEN med olika parameterlistor Exempel med konstruktorer: public Hund() {} public Hund(String namn) {} public Hund(String namn, String ras) {} public Hund(String namn, String ras, int ålder) {}
Kodexempel class Hund { private String namn, ras; private int ålder; public Hund(String namn) { this.namn = namn; } // Konstruktor som tar ett argument public Hund(String namn, String ras) { this.ras = ras; } // Konstruktor som tar två argument
Kodexempel fortsättning public Hund(String namn, String ras, int åld) { this.namn = namn; this.ras = ras; ålder = åld; } // Konstruktor som tar tre argument public String visaNamn() { return namn; }
Kodexempel fortsättning public String visaRas() { return ras; } public int visaÅlder() { return ålder; }//Hund
Kodexempel fortsättning public class F3_exempel { public static void main(String[] args) { Hund hund1 = new Hund("Fido"); System.out.println("Hundens namn är: " + hund1.visaNamn() + " \n"); Hund hund2 = new Hund("Tom","tax"); System.out.println("Hundens namn är: " + hund2.visaNamn()); System.out.println("Hundens ras är: " + hund2.visaRas() + " \n");
Kodexempel fortsättning Hund hund3 = new Hund("Bellman","schäfer",11); System.out.println("Hundens namn är: " + hund3.visaNamn()); System.out.println("Hundens ras är: " + hund3.visaRas()); System.out.println("Hundens ålder är: " + hund3.visaÅlder()); }//main }//F3_exempel
Polymorfism polymorfism = många kroppar I en klasshierarki kan det i de olika klasserna finnas metoder med samma namn och samma signatur MEN med olika metodkroppar Objektorienterade programmeringsspråk har inbyggda mekanismer för dynamisk bindning Rätt metod körs automatiskt när programmet exekveras
Polymorfism I en abstrakt basklass: public abstract class Figur Finns det en abstrakt metod: public abstract double visaArea(); I den ärvande klassen Rektangel: public class Rektangel extends Figur har metoden implementerats så att den passar för att räkna ut arean hos just en rektangel
Polymorfism Medan den i klassen Cirkel överskuggas enligt: public double visaArea() { return bredd * höjd; }//visaArea i klassen Rektangel Medan den i klassen Cirkel överskuggas enligt: return PI * radie * radie; }//visaArea i klassen Cirkel
Några reserverade ord i Java Reserverade ord som är bra att känna till: this syftar på den egna klassen super syftar på basklassen abstract förhindrar instansiering final förhindrar vidare arv static markerar klasstillhörighet inte instanstillhörighet
Klassvariabler De flesta attribut är instansvariabler Alla objekt får då egna variabler Det finns dock undantagsfall då objekten i en klass behöver ha gemensamma klassvariabler I Java markeras detta med ordet static och en klassvariabel kan deklareras enligt: private static int klassVariabel;
Klassvariabler En vanlig användning är när klassen behöver en räknare: public class Katt { private static int kattNummer; public Katt(){ ++kattNummer; }//konstruktor }
Slut för idag! Tack för idag!