Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

67
Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie

Transcript of Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

Page 1: 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

Page 2: Inleiding Informatica Prof. Dr. O. De Troyer 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

Page 3: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 4: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 5: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 6: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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)

Page 7: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 8: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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) ;}

Page 9: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 10: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 11: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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)

Page 12: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 13: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 14: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 15: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 16: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 17: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 18: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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.

Page 19: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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);

}

Page 20: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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 );

}

Page 21: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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 () ;

}

Page 22: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 23: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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);

}

Page 24: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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 ;

Page 25: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 26: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 27: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

Inleiding InformaticaInleiding Informatica Prof. Dr. O. De TroyerProf. Dr. O. De Troyer

Hoofdstuk 9:Hergebruik

Hoofdstuk 9:Hergebruik

Page 28: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 29: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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 !

Page 30: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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.

Page 31: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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() ;

Page 32: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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”

Page 33: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 34: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 35: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 36: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 37: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 38: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 39: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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!

Page 40: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 41: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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)

Page 42: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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()

Page 43: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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}

}

Page 44: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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 ;}

}

Page 45: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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 ;}

}

Page 46: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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;

Page 47: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 48: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 49: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 50: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 51: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 52: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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) ;

}...

}

Page 53: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 54: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 55: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 56: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 57: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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)

}

Page 58: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 59: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 60: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 61: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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 ;

}

Page 62: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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?

Page 63: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 64: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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 ;

}

Page 65: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 66: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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

Page 67: Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

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);

}