Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.
-
Upload
adam-gerritsen -
Category
Documents
-
view
212 -
download
0
Transcript of Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.
Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Hoofdstuk 8: Recursie
Hoofdstuk 8: Recursie
22Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
VoorbeeldenVoorbeelden
n! = 1 n = 0n! = n * (n -1 )! n > 0
xY = 1 y = 0, x ≠ 0xY = x * xY-1 y > 0
Recursieve definitie: definitie gegeven in term of zichzelf
33Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Recursieve werkwijzeRecursieve werkwijze• Hoe n! berekenen?
– Als n = 0 dan is n! gelijk aan 1– Als n > 0 dan
• We berekenen eerst (n-1)! • We vermenigvuldigen dit resultaat met n
• Hoe (n-1)! Berekenen?– Zie hierboven!
Dus:
4! 3! 2! 1! 0! = 1Berekenen door Berekenen doorBerekenen door Berekenen door
Hier stoppen weHier stoppen we
Stop conditieStop conditie
44Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
• Als n = 0 dan is n! gelijk aan 1
• Als n > 0 dan – We berekenen eerst (n-1)! – We vermenigvuldigen dit resultaat met n
Javaprivate static int fac( int n) {
if (n == 0) return 1;
else return n * MijnFac.fac( n-1) ;
}
n wordt steeds kleinern wordt steeds kleiner
Hier geen recursie meer.Zorgt ervoor dat de recursieve aanroepen niet oneindig doorgaan
Hier geen recursie meer.Zorgt ervoor dat de recursieve aanroepen niet oneindig doorgaan
55Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Recursieve methoden ontwerpenRecursieve methoden ontwerpen
• Probleem recursief oplossen– Gebruik de oplossing van een kleiner of
eenvoudiger probleem om tot de oplossing van het oorspronkelijk probleem te komenVb. n! = n * (n-1)!
– Bepaal de versie van het probleem dat eenvoudig of klein genoeg is om direct op te lossen • Dit is de stop conditie Vb. 0! = 1
66Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Eenvoudige recursieve patronenEenvoudige recursieve patronen
• Patroon 1Methode (probleem)
if (probleem is eenvoudig)los het op en return oplossing
else los deel van het probleem op zodat het kleiner probleem overblijft Methode( kleiner probleem)
77Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Eenvoudige recursieve patronen (2)Eenvoudige recursieve patronen (2)
• Patroon 2Methode (probleem)
if (probleem is eenvoudig)los het op en return oplossing
else oplossing voor kleiner probleem =
Methode( kleiner probleem)
los probleem gebruik makend van oplossing voor kleiner probleem
return oplossing
88Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
VoordelenVoordelen
• Heel wat problemen worden eenvoudiger door gebruik van recursie
private int mijnMacht( int x , int y) {int teller, //telt het aantal vermenigvuldigingen
resultaat ; //houdt het tussentijdse resultaat van de// vermenigvuldigingen bij
resultaat = 1 ;teller = 0 ;while (teller != y) {
resultaat *= x ;teller ++ ;
}return resultaat ;
}
private int mijnMacht( int x , int y) {
if (y == 0) return 1 ;
else return x * mijnMacht( x , y -
1) ;}
private int mijnMacht( int x , int y) {
if (y == 0) return 1 ;
else return x * mijnMacht( x , y -
1) ;}
99Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Efficiënt zoeken in een lijst van elementenEfficiënt zoeken in een lijst van elementen• Voorwaarde: de elementen in de lijst zijn
geordend
• Werkwijze – Te vergelijken met woord zoeken in
woordenboek– Vergelijk element met middelste element
• Als gelijk dan gevonden en stop• Als element “kleiner” dan middelste dan zoek
element in eerste helft (op dezelfde wijze)• Als element “groter” dan middelste dan zoek
element in tweede helft (op dezelfde wijze)– Wordt binair zoeken genoemd
1010Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Binair zoeken - recursiefBinair zoeken - recursief
Zoek element e in array a tussen index begin en index einde:
midden = (begin + einde) / 2Als e = a[midden] dan gevondenzoniet
Als e < a[midden] dan zoek e in a tussen begin en
midden -1zoniet // e > a[midden] zoek e in a tussen midden + 1 en einde
Stopconditie?begin > einde
1111Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Binair zoeken - recursief (2)Binair zoeken - recursief (2)
private int bsearch ( int x, int [] a, int begin, int einde) {
if begin > einde return -1; // niet gevondenint midden = (begin +einde) / 2 ; // middelste positie
if x = a[midden] then return midden;if x < a[midden]
return bsearch(x , a, begin, midden -1);if x > a[midden]
return bsearch(x , a, midden +1, einde);}
Begin: bsearch(x , a , 0, a.length-1)
1212Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Voorbeeld: De torens van HanoiVoorbeeld: De torens van Hanoi
• Hoe de 7 schijven verplaatsen van toren 1 naar toren 3 onder de volgende voorwaarden:– Een schijf mag nooit bovenop een kleinere schijf– Er kan slechts één schijf te gelijk verplaatst worden– Een schijf moet steeds op een toren liggen– Enkel de bovenste schijf van de toren kan verplaatst worden
Toren 1 Toren 2 Toren 3
1313Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
De torens van Hanoi - oplossingDe torens van Hanoi - oplossingVeronderstel dat we 6 schijven kunnen verplaatsen • We verplaatsen die van Toren 1 naar Toren 2
Toren 1 Toren 2 Toren 3
Toren 2 Toren 3Toren 1
• Dan schijf van Toren 1 naar Toren 3
1414Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
De torens van Hanoi - oplossing (2)De torens van Hanoi - oplossing (2)
Toren 2 Toren 3Toren 1
• Nu verplaatsen de 6 schijven van Toren 2 naar Toren 3.
Toren 1 Toren 2 Toren 3
1515Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Torens van Hanoi - oplossing (3)Torens van Hanoi - oplossing (3)
• Oplossing voor verplaatsen van 7 schijven– Verplaats 6 schijven van toren 1 naar
toren 2– Verplaats schijf 1 van toren 1 naar
toren 3– Verplaats 6 schijven van toren 2 naar
toren 3
1616Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Torens van Hanoi - algemeenTorens van Hanoi - algemeen
Verplaats n schijven van vertrektoren naar eindtoren via een hulptoren– Verplaats n-1 schijven van vertrektoren
naar hulptoren – Verplaats 1 schijf van vertrektoren naar
eindtoren– Verplaats n-1 schijven van hulptoren
naar eindtoren
Stop conditie? N = 0 Hulptoren?
via begintoren
via eindtoren
1717Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Torens van Hanoi - algemeen (2)Torens van Hanoi - algemeen (2)
Verplaats n schijven van vertrektoren naar eindtoren via een hulptorenAls n > 0 dan– Verplaats n-1 schijven van vertrektoren
naar hulptoren via eindtoren – Verplaats 1 schijf van vertrektoren naar
eindtoren– Verplaats n-1 schijven van hulptoren
naar eindtoren via starttoren
1818Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Torens van Hanoi - programmaTorens van Hanoi - programma
• Los het probleem op via een Java programma en zorg er voor dat elke verplaatsing van een schijf op het scherm verschijnt.
1919Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Torens van Hanoi - programma (2)Torens van Hanoi - programma (2)public class Torens {
public Torens (int aantalSchijven) { … }
public void losop () { … }
private void losop ( int aantalSchijven, int van, int naar, int via) { … }
private void toonVerplaatsing ( int schijf, int van, int naar) { … }
private int schijven ;
}
private void losop ( int aantalSchijven, int van, int naar, int via) {
if (aantalSchijven <= 0 )
return;
losop( aantalSchijven - 1, van, via , naar );
toonVerplaatsing (aantalSchijven, van, naar );
losop ( aantalSchijven - 1, via , naar, van);
}
2020Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Torens van Hanoi - programma (3)Torens van Hanoi - programma (3)
public Torens (int aantalSchijven) {
this.schijven = aantalSchijven ;
}
public void losop () {
losop( schijven, 1, 3 , 2) ;
}
private void toonVerplaatsing ( int schijf, int van, int naar) {
System.out.println(“verplaats schijf “ +schijf+” van toren “+van+” naar toren “ + naar );
}
2121Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Torens van Hanoi - test programmaTorens van Hanoi - test programmaimport java.io.*;
public class TestTorens {public static void main (String[ ] arg) throws IOException {
System.out.println (“ Torens van Hanoi”);
System.out.println(“ Voer het aantal schijven in: “);
System.out.flush();
BufferedReader keyb = new BufferedReader(new InputStreamReader(System.in));
int aantal ;
aantal = Integer.parseInt ( keyb.readLine()) ;
Torens torens = new Torens (aantal) ;
torens.losop () ;
}
2222Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Torens van Hanoi - test programmaTorens van Hanoi - test programma
Output: Torens van Hanoi Voer het aantal schijven in: 3verplaats schijf 1 van toren 1 naar toren 3verplaats schijf 2 van toren 1 naar toren 2verplaats schijf 1 van toren 3 naar toren 2verplaats schijf 3 van toren 1 naar toren 3verplaats schijf 1 van toren 2 naar toren 1verplaats schijf 2 van toren 2 naar toren 3verplaats schijf 1 van toren 1 naar toren 3
2323Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Iteratie en recursieIteratie en recursie• Iteratie kan men omzetten naar recursie
while (conditie)body
Met variabelen v1, v2 , …vN en p1, p2, …, pN• Zodat p1, p2, …, pN variabelen zijn waarvan het
resultaat niet nodig is na afloop van de lus
Deklareer v1, v2 , …vN als instantie variabelenprivate void recursieveWhile ( p1, p2, …pN);
if (!conditie)return;
body ;recursiveWhile( p1, p2, …, pN);
}
Deklareer v1, v2 , …vN als instantie variabelenprivate void recursieveWhile ( p1, p2, …pN);
if (!conditie)return;
body ;recursiveWhile( p1, p2, …, pN);
}
2424Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Voorbeeld Voorbeeld
private int mijnMacht( int x , int y) {int teller, //telt het aantal vermenigvuldigingen
resultaat ; //houdt het tussentijdse resultaat van de// vermenigvuldigingen bij
resultaat = 1 ;teller = 0 ;while (teller != y) {
resultaat *= x ;teller ++ ;
}return resultaat ;
}
private recursieveMacht (int teller) {if (teller = y)
returnresultaat *= x ;recursieveMacht(teller ++);
}private int resultaat ;
private recursieveMacht (int teller) {if (teller = y)
returnresultaat *= x ;recursieveMacht(teller ++);
}private int resultaat ;
2525Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Nadeel recursieNadeel recursie• Elke aanroep van de recursieve methode
vraag geheugen – voor de private variabelen van de methode– voor de parameters van de methode1000 aanroepen dan 1000 keer plaats
nodig voor deze variabelen en parameters
• Bij iteratie worden steeds dezelfde variabelen gebruiktlus 1000 keer doorlopen toch maar 1
keer plaats nodig voor de variabelen
2626Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Keuze tussen iteratie en recursieKeuze tussen iteratie en recursie
• Eenvoudige problemen, heel veel herhaling – Iteratie
• Moeilijke problemen, weinig herhaling– Recursie
Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Hoofdstuk 9:Hergebruik
Hoofdstuk 9:Hergebruik
2828Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
VoorbeeldVoorbeeld
ProffenStudenten Muzikante
n
naam geboortejaaradres
geefLeeftijd
+ vakken,salaris
geefOpslag+ studiejaar
slagen + instrument
reserveer
Personen
2929Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
class Persoon {public Persoon (String naam, int geboortejaar) {…}public int geefLeeftijd() { …}public void zetAdres(String adres) { …}
private int geboortejaar;private String naam ;private String adres ;
}
class Prof {public Prof (String naam, int geboortejaar) {…}public int geefLeeftijd() { …}public void zetAdres(String adres) { …}public void geefOpslag( int bedrag) {…}
private int geboortejaar;private String naam ;private String adres ;private int salaris;private String vakken ;
}
Dubbel !Dubbel !
3030Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Klasse definitie herbruikenKlasse definitie herbruiken
class Persoon {public Persoon (String naam, int geboortejaar) {…}public int geefLeeftijd() { …}public void zetAdres(String adres) { …}
private int geboortejaar;private String naam ;private String adres ;
}
class Prof extends Persoon {public void geefOpslag( int bedrag) {…}
private int salaris;private String vakken ;
}Overerving (“inheritance”)Overerving (“inheritance”)
Zorgt er voor dat de klasse Prof automatisch alle instantie variabelen en methoden van de klasse Persoon krijgt.
Zorgt er voor dat de klasse Prof automatisch alle instantie variabelen en methoden van de klasse Persoon krijgt.
3131Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
InheritanceInheritanceclass Persoon {
public Persoon (String naam, int geboortejaar) {…}public int geefLeeftijd() { …}public void zetAdres(String adres) { …}
…}
class Prof extends Persoon {public void geefOpslag( int bedrag) {…}
…}
• Alle methoden van Persoon zijn ook methoden voor de klasse Prof
Prof p ;… p.zetAdres(“mijn-adres”) ;int l = p.geefLeeftijd() ;
3232Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
RechtzettingRechtzetting
class Persoon {public Persoon (String naam, int geboortejaar) {…}public int geefLeeftijd() { …}public void zetAdres(String adres) { …}
private int geboortejaar;private String naam ;private String adres ;
}
class Prof extends Persoon {public void geefOpslag( int bedrag) {…}
private int salaris;private String vakken ;
}
Door “private” zijn deze instantie variabelen niet toegankelijk in de subklasse!
Door “private” zijn deze instantie variabelen niet toegankelijk in de subklasse!
proctected int geboortejaar;protected String naam ;protected String adres ;
Oplossing indien toegankelijkheid in subklasse nodig: “Protected”
Oplossing indien toegankelijkheid in subklasse nodig: “Protected”
3333Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Subklasse en SuperklasseSubklasse en Superklasse
class Persoon {public Persoon (String naam, int geboortejaar) {…}public int geefLeeftijd() { …}public void zetAdres(String adres) { …}
protected int geboortejaar;protected String naam ;protected String adres ;
}
class Prof extends Persoon {public void geefOpslag( int bedrag) {…}
private int salaris;private String vakken ;
}
SubklassSubklass
SuperklasseSuperklasse
3434Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Wijzigingen in de superklasseWijzigingen in de superklasse
class Persoon {public Persoon (String naam, int geboortejaar) {…}public int geefLeeftijd() { …}public void zetAdres(String adres) { …}
protected int geboortejaar;protected String naam ;protected String adres ;
}
class Prof extends Persoon {public void geefOpslag( int bedrag) {…}
private int salaris;private String vakken ;
}
protected String straat ;protected int nr;protected String gemeente;protected int postnr ;
Subklasse krijgt wijziging automatischSubklasse krijgt wijziging automatisch
3535Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Voordelen gebruik subklassenVoordelen gebruik subklassen
• Vermijdt herhalingen• Laat toe om klassen stapsgewijs op te
bouwenPersoon
Personeelslid
AP-lid
Assistent Prof
• Lokaliseert wijzigingen• Bevordert de uitbreidbaarheid
Onderzoeker
3636Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Inheritance en ConstructorsInheritance en Constructorsclass Persoon {
public Persoon (String naam, int geboortejaar) {this.naam = naam ;this.geboortejaar = geboortejaar;this.adres = “ “;
}…protected int geboortejaar;protected String naam ;protected String adres ;
}Zorgt voor initialisatie vanZorgt voor initialisatie van
class Prof extends Persoon {...private int salaris;private String vakken ;
}
Prof geboortejaar naam adres salaris vakken
• De constructor Persoon kan de extra instantie variabelen van Prof niet initialiseren
3737Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Inheritance en Constructors (2)Inheritance en Constructors (2)• Prof heeft eigen constructor nodig
class Prof extends Persoon { public Prof (String naam, int geboortejaar, int salaris) {
this.naam = naam ;this.geboortejaar = geboortejaar;this.adres = “ “this.salaris = salaris ;
}
Persoon p = new Persoon(“Jan”, 1960) ;Prof pf = new Prof(“Robert”, 1947 , 100 000) ;
Prof geboortejaar naam adres salaris vakken
3838Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Inheritance en Constructors(3)Inheritance en Constructors(3)
public Prof (String naam, int geboortejaar, int salaris) {super (naam, geboortejaar);this.salaris = salaris ;
}
class Persoon {public Persoon (String naam, int geboortejaar) {
this.naam = naam ;this.geboortejaar = geboortejaar;
}…}class Prof extends Persoon { public Prof (String naam, int geboortejaar, int salaris) {
this.naam = naam ;this.geboortejaar = geboortejaar;this.salaris = salaris ;
…}
Doet hetzelfde als de constructor van Persoon
Doet hetzelfde als de constructor van Persoon
Roept de constructor van de superklasse aan
Roept de constructor van de superklasse aan
3939Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Inheritance en Constructors (4)Inheritance en Constructors (4)public Prof (String naam, int geboortejaar, int salaris) {
super (naam, geboortejaar);this.salaris = salaris ;
}
Prof geboortejaar naam adres salaris vakken
Door superDoor super
Door Prof zelfDoor Prof zelf
Opgelet! – Super moet de eerste instructie zijn!
4040Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Voorbeeld - subklasse van NameVoorbeeld - subklasse van Name
• Maak een klasse zoals Name maar die naast voornaam en familienaam ook nog een 2de voornaam bijhoudt. – Klasse ExtendedName
4141Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Klasse ExtendedName - extra gedragKlasse ExtendedName - extra gedrag
• Naast het gedrag voor Name willen we ook– Naam maken met voornaam, 2de voornaam
en familienaam– Geef de eerste letter van de 2de voornaam
(als string)• Als er geen tweede voornaam is geef dan “NMI” (No
Middle Initial)
– Geef de naam in titel, voornaam, 2de voornaam en familienaam formaat (als string)
4242Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
ExtendedName vb - Bepaal de interfaceExtendedName vb - Bepaal de interface
– Class name: ExtendedName
– Constructor: vb: ExtendedName ik = new ExtendedName (“Olga”,
“Magdalena”, “De
Troyer”);public void ExtendedName(String first, String middle, String last)
vb: ExtendedName ik = new ExtendedName (“Olga”, “De Troyer”);public void ExtendedName(String first, String last)
– Geef initiaal van 2de voornaam: vb: String s = ik.getMiddleInitial();public String getMiddleInitial()
– Geef titel, voornaam, 2de voornaam, familienaam: • vb: String s = ik.getFormalName();
public String getFornalName()
4343Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
ExtendedName vb - Klasse skeletExtendedName vb - Klasse skelet
class ExtendedName extends Name{// extra instantie variabeleprivate String middleName;
public ExtendedName( String first, String middle, String last ) {statements
}public ExtendedName( String first, String last ) {
statements}
// geef initiaal van de 2de voornaam public String getMiddleInitial( ) {
statements}// geef title, voornaam, 2de voornaam, familienaam public String getFormalName( ) {
statements}
}
4444Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
ExtendedName vb - Implementatie (1)ExtendedName vb - Implementatie (1)class ExtendedName extends Name{
// extra instantie variabeleprivate String middleName;
public ExtendedName( String first, String middle, String last ) {super( first, last) ;this.middleName = middle ;
}public ExtendedName( String first, String last ) {
super( first, last) ;this.middleName = “” ;
}// geef initiaal van de 2de voornaam public String getMiddleInitial( ) {
if (! middleName.equals(“ “) return middleName.substring(0,1) ;else return(“NMI”) ;
}// geef title, voornaam, 2de voornaam, familienaam public String getFormalName( ) {
return title + “ “ + firstName + “ “ + middleName + “ “ + lastName ;}
}
4545Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
ExtendedName vb - Implementatie (2)ExtendedName vb - Implementatie (2)
• Instantie variabelen van Name moeten protected worden
class Name {...// instantie variabelen protected String firstName; protected String lastName; protected String title ;}
}
4646Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Subklassen en ToekenningenSubklassen en Toekenningen
• Een object van een subklasse kan overal worden gebruikt waar een object van de superklasse is toegelatenName naam ;ExtendedName naamJef = new ExtendedName(“Jef”, “Piet”, “Verelst”);naam = naamJef;
Niet toegelaten:Name naamJan = new Name(“Jan”, “Janssens”);ExtendedName eNaam ;eNaam = naamJan;
4848Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Compositie versus InheritanceCompositie versus Inheritanceclass Name2 {
public Name2( String first, String middle, String last ) { ...}public String getMiddleInitial( ) { … } public String getFormalName( ) { … }
// instantie variabele
private Name n;private String middleName;}
}
Bevat een referentie naar een Name objectBevat een referentie naar een Name object
Name2 erft niet de instantie variabelen en methoden van Name object n
Name2 n middleName
ExtendedName firstName lastName title middleName
Via InheritanceCompositie
4949Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Compositie versus Inheritance (2)Compositie versus Inheritance (2)class Name2 {
public Name2( String first, String middle, String last ) {n = new Name(first, last);this.middleName = middle ;
}…
}
Name2 n2 = new Name2(“Jana”, “Jeanne”, “Bens”) ;
n2.getInitials() ; Fout! Geen methode van Name2Fout! Geen methode van Name2
5050Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Compositie versus Inheritance (3)Compositie versus Inheritance (3)
• Compositie modelleert een “heeft-een”-relatie (“has-a”)– Een fiets heeft een wiel– Een persoon heeft een naam
• Inheritance modelleert een “is-een” relatie (“is-a”)– Een deeltijdse werknemer is een werknemer– Een kat is een dier
• Combinatie van compositie en inheritance kan– Een fiets is een voertuig en heeft een wiel– Een wiel is een onderdeel
5151Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Klasse hiërarchieKlasse hiërarchie
• Een subklasse kan zelf ook subklassen hebben
Persoon
Personeelslid
AP-lid
Assistent Prof
• Een klasse kan meerdere subklassen hebben
5252Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
De klasse ObjectDe klasse Object
• Alle klassen in Java zijn direct of indirect een subklasse van de klasse Object
• Object is de top van de klasse hiërarchie.
Object
5353Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Methoden overschrijvenMethoden overschrijven
• Sommige methoden die een subklasse erft van zijn superklasse, zijn niet (helemaal) geschikt– Vb: getInitials voor ExtendedName
• Oplossing – Vervang definitie van getInitials voor ExtendedName
class ExtendedName extends Name{...
public String getInitials() { return firstName.substring(0,1)+”.”
+ middleName .substring(0,1)+”.”+ lastName.substring(0,1) ;
}...
}
5454Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Methoden overschrijven (2)Methoden overschrijven (2)
• Deze techniek noemt men “overriding”– Het her-implementeren van een methode
geërfd van een superklasse in een subklasse – De signatuur van de methode blijft dezelfde.
• De methode in de superklasse blijft ongewijzigd– getInitials voor Name-object, definitie uit Name klasse– getInitials voor ExtendedName-object, definitie uit
ExtendedName klasse
5555Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Methoden overschrijven (3)Methoden overschrijven (3)• Welke methode wordt uitgevoerd?
Name n = new Name (“Peter”, “Peters”) ;ExtendedName en = new ExtendedName (“Jan”, “Peter”, “Claessen”) ;String initials ;
initials = n.getInitials() ;
initials = en.getInitials() ;
Name n = new ExtendedName (“Tom”, “Luc”, “Janssens”) ;
initials = n.getInitials() ;
n = new Name (“Peter”, “Peters”) ;
initials = n.getInitials() ;
Het zoeken naar de juiste methode begint in de klasse van het objectHet zoeken naar de juiste methode begint in de klasse van het object
getInitials uit de klasse NamegetInitials uit de klasse Name
getInitials uit de klasse ExtendedNamegetInitials uit de klasse ExtendedName
getInitials uit de klasse ExtendedNamegetInitials uit de klasse ExtendedName
getInitials uit de klasse NamegetInitials uit de klasse Name
5656Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Het zoeken naar de juiste methodeHet zoeken naar de juiste methode
ObjectObject
...
bericht
object
klasse
Super-klasse
5757Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Overschrijven versus overladenOverschrijven versus overladen
• Overladen (“overloading”)– Naam van de methoden is dezelfde– Signatuur van de methoden is verschillend• Laat toe om dezelfde naam voor verschillende
methoden te gebruiken• Welke methode gebruikt wordt bepaald door de
aanroep• Overschrijven (“overriding”)
– Naam en signatuur van de methode is dezelfde• Laat toe methode te herdefiniëren • Welke methode gebruikt wordt bepaald bij
uitvoering
5858Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Methode voor de klasse ObjectMethode voor de klasse Object
public boolean equals(Object o) ;- laat toe te testen wanneer twee objecten gelijk zijn– moet in elke nieuwe klasse her
geïmplementeerd worden (indien nodig) (overriding)• Zoniet enkel true indien hetzelfde object
Voorbeeld:class Name {
public boolean Equals (Object o) {Name n = (Name) o ;return this.firstName.equals(n.firstName) &&
this.lastName.equals(n.lastName) && this.title.equals(n.title)
}
5959Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Equals voorbeeldEquals voorbeeld
• Zonder equals definitie voor NameName n1 = new Name(“Piet”, “Janssens”) ;
Name n2 = new Name(“Piet”, “Janssens”) ;
n1.equals(n2) ;
n2 = n1 ;
n1.equals(n2) ;
falsefalse
truetrue
• Met gegeven equals definitie voor Name– Beide true
6060Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Superklasse voor gemeenschappelijke eigenschappen
Superklasse voor gemeenschappelijke eigenschappen
• Voorbeeld– Stockbeheer
• Fototoestellen: identificatie nr, beschrijving, hoeveelheid in stock, prijs, met of zonder lens, maximale sluitingssnelheid
• Lenzen: identificatie nr, beschrijving, hoeveelheid in stock, prijs, zoom-mogelijkheid, bereik
• Film: identificatie nr, beschrijving, hoeveelheid in stock, prijs, asa, aantal opnamen
6161Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Superklasse voor gemeenschappelijke eigenschappen (2)
Superklasse voor gemeenschappelijke eigenschappen (2)
• Fototoestellen: identificatie nr, beschrijving, hoeveelheid in stock, prijs, met of zonder lens, maximale sluitingssnelheid
• Lenzen: identificatie nr, beschrijving, hoeveelheid in stock, prijs, zoom-mogelijkheid, bereik
• Film: identificatie nr, beschrijving, hoeveelheid in stock, prijs, asa, aantal opnamen
Gemeenschappelijke eigenschappen in een superklasse
• Klasse StockItem: identificatie nr, beschrijving, hoeveelheid in stock, prijs
6262Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Superklasse voor gemeenschappelijke eigenschappen (3)
Superklasse voor gemeenschappelijke eigenschappen (3)
class StockItem {public StockItem (…) {…}public String getBeschrijving () {…}public int getAantal () {…}public int getPrijs () {…}String beschrijving;protected int identificatieNr ;protected int hoeveelheid ;protected int prijs ;
}
class Lens extends StockItem {…private boolean metZoom ;private int maxbereik ;
}
class Film extends StockItem {…private int asa ;private int aantalOpnamen ;
}
class Fototoestel extends StockItem {…boolean metLens ;private int maxSluiting ;private String kleur ;
}
6363Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Abstracte methodenAbstracte methoden
• Voorbeeld– We willen een methode print die per stock
item alle gegevens afdrukt• Print methode is gemeenschappelijke methode• Maar Print implementatie is verschillend voor
fototoestel, lens en film
– Print als methode in superklasse StockItem
– Elke subklasse overschrijft de print methode – Maar! Wat is de implementatie van print voor
de klasse StockItem?
6464Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Abstracte methoden (2)Abstracte methoden (2)• Methode print in de klasse StockItem enkel met als
doel gemeenschappelijk gedrag van de subklassen vast te leggen– Wordt abstracte methode genoemd
abstract void print () ;
• Een klasse met één of meerdere abstracte methoden is een abstracte klasse
abstract class StockItem {…abstract void print () ;
– Men kan geen objecten creëren van een abstracte klasse
• Namelijk de klasse is onvolledig gespecificeerd
6565Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Voorbeeld abstracte klasseVoorbeeld abstracte klassepublic abstract class StockItem {
public StockItem (…) {…}public String getBeschrijving () {…}public int getAantal () {…}public int getPrijs () {…}public abstract void print () ;protected String beschrijving; protected int identificatieNr ; protected int hoeveelheid ; protected int prijs ;
}
class Fototoestel extends StockItem {…public void print () { … } ;private boolean metLens ; private int maxSluiting ; private String kleur ;
}
class Lens extends StockItem {…public void print () { … } ; private boolean metZoom ; private int maxbereik ;
}
class Film extends StockItem {…public void print () { … } ; private int asa ; private int aantalOpnamen ;
}
6666Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Voorbeeld abstracte klasse (2)Voorbeeld abstracte klasse (2)
StockItem item ;item = new StockItem() ;…item.print ;
item = new Fototoetstel (…) ;…item.print ;
item = new Lens(…) ;…item.print ;
item = new Film(…);…item.print ;
FoutFout
Print is gedefinieerd voor StockItemPrint is gedefinieerd voor StockItem
6767Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Abstracte klassenAbstracte klassen
• Een abstracte klasse kan zelf abstracte klassen als subklassen hebben
cirkel
rechthoek driehoek
Figuur
veelhoek
6868Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer
Abstracte methode voor de klasse ObjectAbstracte methode voor de klasse Object
public String toString() ;
- maakt een String representatie van het object– moet in elke nieuwe klasse
geïmplementeerd worden (indien nodig)Voorbeeld:class Name {
public String toString() {
return (firstName + lastName);
}