6.1 Inleiding HOOFDSTUK 6 METHODEN Tot nu toe: kleine, eenvoudige programma’s applicatie: methode main() applet: methode paint() en eventueel init() Vanaf hoofdstuk 6: complexere, grotere programma’s (= realiteit) Gevolg: programma verdelen in kleine stukjes, modules genoemd = verdeel en heers methode
6.2 Programmamodules in JAVA methoden klassen Java API voorziet meerdere modules Programmeurs kunnen zelf ook modules ontwerpen, nl. programmer-defined modules JAVA-programma = combinatie van nieuwe methoden en klassen, die de programmeur schrijft, met methodes en klassen die beschikbaar zijn in de Java API! VERMIJD HET HERUITVINDEN VAN HET WIEL!
6.2 Programmamodules in JAVA (vervolg) Methoden om specifieke taken te definiëren Voorbeeld: invoer van een positief geheel getal + test kan meerdere keren in een programma gebruikt worden! aanroepen via een method call; specifieert de naam van de methode en de data, die de methode nodig heeft om de taak uit te voeren = argumenten kan een resultaat teruggeven aan de calling method (caller)
6.2 Programmamodules in JAVA (vervolg) Methoden Te vergelijken met de baas (caller), die zijn werknemer vraagt (called method) een taak te volbrengen en de resultaten te rapporteren. De baas moet niet weten hoe de werker zijn taak volbrengt. Een werker kan ook beroep doen op andere werkers, zonder dat de baas dit weet!
baas werkman1 werkman2 werkman3 werkman4 werkman5 Fig. 6.1 Hierarchische baas-methode/werkman-methode relatie.
6.3 Klassemethoden van de klasse Math class java.lang.Math voorziet gebruikelijke mathematische bewerkingen Voorbeeld: de vierkantswortel van 900.0 double x = Math.sqrt(900.0); De methode sqrt behoort tot de klasse Math en is static, zoals alle methoden in deze klasse! aanroep: klassenaam.methodenaam(argumenten)
6.3 Klassemethoden van de klasse Math (vervolg) class java.lang.Math na de methodenaam volgen de argumenten tussen ronde haakjes; nul, één of meerdere gescheiden door komma’s Argumenten kunnen constanten zijn: double x = Math.sqrt(50); variabelen zijn: double y = 14, x = Math.sqrt(y); expressies zijn: double z = 70.5; System.out.println( Math.sqrt(z+7));
Oef 1. Wat is de waarde van x na evaluatie ? x = Math.abs(7.5); x = Math.floor(7.5); x = Math.abs(0.0); x = Math.ceil(0.0); x = Math.abs(-6.4); x = Math.ceil(-6.4); x = Math.ceil(-Math.abs(-8 + Math.floor(-5.5)));
6.4 Methoden definitie. Methoden laten modularisatie van een programma toe Voordelen: maakt programmaontwikkeling eenvoudiger software kan opnieuw gebruikt worden vermijd herhalende code
6.4 Methoden definitie (vervolg). gebruiken lokale variabelen enkel de methode kent de lokale variabelen lokale variabelen bestaan enkel vanaf de declaratie tot aan de sluitaccolade van de body waarin ze gedeclareerd zijn
6.4 Methoden definitie (vervolg). hebben meestal een lijst van parameters parameters voorzien uitwisseling van informatie tussen methoden via de methode oproep (method call) een parameter is eveneens een lokale variabele voor de methode Voorbeelden: public static void main (String[] args) -> args public void paint (Graphics g) -> g public double square (double x) -> x
6.4 Methoden definitie (vervolg). Programmeurs kunnen hun eigen methoden schrijven, naast het gebruikmaken van methoden uit de Java API. Voorbeeld 1: SquareIntegers.java een applet, dat de kwadraten van de gehele getallen van 1 t.e.m. 10 bepaalt en weergeeft op het scherm Hierbij wordt een for-herhalingsstructuur en een zelfgedefinieerde methode square gebruikt. De functie square bepaalt het kwadraat van een willekeurig geheel getal.
1 // Fig. 6.3: SquareIntegers.java 2 // Met zelfgedefinieerde square methode 3 4 // Java core packages 5 import java.awt.Container; 6 7 // Java extension packages 8 import javax.swing.*; 9 10 public class SquareIntegers extends JApplet 11 { 12 // opzetten van GUI en berekenen van kwadraten van 1 tot 10 13 public void init() 14 { 15 // JTextArea om resultaten weer te geven 16 JTextArea outputArea = new JTextArea(); 17 18 // een referentie naar de applets content pane 19 Container container = getContentPane(); 20 21 // outputArea vasthechten aan container 22 container.add( outputArea ); 23 24 int result; // resultaat van methode-aanroep square 25 String output = ""; // String die resultaten bevat 26
27 // lus 10 keer 28 for ( int counter = 1; counter <= 10; counter++ ) 29 { 30 // berekenen kwadraat van counter en in result stoppen 31 result = square( counter ); 32 33 // result toevoegen aan String output 34 output += "The square of " + counter + 35 " is " + result + "\n"; 36 37 } // einde for-lus 38 39 outputArea.setText( output ); // zet resultaten in JTextArea 40 41 } // einde methode init 42 43 // square methode definitie 44 public int square( int y ) 45 { 46 return y * y; // return square of y 47 48 } // einde methode square 49 50 } // einde klasse SquareIntegers
12 // opzetten van GUI en berekenen van kwadraten van 1 tot 10 13 public void init() 14 { 15 // JTextArea om resultaten weer te geven 16 JTextArea outputArea = new JTextArea(); 17 18 // een referentie naar de applets content pane 19 Container container = getContentPane(); 20 21 // outputArea vasthechten aan container 22 container.add( outputArea ); Lijn 19 : Elk weergavescherm van een applet heeft een “content pane”, waaraan GUI componenten kunnen worden gekoppeld. De “content pane” is een object van de klasse Container (java.awt). getContentPane() geeft een referentie terug naar het “content pane” van de applet; deze functie erven we van de klasse JApplet Lijn 22 : outputArea GUI-component wordt aan “content pane” gekoppeld en neemt het volledige grafische scherm van de applet in beslag
Aanroep van de methode square 26 27 // lus 10 keer 28 for ( int counter = 1; counter <= 10; counter++ ) 29 { 30 // berekenen kwadraat van counter en in result stoppen 31 result = square( counter ); 32 33 // result toevoegen aan String output 34 output += "The square of " + counter + 35 " is " + result + "\n"; 36 37 } // einde for-lus Lijn 31 Aanroep van de methode square Methode square levert een int (returns), die in result wordt opgeslagen. Deze terugkeerwaarde is het kwadraat van counter.
Zelfgedefinieerde methode square Terugkeerwaarde = int 43 // square methode definitie 44 public int square( int y ) 45 { 46 return y * y; // return square of y 47 48 } // einde methode square 49 50 } // einde klasse SquareIntegers Lijn 44 tot 48 Zelfgedefinieerde methode square Terugkeerwaarde = int Methodenaam = square Parameterlijst = 1 integer, nl. y Return = y*y
6.4 Methoden definitie (vervolg). Algemeen formaat van een methode: terugkeerwaarde-type methodenaam( parameterlijst ) { declaraties en statements } De methodenaam moet een geldige , betekenisvolle identifier zijn! Het terugkeerwaardetype is het type van het resultaat dat de methode teruggeeft aan de caller. void (leeg): er is geen terugkeerwaarde int: de methode geeft een geheel getal terug Een methode kan tenhoogste één waarde teruggeven!
6.4 Methoden definitie (vervolg). De parameterlijst = lijst van elke parameternaam en –type, gescheiden door komma’s. Voor elke parameter MOET er een argument zijn in de aanroep van de methode én het type moet compatibel zijn! Voorbeeld: public double square (double y) y kan één van de volgende waarden ontvangen: 7.35, 22, -0.034 y kan de string “Hello” niet ontvangen! Een parameterlijst kan leeg zijn! Voorbeeld: public void init() { }
6.4 Methoden definitie (vervolg). Er zijn drie verschillende mogelijkheden om terug te keren naar de caller: als er geen terugkeerwaarde is, keren we terug wanneer * de sluitaccolade van de methode bereikt is OF * het statement return; wordt uitgevoerd als er wel een terugkeerwaarde is, keren we terug wanneer het statement return expression; wordt uitgevoerd; de expressie wordt geëvalueerd en de resulterende waarde wordt teruggegeven aan de caller
6.4 Methoden definitie (vervolg). Methode-body = block met declaraties van lokale variabelen statements Een methode kan NIET gedefinieerd zijn binnen een andere methode! Een methode kan wel caller zijn van zichzelf = recursieve methode (zie $ 6.12)
6.4 Methoden definitie (vervolg). Er zijn drie verschillende manieren om methoden aan te roepen: via een referentie naar een object, gevolgd door de puntoperator: g.drawLine(x1,y1,x2,y2); via een klassenaam, gevolgd door de puntoperator: int i = Integer.parseInt(stringToConvert); (enkel voor static-methoden van een klasse!) gewoon de naam van de methode en de argumenten int result = square(counter); Dit kan enkel door een caller uit dezelfde klasse!
VOORBEELD 2 Maximum.java Een applet, die het maximum van drie reële getallen bepaalt. Er wordt een zelfgedefinieerde methode maximum uitgewerkt, die op haar beurt een voorgedefinieerde methode Math.max() gebruikt.
1 // Fig. 6.4: Maximum.java 2 // Het maximum vinden van drie doubles 3 4 // Java core packages 5 import java.awt.Container; 6 7 // Java extension packages 8 import javax.swing.*; 9 10 public class Maximum extends JApplet 11 { 12 // initialiseer applet door gebruikersinput en maken van GUI 13 public void init() 14 { 15 // vraag gebruikersinput 16 String s1 = JOptionPane.showInputDialog( 17 "Enter first floating-point value" ); 18 String s2 = JOptionPane.showInputDialog( 19 "Enter second floating-point value" ); 20 String s3 = JOptionPane.showInputDialog( 21 "Enter third floating-point value" ); 22 23 // converteer gebruikersinput naar double 24 double number1 = Double.parseDouble( s1 ); 25 double number2 = Double.parseDouble( s2 ); 26 double number3 = Double.parseDouble( s3 ); 27
28 // methode-aanroep maximum om grootste waarde te bepalen 29 double max = maximum( number1, number2, number3 ); 30 31 // maak JTextArea om resultaten weer te geven 32 JTextArea outputArea = new JTextArea(); 33 34 35 outputArea.setText( "number1: " + number1 + 36 "\nnumber2: " + number2 + "\nnumber3: " + number3 + 37 "\nmaximum is: " + max ); 38 39 // referentie naar de applets GUI component display area 40 Container container = getContentPane(); 41 42 // outputArea vasthechten aan Container c 43 container.add( outputArea ); 44 45 } // einde methode init 46 47 // maximum methode gebruikt Math klasse methode max om 48 // de maximum waarde te bepalen 49 public double maximum( double x, double y, double z ) 50 { 51 return Math.max( x, Math.max( y, z ) ); 52 53 } // einde methode maximum 54 55 } // einde klasse Maximum
Maximum.java
12 // initialiseer applet door gebruikersinput en maken van GUI 13 public void init() 14 { 15 // vraag gebruikersinput 16 String s1 = JOptionPane.showInputDialog( 17 "Enter first floating-point value" ); 18 String s2 = JOptionPane.showInputDialog( 19 "Enter second floating-point value" ); 20 String s3 = JOptionPane.showInputDialog( 21 "Enter third floating-point value" ); 22 23 // converteer gebruikersinput naar double 24 double number1 = Double.parseDouble( s1 ); 25 double number2 = Double.parseDouble( s2 ); 26 double number3 = Double.parseDouble( s3 ); 27 28 // methode-aanroep maximum om grootste waarde te bepalen 29 double max = maximum( number1, number2, number3 ); 30 Lijn 29 Aanroep van de methode maximum. Deze methode geeft een double terug, die het grootste getal van de drie meegegeven argumenten voorstelt. Dit resultaat komt in max.
outputArea GUI-component wordt aan “content pane” gekoppeld 31 // maak JTextArea om resultaten weer te geven 32 JTextArea outputArea = new JTextArea(); 33 34 35 outputArea.setText( "number1: " + number1 + 36 "\nnumber2: " + number2 + "\nnumber3: " + number3 + 37 "\nmaximum is: " + max ); 38 39 // referentie naar de applets GUI component display area 40 Container container = getContentPane(); 41 42 // outputArea vasthechten aan Container c 43 container.add( outputArea ); 44 45 } // einde methode init Lijn 40 tot 43 getContentPane() geeft een referentie terug naar het “content pane” van de applet outputArea GUI-component wordt aan “content pane” gekoppeld
Zelfgedefinieerde methode maximum : Terugkeerwaarde = double 47 // maximum methode gebruikt Math klasse methode max om 48 // de maximum waarde te bepalen 49 public double maximum( double x, double y, double z ) 50 { 51 return Math.max( x, Math.max( y, z ) ); 52 53 } // einde methode maximum 54 55 } // einde klasse Maximum Lijn 49 tot 53 Zelfgedefinieerde methode maximum : Terugkeerwaarde = double Methodenaam = maximum Parameterlijst = 3 doubles x,y en z Return = maximum van de 3 doubles, gebruikmakend van de voorgedefinieerde methode max uit de klasse Math, die van 2 getallen het grootste kan bepalen.
Oef 2. Schrijf een methode getTemperatuurStatus. int intTemp = Integer.parseInt(JOptionPane.showInputDialog(null, “geef de temperatuur”)); String temp = getTemperatuurStatus(intTemp); In temp komt de “koud” bij x < 10 of “lauw” bij x tussen [10 en 20] of “warm” bij x > 20 Met x de ingegeven temperatuur.
Oef 3. Wijzig de methode getTemperatuurStatus. Maak de methode getTemperatuurStatus meer algemeen bruikbaar. De temperatuur moet zowel in graden Celcius (oorspronkelijke versie) als in Fahrenheit doorgegeven kunnen worden. Het eindresultaat blijft uiteraard hetzelfde. de formule F = 32 + (C * 9)/5 .
6.5 Argumentpromotie Typeconversie (Coercion) van argumenten Forceert argumenten naar het gepaste type om door te geven aan de methode bv. sqrt() verwacht een double: System.out.println( Math.sqrt( 4 ) ); Evalueert Math.sqrt( 4.) Evalueert dan System.out.println(2.) Promotieregels Specifiëren hoe types converteren naar andere types zonder gegevensverlies Het type van een argument kan steeds gepromoveerd worden naar een “hoger” type (zie tabel)
Deze regels worden eveneens toegepast bij een gemengde expressie! Voorbeeld: int a = 10; double b = 0; b += a; Om de methode square(int y) aan te roepen met een double (x = 3.5), gebruiken we de volgende aanroep: double res= square((int)x);
6.6 Java API Packages Packages Klassen gegroepeerd in categorieën van gerelateerde klassen. Promoot software hergebruik (reuse). import statements specifiëren de nodige klassen in het Java programma om te compileren bv. import javax.swing.JApplet;
6.7 Generatie van willekeurige getallen Java kan willekeurige getallen (random-numbers) genereren via een methode uit de klasse Math: Math.random() double randomValue = Math.random(); 1.0 > randomValue >= 0.0 Het zijn pseudo-random getallen, want ze worden bepaald door een complexe wiskundige berekening, die gebruik maakt van de actuele tijd. Het interval van waarden dat geproduceerd wordt door deze methode, is meestal verschillend van het gewenste interval! Voorbeelden: kop (0) of munt (1); gooien van een dobbelsteen (1, 2, ..., 6);....
6.7 Generatie van willekeurige getallen (vervolg) Om een geheel getal tussen 1 en 6 (beide inbegrepen) te verkrijgen, gebruiken we de volgende expressie: (int) (Math.random() * 6) We brengen het interval van waarden op schaal en het cijfer 6 noemen we de schaalfactor! Door vervolgens één op te tellen bij ons vorig resultaat, verkrijgen we het gewenste resultaat: (int) (Math.random() * 6) + 1 Algemeen: int n = a + (int)(Math.random() * b); a = shiftwaarde, b = schaalfactor
RandomIntegers.java VOORBEELD 3 een applicatie, die 20 willekeurige getallen genereert met een waarde tussen 1 en 6. gebruikt een for-herhalingsstructuur en de voorgedefinieerde methode Math.random().
1 // Fig. 6.7: RandomIntegers.java 2 // Willekeurige geschaalde integers. 3 4 // Java extension packages 5 import javax.swing.JOptionPane; 6 7 public class RandomIntegers 8 { 9 // main methode begint uitvoering van Java applicatie 10 public static void main( String args[] ) 11 { 12 int value; 13 String output = ""; 14 15 // lus 20 keer 16 for ( int counter = 1; counter <= 20; counter++ ) { 17 18 // kies willekeurige integer tussen 1 en 6 19 value = 1 + ( int ) ( Math.random() * 6 ); 20 21 output += value + " "; // value toevoegen aan output 22 23 // als counter deelbaar is door 5, 24 // voeg newline toe aan String output 25 if ( counter % 5 == 0 ) 26 output += "\n"; 27 28 } // end for structuur
29 30 JOptionPane.showMessageDialog( null, output, 31 "20 Random Numbers from 1 to 6", 32 JOptionPane.INFORMATION_MESSAGE ); 33 34 System.exit( 0 ); // beëindigt de applicatie 35 36 } // einde methode main 37 38 } // einde klasse RandomIntegers
Genereert integers in het bereik 1- 6 15 // lus 20 keer 16 for ( int counter = 1; counter <= 20; counter++ ) 17 { 18 // kies willekeurige integer tussen 1 en 6 19 value = 1 + ( int ) ( Math.random() * 6 ); 20 21 output += value + " "; // value toevoegen aan output 22 23 // als counter deelbaar is door 5, 24 // voeg newline toe aan String output 25 if ( counter % 5 == 0 ) 26 output += "\n"; 27 28 } // end for structuur Lijn 19 Genereert integers in het bereik 1- 6 Math.random levert een double, die >= 0.0 en <1.0. We converteren (casten) de double naar een int
VOORBEELD 4 RollDie.java Applicatie, die een simulatie doet van 6000 teerlingworpen, om te bewijzen dat elk getal (1,..,6) bijna evenveel kans heeft om voor te komen. Deze gebruikt een for-herhalingsstructuur en een switch-case.
1 // Fig. 6.8: RollDie.java 2 // Werp een dobbelsteen 6000 keer. 3 4 // Java extension packages 5 import javax.swing.*; 6 7 public class RollDie 8 { 9 // main methode begint uitvoering van Java applicatie 10 public static void main( String args[] ) 11 { 12 int frequency1 = 0, frequency2 = 0, frequency3 = 0, 13 frequency4 = 0, frequency5 = 0, frequency6 = 0, face; 14 15 // resultaten samenvatten 16 for ( int roll = 1; roll <= 6000; roll++ ) { 17 face = 1 + ( int ) ( Math.random() * 6 ); 18
19 // bepaal waarde teerlingworp en verhoog gepaste teller 20 switch ( face ) 21 { 22 case 1: 23 ++frequency1; 24 break; 25 26 case 2: 27 ++frequency2; 28 break; 29 30 case 3: 31 ++frequency3; 32 break; 33 34 case 4: 35 ++frequency4; 36 break; 37 38 case 5: 39 ++frequency5; 40 break; 41 42 case 6: 43 ++frequency6; 44 break; 45 46 } // einde switch structuur RollDie.java
47 48 } // einde for structuur 49 50 JTextArea outputArea = new JTextArea(); 51 52 outputArea.setText( "Face\tFrequency" + 53 "\n1\t" + frequency1 + "\n2\t" + frequency2 + 54 "\n3\t" + frequency3 + "\n4\t" + frequency4 + 55 "\n5\t" + frequency5 + "\n6\t" + frequency6 ); 56 57 JOptionPane.showMessageDialog( null, outputArea, 58 "Rolling a Die 6000 Times", 59 JOptionPane.INFORMATION_MESSAGE ); 60 61 System.exit( 0 ); // beëindigt applicatie 62 63 } // einde methode main 64 65 } // einde klasse RollDie RollDie.java
RollDie.java
Tellers die frequentie gegooide ogen, bijhouden Lijn 16-17 1 // Fig. 6.8: RollDie.java 2 // Werp een dobbelsteen 6000 keer. 3 4 // Java extension packages 5 import javax.swing.*; 6 7 public class RollDie 8 { 9 // main methode begint uitvoering van Java applicatie 10 public static void main( String args[] ) 11 { 12 int frequency1 = 0, frequency2 = 0, frequency3 = 0, 13 frequency4 = 0, frequency5 = 0, frequency6 = 0, face; 14 15 // resultaten samenvatten 16 for ( int roll = 1; roll <= 6000; roll++ ) 17 { face = 1 + ( int ) ( Math.random() * 6 ); 18 Lijn 12-13 Tellers die frequentie gegooide ogen, bijhouden Lijn 16-17 Genereert integers in het bereik 1- 6, voor 6000 worpen
voor elke worp wordt de juiste frequentie-teller aangepast 19 // bepaal waarde teerlingworp en verhoog gepaste teller 20 switch ( face ) 21 { 22 case 1: 23 ++frequency1; 24 break; 25 26 case 2: . 41 42 case 6: 43 ++frequency6; 44 break; 45 46 } // einde switch structuur 47 48 } // end for structure 49 RollDie.java Lijn 20-46 voor elke worp wordt de juiste frequentie-teller aangepast
6.8 VOORBEELD 5: Een kansspel Craps simulatie Gooi de teerlingen een eerste keer Als de som gelijk is aan 7 of 11, de speler wint Als de som gelijk is aan 2, 3 of 12, de speler verliest Elke andere som (4, 5, 6, 8, 9, 10) is de spelers point Blijf teerlingen gooien totdat … de som overeenkomt met de spelers point speler wint de som komt overeen met 7 of 11 speler verliest
1 // Fig. 6.9: Craps.java 2 // Craps 3 4 // Java core packages 5 import java.awt.*; 6 import java.awt.event.*; 7 8 // Java extension packages 9 import javax.swing.*; 10 11 public class Craps extends JApplet implements ActionListener 12 { 13 // constanten voor status van het spel weer te geven 14 private final int WON = 0, LOST = 1, CONTINUE = 2; 15 16 // andere gebruikte variabelen 17 private boolean firstRoll = true; // true bij eerste worp 18 private int sumOfDice = 0; // som van teerling 19 private int myPoint = 0; // niet gewonnen op eerste worp 20 private int gameStatus = CONTINUE; // spel nog niet over 21 22 // GUI componenten 23 private JLabel die1Label, die2Label, sumLabel, pointLabel; 24 private JTextField die1Field, die2Field, sumField, pointField; 25 private JButton rollButton; 26 Craps.java
We maken een klasse Craps die ActionListener implementeert. 1 // Fig. 6.9: Craps.java 2 // Craps 3 4 // Java core packages 5 import java.awt.*; 6 import java.awt.event.*; 7 8 // Java extension packages 9 import javax.swing.*; 10 11 public class Craps extends JApplet implements ActionListener 12 { 13 Craps.java Lijn 11 We maken een klasse Craps die ActionListener implementeert. Een ActionListener is letterlijk een klasse die ‘luistert’ of er een Actionevent plaatsvindt, bv. de gebruiker drukt op een button. Lijn 6 : import van het pakket java.awt.event, waar de klasse ActionListener deel van uitmaakt.
voor uitvoer van teerling 1 en teerling 2 27 // opzetten van GUI componenten 28 public void init() 29 { 30 // haal referentie naar content pane en verander de layout 31 // naar die van een FlowLayout 32 Container container = getContentPane(); 33 container.setLayout( new FlowLayout() ); 34 35 // maak label en tekstveld voor eerste teerling 36 die1Label = new JLabel( "Die 1" ); 37 container.add( die1Label ); 38 die1Field = new JTextField( 10 ); 39 die1Field.setEditable( false ); 40 container.add( die1Field ); 41 42 // maak label en tekstveld voor tweede teerling 43 die2Label = new JLabel( "Die 2" ); 44 container.add( die2Label ); 45 die2Field = new JTextField( 10 ); 46 die2Field.setEditable( false ); 47 container.add( die2Field ); 48 Craps.java Lijn 35-47 voor uitvoer van teerling 1 en teerling 2
Lijn 49-54 :voor uitvoer van de som van de worpen 49 // maak label en tekstveld voor som 50 sumLabel = new JLabel( "Sum is" ); 51 container.add( sumLabel ); 52 sumField = new JTextField( 10 ); 53 sumField.setEditable( false ); 54 container.add( sumField ); 55 56 // maak label en tekstveld voor punten 57 pointLabel = new JLabel( "Point is" ); 58 container.add( pointLabel ); 59 pointField = new JTextField( 10 ); 60 pointField.setEditable( false ); 61 container.add( pointField ); 62 // maak knop voor gebruikers om teerling te werpen 63 //registreer rolButton als component waarop de event zal 64 //plaatsgrijpen 65 rollButton = new JButton( "Roll Dice" ); 66 rollButton.addActionListener( this ); 67 container.add( rollButton ); 68 } Lijn 49-54 :voor uitvoer van de som van de worpen Lijn 56-61 : voor uitvoer van de speler zijn ‘point’ Lijn 63-66 : knop om teerlingen te werpen
69 // proces van een teerlingworp 70 public void actionPerformed( ActionEvent actionEvent ) 71 { 72 // eerste teerlingworp 73 if ( firstRoll ) 74 { sumOfDice = rollDice(); // werp teerling 75 76 switch ( sumOfDice ) { 77 78 // winnen op eerste worp 79 case 7: case 11: 80 gameStatus = WON; 81 pointField.setText( "" ); // leeg pointveld 82 break; 83 84 // verliezen op eerste worp 85 case 2: case 3: case 12: 86 gameStatus = LOST; 87 pointField.setText( "" ); // leeg pointveld 88 break; 89 Indien eerste worp activeer rollDice Indien de som 7 of 11 is, speler wint Indien de som is 2, 3 of 12 is, speler verliest Lijn 70 : Methode wordt automatisch geactiveerd als Jbutton wordt ingedrukt om de event af te handelen.
Bij een van som 4, 5, 6, 8, 9 of 10 wordt dit de point 90 // Onthoud punt 91 default: 92 gameStatus = CONTINUE; 93 myPoint = sumOfDice; 94 pointField.setText( Integer.toString( myPoint ) ); 95 firstRoll = false; 96 break; 97 98 } // einde switch structuur 99 100 } // einde body if structuur 101 102 // aansluitende teerlingworp 103 else { 104 sumOfDice = rollDice(); // werp teerling 105 106 // bepaal status van het spel 107 if ( sumOfDice == myPoint ) // winnen door maken punt 108 gameStatus = WON; 109 else 110 if ( sumOfDice == 7 ) // verliezen door 7 te werpen 111 gameStatus = LOST; 112 } 113 114 // toon boodschap die status spel weergeeft 115 displayMessage(); 116 117 } // end method actionPerformed Bij een van som 4, 5, 6, 8, 9 of 10 wordt dit de point Als de som gelijk is aan point, speler wint; Als som 7 is, speler verliest
118 119 // werp teerling, bereken som en toon resultaten 120 public int rollDice() 121 { 122 int die1, die2, sum; 123 124 // kies willekeurige waarden teerlingworpen 125 die1 = 1 + ( int ) ( Math.random() * 6 ); 126 die2 = 1 + ( int ) ( Math.random() * 6 ); 127 128 sum = die1 + die2; // som van de teerlingogen 129 130 // toon resultaten 131 die1Field.setText( Integer.toString( die1 ) ); 132 die2Field.setText( Integer.toString( die2 ) ); 133 sumField.setText( Integer.toString( sum ) ); 134 135 return sum; // geef som van worpen terug 136 137 } // einde methode rollDice 138 Lijn 125-126 : Methode rollDice() gebruikt Math.random() om twee teerlingen te simuleren en geeft de som ervan terug.
139 // bepaal spel status en geef de gepaste boodschap weer 140 // in de statusbalk 141 public void displayMessage() 142 { 143 // spel mag doorgaan 144 if ( gameStatus == CONTINUE ) 145 showStatus( "Roll again." ); 146 147 // spel gewonnen of verloren 148 else { 149 150 if ( gameStatus == WON ) 151 showStatus( "Player wins. " + 152 "Click Roll Dice to play again." ); 153 else 154 showStatus( "Player loses. " + 155 "Click Roll Dice to play again." ); 156 157 // volgende worp is eerste van een nieuw spel 158 firstRoll = true; 159 } 160 161 } // eind methode displayMessage 162 163 } // einde klasse Craps Lijn 151 : Methode showStatus toont een string in de applet zijn containers statusbalk.
Craps.java
6.9 Levensduur van identifiers Identifier levensduur Levensduur Periode dat de identifier bestaat in het geheugen Automatic levensduur Lokale variabelen Bestaan van zodra het declaratiestatement wordt uitgevoerd, totdat de programmacontrole het betreffende blok verlaat.
6.9 Levensduur van identifiers (vervolg) Identifier levensduur Static levensduur static klasse attributen (class variabele/ class reference) Bestaan van zodra de klasse die ze definieert is geladen, tot het einde van het programma. Kunnen echter niet noodzakelijk overal in het programma gebruikt worden! Identifier scope Definieert waar de identifier kan worden gebruikt.
Scope van een identifier 6.10 Scope regels Scope van een identifier is het deel binnen de broncod e waarin naar de identifier kan gerefereerd worden. Klasse scope Begint bij de openingsaccolade ({) en eindigt bij de sluitingsaccolade (}) van de klasse bv. object-variabelen en methoden Blok scope Begint bij de identifierdeclaratie en eindigt bij de sluitingsaccolade (}) van de blok bv. lokale variabelen en methodeparameters
VOORBEELD 6 Scoping.java een object-variabele x en twee lokale variabelen, ook met als naam x worden gedeclareerd in een applet deze applet zal, voor de eerste keer, de methode start() (her)definiëren met de vaste hoofding public void start() {....}
Scoping.java 1 // Fig. 6.10: Scoping.java 2 // A scoping example. 3 4 // Java core packages 5 import java.awt.Container; 6 7 // Java extension packages 8 import javax.swing.*; 9 10 public class Scoping extends JApplet 11 { private JTextArea outputArea; 12 13 // object-variabele x 14 private int x = 1; 15 16 // initialiseert de applet: GUI toekennen aan de applet 17 public void init() 18 { 19 outputArea = new JTextArea(); 20 Container container = getContentPane(); 21 container.add( outputArea ); 22 23 } // einde methode init 24 25 // methode start wordt opgeroepen nadat de methode init werd uitgevoerd; De methode 26 // start roept de methodes useLocal en useInstance op. 27 public void start() 28 { 29 int x = 5; // lokale variabele x van de methode start 30 31 outputArea.append( "local x in start is " + x ); 32 33 useLocal(); // useLocal bevat een lokale variabele x 34 useInstance(); // useInstance gebruikt de object-variabele x Scoping.java
35 useLocal(); // useLocal herinitialiseert zijn lokale variabele x 36 useInstance(); // object-variable x heeft zijn vorige waarde behouden 37 38 outputArea.append( "\n\nlocal x in start is " + x ); 39 40 } // einde methode start 41 42 // useLocal herinitialiseert de lokale variable x telkens deze methode wordt opgeroepen 43 public void useLocal() 44 { 45 int x = 25; // initialisatie van de lokale variabele x 46 47 outputArea.append( "\n\nlocal x in useLocal is " + x + 48 " after entering useLocal" ); 49 ++x; 50 outputArea.append( "\nlocal x in useLocal is " + x + 51 " before exiting useLocal" ); 52 53 } // einde methode useLocal 54 55 // useInstance wijzigt de object-variabele x telkens deze methode wordt opgeroepen 56 public void useInstance() 57 { 58 outputArea.append( "\n\ninstance variable x is " + x + 59 " on entering useInstance" ); 60 x *= 10; 61 outputArea.append( "\ninstance variable x is " + x + 62 " on exiting useInstance" ); 63 64 } // einde methode useInstance 65 66 } // einde klasse Scoping
1 // Fig. 6.10: Scoping.java 2 // A scoping example. 3 4 // Java core packages 5 import java.awt.Container; 6 7 // Java extension packages 8 import javax.swing.*; 9 10 public class Scoping extends JApplet 11 { private JTextArea outputArea; 12 13 // object-variabele x 14 private int x = 1; Scoping.java Lijn 14 Object-variabele x heeft klasse scope. M.a.w. x kan gebruikt worden in alle methoden en in alle inwendige klassen van de klasse Scoping.
16 // initialiseert de applet: GUI toekennen aan de applet 17 public void init() 18 { 19 outputArea = new JTextArea(); 20 Container container = getContentPane(); 21 container.add( outputArea ); 22 23 } // einde methode init Scoping.java Lijn 21 In een container kan je componenten stoppen, zoals het GUI-component JTextArea. Met de methode add kan je een component (een knop, een tekstvak, een panel) toevoegen aan een container-object.
25 // start wordt opgeroepen nadat de methode init werd uitgevoerd. 26 // De methode start roept de methodes useLocal en useInstance op. 27 public void start() 28 { 29 int x = 5; // lokale variabele x van de methode start 30 31 outputArea.append( "local x in start is " + x ); 32 33 useLocal(); // useLocal bevat een lokale variabele x 34 useInstance();// useInstance gebruikt de object-variabele x 35 useLocal(); // useLocal herinitialiseert zijn lokale variabele useInstance();//object-variable x heeft zijn vorige waarde behouden 38 outputArea.append( "\n\nlocal x in start is " + x ); 39 40 } // einde methode start Scoping.java Lijn 29 Lokale variabele x heeft blok scope. M.a.w. x kan uitsluitend gebruikt worden vanaf de plaats waar hij is gedefinieerd (lijn 29) tot aan de sluitingsaccolade van het blok waarin de declaratie staat (lijn 40).
41 // useLocal herinitialiseert de lokale variable x 42 // telkens deze methode wordt opgeroepen 43 public void useLocal() 44 { 45 int x = 25; // initialisatie van de lokale variabele x 46 47 outputArea.append( "\n\nlocal x in useLocal is " + x + 48 " after entering useLocal" ); 49 ++x; 50 outputArea.append( "\nlocal x in useLocal is " + x + 51 " before exiting useLocal" ); 52 53 } // einde methode useLocal Lijn 45 : Lokale variabele x heeft blok scope. Deze variabele heeft een andere scope als de lokale variabele x (lijn 29), dus het zijn twee verschillende variabelen en ze zitten elkaar niet in de weg! 27 public void start() 28 { 29 int x = 5; // lokale variabele x van de methode start … 40 } // einde methode start
54 // useInstance wijzigt de object-variabele x 55 // telkens deze methode wordt opgeroepen 56 public void useInstance() 57 { 58 outputArea.append( "\n\ninstance variable x is " + x + 59 " on entering useInstance" ); 60 x *= 10; 61 outputArea.append( "\ninstance variable x is " + x + 62 " on exiting useInstance" ); 63 64 } // einde methode useInstance 65 66 } // einde klasse Scoping Lijn 60 Object-variabele x heeft klasse scope, dus kan x gebruikt worden in de methode useInstance. De object-variabele x wordt met 10 vermenigvuldigd.
Scoping.java
6.11 Methode Overloading Methode overloading Meerdere methoden met dezelfde naam in één programma. NOODZAAK : een verschillende argumentenset voor elke methode Het aantal argumenten moet verschillend zijn EN/OF De argumenttypen moeten verschillend zijn
VOORBEELD 7: MethodOverload.java voorbeeld van methode overloading: het programma bevat de methode square met argument int en de methode square met argument double. 1 // Fig. 6.16: MethodOverload.java 2 // methode overloading 3 4 // Java core packages 5 import java.awt.Container; 6 7 // Java extension packages 8 import javax.swing.*; 9 10 public class MethodOverload extends JApplet 11 { 12 // roept verschillende versies van methode square op. 13 public void init() 14 { 15 JTextArea outputArea = new JTextArea(); 16 Container container = getContentPane(); 17 container.add( outputArea );
19 outputArea.setText( 20 "The square of integer 7 is " + square( 7 ) + 21 "\nThe square of double 7.5 is " + square( 7.5 ) ); 22 } //einde methode init Lijn 20 de methode square wordt opgeroepen. Als argument geven we het geheel getal 7 door. Lijn 21 de methode square wordt opgeroepen. Als argument geven we het decimaal getal 7.5 door.
24 // methode square met argument int 25 public int square( int intValue ) 26 { 27 System.out.println( 28 "Called square with int argument: " + intValue ); 29 30 return intValue * intValue; 31 32 } // einde methode square met argument int Lijn 25 Methode square ontvangt int als argument en geeft dus ook een int terug!
34 // square methode met argument double 35 public double square( double doubleValue ) 36 { 37 System.out.println( 38 "Called square with double argument: " + doubleValue ); 39 40 return doubleValue * doubleValue; 41 42 } // einde methode square met argument double 43 44 } // einde klasse MethodOverload Lijn 35 Overloaded methode square ontvangt double als argument en geeft een double terug.
VOORBEELD 8 : MethodOverload.java aantonen dat een compiler geen onderscheid kan maken tussen methoden met identieke namen, die dezelfde argumentenset bevatten; nochtans hebben ze een verschillend return type. 1 // Fig. 6.17: MethodOverload.java 2 // Twee methodes met dezelfde naam en hetzelfde argument 3 // maar met een andere return type. 4 5 // Java extension packages 6 import javax.swing.JApplet; 7 8 public class MethodOverload extends JApplet { 9 10 // eerste definitie van de methode square met argument double 11 public int square( double x ) 12 { 13 return x * x; 14 } 15 16 // tweede definitie van de methode square met argument double 17 // veroorzaakt een ‘syntax error’ 18 public double square( double y ) 19 { 20 return y * y; 21 } 22 23 } // einde klasse MethodOverload
10 // eerste definitie van de methode square met argument double 11 public int square( double x ) 12 { 13 return x * x; 14 } 15 16 // tweede definitie van de methode square met argument double 17 // veroorzaakt een ‘syntax error’ 18 public double square( double y ) 19 { 20 return y * y; 21 } 22 Compiler error messages tengevolge van gelijke argumentenlijst en enkel verschillende return types. MethodOverload.java:18: square(double) is already defined in MethodOverload public double square( double y ) ^ MethodOverload.java:13: possible loss of precision found : double required: int return x * x; 2 errors
6.12 Recursie Recursieve methode Roept zichzelf op (direct of indirect via een andere methode) De methode kan enkel de basis case(s) oplossen, m.a.w. roepen we de methode aan met de basis case(s), dan geeft deze een resultaat terug. Als de methode wordt aangeroepen met een complexer probleem, dan wordt het probleem verdeelt in Basis case Eenvoudiger probleem De methode verdeelt nu dit eenvoudiger probleem, totdat het opgelost is.
Bevat een recursieve oproep (call): 6.12 Recursie (vervolg) Recursieve methode Bevat een recursieve oproep (call): Het nieuwe, eenvoudiger probleem lijkt op het originele probleem, dus roept de methode zichzelf terug aan om het eenvoudiger probleem op te lossen = recursieve doorloop (step). De recursieve stap bevat normaal ook het keyword return, vermits het resultaat van deze aanroep moet gecombineerd worden met het resultaat van het gedeelte dat de methode wel kan oplossen om uiteindelijk een eindresultaat aan de originele caller te kunnen teruggeven!
VOORBEELD : De faculteit berekenen van het getal 5 5! = 5 * 4 * 3 * 2 * 1 5! = 5 * (4 * 3 * 2 * 1) 5! = 5 * 4! De recursieve methode verdeelt het probleem in een eenvoudiger probleem: 5! = 5 * 4! De recursieve methode verdeelt het probleem in een eenvoudiger probleem: 4! = 4 * 3! De recursieve methode verdeelt het probleem in een eenvoudiger probleem: 3! = 3 * 2! De recursieve methode verdeelt het probleem in een eenvoudiger probleem: 2! = 2 * 1! De recursieve methode verdeelt het probleem in een basis case: 1! = 1
Finale waarde = 120 5! 5! 5! = 5 * 24 = 120 is returned 5 * 4! 5 * 4! 4! = 4 * 6 = 24 is returned 4 * 3! 4 * 3! 3! = 3 * 2 = 6 is returned 3 * 2! 3 * 2! 2! = 2 * 1 = 2 is returned 2 * 1! 2 * 1! 1 returned 1 1 (a) Verwerking van de recursieve calls. (b) Waarde returned bij iedere recursieve call. Fig. 6.11 Recursieve evaluatie van 5!.
VOORBEELD 9 FactorialTest.java De faculteit van de getallen 0 t.e.m. 10 worden berekend. 1 // Fig. 6.12: FactorialTest.java 2 // Programma bevat de recursieve methode factorial 3 4 // Java core packages 5 import java.awt.*; 6 7 // Java extension packages 8 import javax.swing.*; 9 10 public class FactorialTest extends JApplet 11 { 12 private JTextArea outputArea;
De methode factorial wordt 10 keer opgeroepen. 13 // initialisatie applet 14 public void init() 15 { 16 outputArea = new JTextArea(); 17 18 Container container = getContentPane(); 19 container.add( outputArea ); 20 21 // het faculteit berekenen van 0 tot en met 10 22 for ( long counter = 0; counter <= 10; counter++ ) 23 outputArea.append( counter + "! = " + 24 factorial( counter ) + "\n" ); 25 26 } // einde methode init Lijn 24 De methode factorial wordt 10 keer opgeroepen.
in een eenvoudiger probleem fac(n) = n * fac(n-1) 28 // Recursieve methode factorial 29 public long factorial( long number ) 30 { 31 // basis case 32 if ( number <= 1 ) 33 return 1; 34 35 // recursive step 36 else 37 return number * factorial( number - 1 ); 38 39 } // einde methode factorial 40 41 } // einde klasse FactorialTest Lijn 32-33 De recursieve methode verdeelt het probleem in de basis cases: 1! = 1 en 0!= 1 EN in een eenvoudiger probleem fac(n) = n * fac(n-1)
6.13 Voorbeeld met Recursie: De Fibonacci Reeks Elk getal in de reeks is de som van de twee voorgaande getallen vb. 0, 1, 1, 2, 3, 5, 8, 13, 21… fibonacci(0) = 0 fibonacci(1) = 1 fibonacci(n) = fibonacci(n - 1) + fibonacci( n – 2 ) fibonacci(0) en fibonacci(1) zijn basis cases Gulden snede
f( 3 ) return f( 2 ) + f( 1 ) return f( 1 ) + f( 0 ) return 1 return 1 Fig. 6.14 Verzameling recursive calls naar methode fibonacci (f in dit diagram).
VOORBEELD 10 FibonacciTest.java de fibonacci-waarde van een ingegeven getal wordt berekend in deze applet
1 // Fig. 6.13: FibonacciTest.java 2 // Programma bevat de recursieve methode fibonacci 3 4 // Java core packages 5 import java.awt.*; 6 import java.awt.event.*; 7 8 // Java extension packages 9 import javax.swing.*; 10 11 public class FibonacciTest extends JApplet 12 implements ActionListener 13 { 14 private JLabel numberLabel, resultLabel; 15 private JTextField numberField, resultField; 16 17 // initialiseert de applet: GUI toekennen aan de applet 18 public void init() 19 { 20 // "get content pane" en ken zijn layout toe aan FlowLayout 21 Container container = getContentPane(); 22 container.setLayout( new FlowLayout() ); 23 24 // creëer numberLabel en ken het toe aan “content pane” 25 numberLabel = 26 new JLabel( "Enter an integer and press Enter" ); 27 container.add( numberLabel ); 28 29 // creëer numberField en ken het toe aan “content pane” 30 numberField = new JTextField( 10 ); 31 container.add( numberField ); 32 33 // bewaar deze applet als “numberField’s ActionListener” 34 numberField.addActionListener( this ); 35
36 // creëer resultLabel en ken het toe aan “content pane” 37 resultLabel = new JLabel( "Fibonacci value is" ); 38 container.add( resultLabel ); 39 40 // creëer resultField, maak het “uneditable” 41 // en ken het toe aan “content pane” 42 resultField = new JTextField( 15 ); 43 resultField.setEditable( false ); 44 container.add( resultField ); 45 46 } // einde methode init 47 48 // input wordt aan de gebruiker gevraagd en de methode fibonacci wordt opgeroepen 49 public void actionPerformed( ActionEvent e ) 50 { 51 long number, fibonacciValue; 52 53 // de input van de gebruiker wordt omgezet naar long 54 number = Long.parseLong( numberField.getText() ); 55 56 showStatus( "Calculating ..." ); 57 58 // bereken de fibonacci van het ingegeven getal 59 fibonacciValue = fibonacci( number ); 60 61 // het resultaat (fibonacci van het ingegeven getal) weergeven 62 showStatus( "Done." ); 63 resultField.setText( Long.toString( fibonacciValue ) ); 64 65 } // einde methode actionPerformed 66
67 // recursieve methode fibonacci 68 public long fibonacci( long n ) 69 { 70 // basis case 71 if ( n == 0 || n == 1 ) 72 return n; 73 74 // recursieve stap 75 else 76 return fibonacci( n - 1 ) + fibonacci( n - 2 ); 77 78 } // einde methode fibonacci 79 80 } // einde klasse FibonacciTest
1 // Fig. 6.13: FibonacciTest.java 2 // Programma bevat de recursieve methode fibonacci 3 4 // Java core packages 5 import java.awt.*; 6 import java.awt.event.*; 7 8 // Java extension packages 9 import javax.swing.*; 10 11 public class FibonacciTest extends JApplet 12 implements ActionListener 13 { 14 private JLabel numberLabel, resultLabel; 15 private JTextField numberField, resultField; FibonacciTest.java Lijn 11-12 We maken een klasse FibonacciTest die ActionListener implementeert. Een ActionListener is letterlijk een klasse die ‘luistert’ of er een Actionevent plaatsvindt, bv. de gebruiker drukt op enter.
17 // initialiseert de applet: GUI toekennen aan de applet 18 public void init() 19 { 20 // "get content pane" en ken zijn layout toe aan FlowLayout 21 Container container = getContentPane(); 22 container.setLayout( new FlowLayout() ); 23 FibonacciTest.java Lijn 22 De eenvoudigste layout-manager is de FlowLayout. De FlowLayout zet de componenten, in de volgorde waarin ze in de container gestopt worden, van links naar rechts gecentreerd op een rij. Als de rij vol is komen de volgende componenten gecentreerd op de rij eronder. methode setLayout stelt de layout, voor de container, in op de eenvoudige FlowLayout, VOOR de componenten toegevoegd worden aan de container.
Lijn 27, 31 numberLabel numberField 24 // creëer numberLabel en ken het toe aan “content pane” 25 numberLabel = 26 new JLabel( "Enter an integer and press Enter" ); 27 container.add( numberLabel ); 28 29 // creëer numberField en ken het toe aan “content pane” 30 numberField = new JTextField( 10 ); 31 container.add( numberField ); FibonacciTest.java Lijn 27, 31 In de volgorde waarin je de componenten met de methode add aan de applet toevoegt, komen ze ook op het scherm. numberLabel numberField
Lijn 43 : De component resultField dient enkel als output. 33 //registreer numberField als component waarop de event zal //plaatsgrijpen 34 numberField.addActionListener( this ); 35 36 // creëer resultLabel en ken het toe aan “content pane” 37 resultLabel = new JLabel( "Fibonacci value is" ); 38 container.add( resultLabel ); 39 40 // creëer resultField, maak het “uneditable” 41 // en ken het toe aan “content pane” 42 resultField = new JTextField( 15 ); 43 resultField.setEditable( false ); 44 container.add( resultField ); 45 46 } // einde methode init Lijn 34 : We vertellen aan numberfield dat “this applet” de event zal afhandelen. Lijn 43 : De component resultField dient enkel als output. resultLabel resultField
48 // input wordt aan de gebruiker gevraagd en de methode fibonacci wordt opgeroepen 49 public void actionPerformed( ActionEvent e ) 50 { 51 long number, fibonacciValue; 52 53 // de input van de gebruiker wordt omgezet naar long 54 number = Long.parseLong( numberField.getText() ); 55 56 showStatus( "Calculating ..." ); 57 58 // bereken de fibonacci van het ingegeven getal 59 fibonacciValue = fibonacci( number ); 60 61 // het resultaat (fibonacci van het ingegeven getal) weergeven 62 showStatus( "Done." ); 63 resultField.setText( Long.toString( fibonacciValue ) ); 64 65 } // einde methode actionPerformed Lijn 49: methode actionPerformed wordt AUTOMATISCH geactiveerd als de gebruiker op Enter drukt. Lijn 51: we gebruiken long, omdat Fibonacci getallen snel groot worden. Lijn 59: De input van de gebruiker wordt doorgegeven aan de methode fibonacci
67 // recursieve methode fibonacci 68 public long fibonacci( long n ) 69 { 70 // basis case 71 if ( n == 0 || n == 1 ) 72 return n; 73 74 // recursieve stap 75 else 76 return fibonacci( n - 1 ) + fibonacci( n - 2 ); 77 78 } // einde methode fibonacci 79 80 } // einde klasse FibonacciTest Lijn 71-72 De recursieve methode verdeelt het probleem in een basis case: fibonacci(0) = 0 en fibonacci(1) = 1 Lijn 76 De recursieve methode verdeelt het probleem in een eenvoudiger probleem: fibonacci(n) = fibonacci(n - 1) + fibonacci( n – 2 )
Oef 4. Wat doet de volgende methode? // parameter b moet een positief integer zijn // om oneindige recursie te vermijden public int mysterie (int a, int b) { if (b == 1) return a; else return a + mysterie ( a, b – 1); }
6.14 Recursie vs. Iteratie Iteratie Recursie Gebruikt herhalingstructuur (for, while of do-while) Herhaling door expliciet gebruik van een herhalingsstructuur Eindigt als lusvoorwaarde false evalueert Recursie Gebruikt selectiestructuur (if, if-else of switch) Herhaling door herhaalde methode calls Eindigt als de basis case voldaan is Controleert herhaling door het probleem in eenvoudigere te delen
6.14 Recursie vs. Iteratie (verv.) Meer overhead dan bij iteratie. M.a.w. elke recursieve call maakt een kopie van de argumenten van de methode. Geheugenintensiever dan bij een iteratie. Kan ook iteratief opgelost worden (maar soms met vele lijnen code). Kan dikwijls geïmplementeerd worden met slechts enkele lijnen code.
6.15 Methoden van Klasse JApplet Java API definieert meerdere JApplet methoden De applet container (= viewer of browser) roept de methoden init, start, paint, stop en destroy, gedurende de uitvoering van de applet, op. We overschrijven enkel de methode(s) die we nodig hebben. M.a.w. we “overriden” de methode(s) die we nodig hebben.
JApplet methode die de appletcontainer oproept gedurende de applet’s executie public void init() Deze methode wordt slechts eenmaal geactiveerd door de appletviewer of browser wanneer de applet wordt geladen voor executie. Ze verzorgt de initialisatie van de applet. Typische acties zijn initialisatie van object-variabelen en GUI-componenten van de applet, het laden van geluiden om af te spelen of beelden om te tonen (zie hfdst. 19, Multimedia) en de creatie van threads (zie hfdst. 16, Multithreading).
JApplet methode die de applet container oproept gedurende de applet’s executie public void start() Wordt geactiveerd nadat de init methode is uitgevoerd en telkens als de gebruiker van de browser terugkeert naar de HTML pagina waarin de applet huist (na het bekijken van een andere HTML pagina). Deze methode voert taken uit die moeten volbracht worden als de applet voor de eerste keer wordt geladen in de browser en telkens opnieuw als de pagina wordt herbezocht. Typische acties zijn het starten van een animatie (zie hfdst. 19, Multimedia) en het starten van andere threads (zie hfdst. 16, Multithreading).
public void paint( Graphics g ) JApplet methode die de applet container oproept gedurende de applet’s executie public void paint( Graphics g ) Deze methode wordt voor het eerst opgeroepen na de start methode en telkens weer opnieuw als het nodig is om de applet output te hertekenen (expliciet via de methode repaint()). Bv. de paint methode wordt opgeroepen als de gebruiker de applet overdekt met een ander venster en dan het venster weer weg doet. Typische acties zijn het tekenen met het Graphics object g, dat automatisch als argument met paint wordt meegegeven.
JApplet methode die de applet container oproept gedurende de applet’s executie public void stop() Deze methode wordt geactiveerd als de applet moet eindigen—normaal wanneer de gebruiker van de browser de HTML pagina verlaat. Deze methode voert de vereiste taken uit om de applet’s executie te schorsen. Typische acties zijn het stoppen van de uitvoering van een animatie en threads.
JApplet methode die de applet container oproept gedurende de applet’s executie public void destroy() Deze methode wordt geactiveerd als de applet uit het geheugen wordt verwijderd —normaal als de gebruiker van de browser de sessie beëindigt. Deze methode voert taken uit die vereist zijn om resources vrij te geven die door de applet werden gereserveerd.
Oef 5. Schrijf een applet die … Vraag de zijde voor een ‘vierkant’ en karakter om dat vierkant af te drukken. Druk het vierkant af met dat vulteken. **** Gebruik hiervoor een methode maakvierkant die het volledige vierkant afdrukt.
Oef 6. Schrijf een applicatie die … Nagaat welke gehele getallen perfect zijn uit de reeks natuurlijke getallen waarvan de kleinste en grootste waarde door de gebruiker worden ingevoerd. Een getal is perfect als het gelijk is aan de som van zijn delers, bv: 6 = 1 + 2 + 3. Schrijf hiervoor een methode perfect die nagaat of zijn argument een perfect getal is. De methode perfect zelf gebruikt de methode somvandelers die je ook uitwerkt en die de som van de delers van zijn argument aflevert.