De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Hoofdstuk 8: Recursie.

Verwante presentaties


Presentatie over: "Hoofdstuk 8: Recursie."— Transcript van de presentatie:

1 Hoofdstuk 8: Recursie

2 Voorbeelden n! = 1 n = 0 n! = n * (n -1 )! n > 0
xY = 1 y = 0, x ≠ 0 xY = x * xY-1 y > 0 Recursieve definitie: definitie gegeven in term of zichzelf

3 Recursieve werkwijze Hoe n! berekenen? Hoe (n-1)! 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: Stop conditie Hier stoppen we 4! 3! 2! 1! 0! = 1 Berekenen door Berekenen door Berekenen door Berekenen door

4 Java Als n = 0 dan is n! gelijk aan 1 Als n > 0 dan
We berekenen eerst (n-1)! We vermenigvuldigen dit resultaat met n Java private static int fac( int n) { if (n == 0) return 1; else return n * MijnFac.fac( n-1) ; } Hier geen recursie meer. Zorgt ervoor dat de recursieve aanroepen niet oneindig doorgaan n wordt steeds kleiner

5 Recursieve methoden ontwerpen
Probleem recursief oplossen Gebruik de oplossing van een kleiner of eenvoudiger probleem om tot de oplossing van het oorspronkelijk probleem te komen Vb. 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

6 Eenvoudige recursieve patronen
Patroon 1 Methode (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)

7 Eenvoudige recursieve patronen (2)
Patroon 2 Methode (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

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

9 Efficië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

10 Binair zoeken - recursief
Zoek element e in array a tussen index begin en index einde: midden = (begin + einde) / 2 Als e = a[midden] dan gevonden zoniet Als e < a[midden] dan zoek e in a tussen begin en midden -1 zoniet // e > a[midden] zoek e in a tussen midden + 1 en einde Stopconditie? begin > einde

11 Binair zoeken - recursief (2)
private int bsearch ( int x, int [] a, int begin, int einde) { if begin > einde return -1; // niet gevonden int 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)

12 Voorbeeld: 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

13 De torens van Hanoi - oplossing
Veronderstel dat we 6 schijven kunnen verplaatsen We verplaatsen die van Toren 1 naar Toren 2 Toren 1 Toren 2 Toren 3 Dan schijf van Toren 1 naar Toren 3 Toren 2 Toren 3 Toren 1

14 De torens van Hanoi - oplossing (2)
Nu verplaatsen de 6 schijven van Toren 2 naar Toren 3. Toren 1 Toren 2 Toren 3

15 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

16 Torens 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 via eindtoren via begintoren Stop conditie? N = 0 Hulptoren?

17 Torens van Hanoi - algemeen (2)
Verplaats n schijven van vertrektoren naar eindtoren via een hulptoren Als 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

18 Torens 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.

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

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

21 Torens van Hanoi - test programma
import 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 () ; }

22 Torens van Hanoi - test programma
Output: Torens van Hanoi Voer het aantal schijven in: 3 verplaats schijf 1 van toren 1 naar toren 3 verplaats schijf 2 van toren 1 naar toren 2 verplaats schijf 1 van toren 3 naar toren 2 verplaats schijf 3 van toren 1 naar toren 3 verplaats schijf 1 van toren 2 naar toren 1 verplaats schijf 2 van toren 2 naar toren 3

23 Iteratie 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 variabelen private void recursieveWhile ( p1, p2, …pN); if (!conditie) return; body ; recursiveWhile( p1, p2, …, pN); }

24 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) return resultaat *= x ; recursieveMacht(teller ++); } private int resultaat ;

25 Nadeel recursie Elke aanroep van de recursieve methode vraag geheugen
voor de private variabelen van de methode voor de parameters van de methode 1000 aanroepen dan 1000 keer plaats nodig voor deze variabelen en parameters Bij iteratie worden steeds dezelfde variabelen gebruikt lus 1000 keer doorlopen toch maar 1 keer plaats nodig voor de variabelen

26 Keuze tussen iteratie en recursie
Eenvoudige problemen, heel veel herhaling Iteratie Moeilijke problemen, weinig herhaling Recursie

27 Hoofdstuk 9: Hergebruik

28 Voorbeeld Personen Muzikanten Studenten Proffen geefLeeftijd naam
geboortejaar adres geefLeeftijd Muzikanten Studenten Proffen + vakken, salaris geefOpslag + studiejaar slagen + instrument reserveer

29 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 ; } Dubbel ! 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 ; }

30 Klasse 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 ; Zorgt er voor dat de klasse Prof automatisch alle instantie variabelen en methoden van de klasse Persoon krijgt. Overerving (“inheritance”)

31 Inheritance class 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() ;

32 Rechtzetting 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! proctected int geboortejaar; protected String naam ; protected String adres ; Oplossing indien toegankelijkheid in subklasse nodig: “Protected”

33 Subklasse 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 ; Superklasse Subklass

34 Wijzigingen 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 automatisch

35 Voordelen gebruik subklassen
Vermijdt herhalingen Laat toe om klassen stapsgewijs op te bouwen Persoon Personeelslid AP-lid Assistent Onderzoeker Prof Lokaliseert wijzigingen Bevordert de uitbreidbaarheid

