Föreläsning 8 Arv och abstrakta klasser
Arv Definierar en klass utifrån en redan existerande klass Den nya klassen utökar den ärvda klassen ( extends ) Den nya klassen behåller alla egenskaper som den gamla har Lägger till nya egenskaper (fält) och utökar beteendet (nya metoder)
Arv (forts) Kan användas för att: bygga vidare på fördefinierade klasser i Javas klassbibliotek strukturera egna program i generell kod och mer specialiserad kod återanvända koden i superklasser många gånger
Konstruktorer Vid Arv Konstruktorer ärvs inte! Därför måste subklasser tillhanda- hålla egna konstruktorer I en subklass konstruktor måste ett anrop till en konstruktor i super- klassen ske Har superklassen en "tom" konstruktor anropas denna om inget eget anrop görs från subklassen
Konstruktorer Vid Arv Ett anrop till en konstruktor i super- klassen sker med nyckelordet super Detta anrop måste placeras först public Barn(String namn, int alder) { super(namn, alder); // Anropar superklassens konstruktor // Eventuell övrig kod här } // Nu kan vi skapa ett nytt objekt av Barn så här: Barn dotter = new Barn("Stina Karlsson", 8);
Arv (forts) En klass kan endast ärva ifrån en annan klass Anges inget arv, ärver klassen automatiskt från klassen Object Alla klasser ärver direkt eller indirekt från klassen Object
Object Implicit arv av Object public class Person { // Medlemmar } public class Person extends Object { // Medlemmar } Explicit arv av Object Följande variabeldeklaration är möjlig Object pappa = new Person("Kalle Karlsson", 33);
Arv Exempel ”Är en/ett…” Lastbil Fordon superklass Personbil subklass
Arv Ett Exempel Till ”Är en/ett …” Person - namn : String - ålder : int + Person(n : String, a : int) + Person() + setNamn(namn : String) + setÅlder(a : int) + getNamn() : String + getÅlder() : int + print() + toString() Barn - veckopeng : int + Barn(n : String, a : int, v : int) + setVeckopeng(v : int) + getVeckopeng() : int + okaVeckopeng(n : int) Anställd - företag : String + Anställd(n : String, a : int, f : String) + setFöretag(f : String) + getFöretag() : String + sparka()
Åtkomstregler Vid Arv private är fortfarande private fält och metoder ärvs ej av subklasser public är fortfarande public fält och metoder ärvs av subklasser protected (skyddad åtkomst) private gentemot andra klasser public gentemot subklasser Klasser som är final kan inte ärvas
Gömmande Av Fält Fält med samma namn i subklassen gömmer fält i superklassen Subklassen får nya fält som är helt separerade från fälten i superklassen Kod i superklassen refererar till dennes fält Kod i subklassen refererar till dennes fält public class Klass1 { protected int tal = 10; } public class Klass2 extends Klass1 { private int tal = 20; public void print() { System.out.println(tal); // 20 System.out.println(super.tal); // 10 } }
Omdefinition Av Metoder En subklass kan omdefiniera de metoder som ärvs från superklassen Innebär att metoden har samma namn, returvärde och parametrar Men har en annan implementation (kod) Den nya metoden kan komma åt den gamla metodens implementation public class Person { public String toString() { System.out.println(super.toString()); return namn; } }
Omdefinition Av Metoder Metoder som inte kan omdefinieras av en subklass är: final, static Metoder som kan omdefinieras av en subklass är: public, protected Metoder som måste omdefinieras av en subklass är: abstract
Abstrakta Klasser På sätt och vis motsatsen till final En abstrakt klass: är inte komplett går inte att skapa objekt av kan endast ärvas av andra klasser används när implementationen för några, men inte alla, metoder kan tillhandahållas i en superklass
Abstrakta Metoder En abstrakt metod: saknar implementation (kod) har endast en signatur (namn, returtyp och parametrar) måste implementeras i subklasser Finns minst en abstrakt metod måste hela klassen vara abstrakt public abstract class Person { public abstract void jobba(); }
Exempel på abstract ”Är en/ett …” GeometriObjekt # x : int # y : int + GeometriObjekt (x : int, y : int) + setX(x : int) + setY(y : int) + beraknaArea() : double Rektangel - langd : int - bredd : int + Rektangel (x : int, y : int, langd : int, bredd : int) + setLangd(langd : int) + getLangd() : int + setBredd(bredd : int) + getBredd() : int + beraknaArea() : double Cirkel - radie : int + Cirkel(x : int, y : int, d : double) + setRadie(d : int) + getRadie() : int + beraknaArea() : double