36 Inheritance en Constructors
class 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 van Prof geboortejaar naam adres salaris vakken class Prof extends Persoon { ... private int salaris; private String vakken ; } De constructor Persoon kan de extra instantie variabelen van Prof niet initialiseren

37 Inheritance en Constructors (2)
Prof heeft eigen constructor nodig Prof geboortejaar naam adres salaris vakken 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 , ) ;

38 Inheritance en Constructors(3)
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.salaris = salaris ; Doet hetzelfde als de constructor van Persoon public Prof (String naam, int geboortejaar, int salaris) { super (naam, geboortejaar); this.salaris = salaris ; } Roept de constructor van de superklasse aan

39 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 super Door Prof zelf Opgelet! Super moet de eerste instructie zijn!

40 Voorbeeld - subklasse van Name
Maak een klasse zoals Name maar die naast voornaam en familienaam ook nog een 2de voornaam bijhoudt. Klasse ExtendedName

41 Klasse 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)

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

43 ExtendedName vb - Klasse skelet
class ExtendedName extends Name{ // extra instantie variabele private String middleName; public ExtendedName( String first, String middle, String last ) { statements } public ExtendedName( String first, String last ) { // geef initiaal van de 2de voornaam public String getMiddleInitial( ) { // geef title, voornaam, 2de voornaam, familienaam public String getFormalName( ) {

44 ExtendedName vb - Implementatie (1)
class ExtendedName extends Name{ // extra instantie variabele private String middleName; public ExtendedName( String first, String middle, String last ) { super( first, last) ; this.middleName = middle ; } public ExtendedName( String first, String 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 ;

45 ExtendedName vb - Implementatie (2)
Instantie variabelen van Name moeten protected worden class Name { ... // instantie variabelen protected String firstName; protected String lastName; protected String title ; }

46 Subklassen en Toekenningen
Een object van een subklasse kan overal worden gebruikt waar een object van de superklasse is toegelaten Name naam ; ExtendedName naamJef = new ExtendedName(“Jef”, “Piet”, “Verelst”); naam = naamJef; Niet toegelaten: Name naamJan = new Name(“Jan”, “Janssens”); ExtendedName eNaam ; eNaam = naamJan;

47 Subklassen en Toekenningen (2)
Maar! Een object van een subklasse kan zich in de context van een superklasse object enkel als een superklasse object gedragen Name naam ; ExtendedName naamJef = new extendedName(“Jef”, “Piet”, “Verelst”); naam = naamJef; naam.getInitials() ; Niet toegelaten: naam.getFormalName() ;

48 Compositie versus Inheritance
class 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 object Name2 erft niet de instantie variabelen en methoden van Name object n ExtendedName firstName lastName title middleName Via Inheritance Name2 n middleName Compositie

49 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 Name2

50 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

51 Klasse hiërarchie Een subklasse kan zelf ook subklassen hebben
Persoon Personeelslid AP-lid Assistent Prof Een klasse kan meerdere subklassen hebben

52 De 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

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

54 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

55 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”) ; n = new Name (“Peter”, “Peters”) ; getInitials uit de klasse Name getInitials uit de klasse ExtendedName getInitials uit de klasse ExtendedName getInitials uit de klasse Name Het zoeken naar de juiste methode begint in de klasse van het object

56 Het zoeken naar de juiste methode
Object ... Super-klasse klasse bericht object

57 Overschrijven 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

58 Methode 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) }

59 Equals voorbeeld Zonder equals definitie voor Name
Name n1 = new Name(“Piet”, “Janssens”) ; Name n2 = new Name(“Piet”, “Janssens”) ; n1.equals(n2) ; n2 = n1 ; false true Met gegeven equals definitie voor Name Beide true

60 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

61 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

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

63 Abstracte 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?

64 Abstracte methoden (2) Wordt abstracte methode genoemd
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 { Men kan geen objecten creëren van een abstracte klasse Namelijk de klasse is onvolledig gespecificeerd

65 Voorbeeld abstracte klasse
public 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 { private int asa ; private int aantalOpnamen ;

66 Voorbeeld abstracte klasse (2)
StockItem item ; item = new StockItem() ; item.print ; item = new Fototoetstel (…) ; item = new Lens(…) ; item = new Film(…); Fout Print is gedefinieerd voor StockItem

67 Abstracte klassen Een abstracte klasse kan zelf abstracte klassen als subklassen hebben Figuur veelhoek cirkel rechthoek driehoek

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

69 Abstracte methoden zonder subklassen
Een interface is een soort klasse die enkel een aantal abstracte methoden specificeert Elke klasse die deze interface implementeert moet deze methoden voorzien Er is hier geen sprake van inheritance

70 Interface - voorbeeld interface Movable { boolean start (); void stop () ; boolean turn (int degrees) ; boolean changeSpeed (double kmPerHour); } declareert de minimale methoden voor “movable” objects class Plane implements Movable { boolean start () { ... }; void stop () { ... }; boolean turn (int degrees) { ... }; boolean changeSpeed (double kmPerHour) { ... }; ...

71 Interface en subklasse
Klasse kan tegelijkertijd een interface implementeren en een subklasse zijn class Plane extends Vehicle implements Movable { ... }


Download ppt "Hoofdstuk 8: Recursie."

Verwante presentaties


Ads door Google