Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdEsther Peeters Laatst gewijzigd meer dan 10 jaar geleden
1
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
2
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!
3
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)
4
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!
5
baas werkman1 werkman2 werkman3 werkman4 werkman5
Fig Hierarchische baas-methode/werkman-methode relatie.
6
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)
7
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));
9
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)));
10
6.4 Methoden definitie. Methoden
laten modularisatie van een programma toe Voordelen: maakt programmaontwikkeling eenvoudiger software kan opnieuw gebruikt worden vermijd herhalende code
11
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
12
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
13
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.
14
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 { // opzetten van GUI en berekenen van kwadraten van 1 tot 10 public void init() { // JTextArea om resultaten weer te geven JTextArea outputArea = new JTextArea(); 17 // een referentie naar de applets content pane Container container = getContentPane(); 20 // outputArea vasthechten aan container container.add( outputArea ); 23 int result; // resultaat van methode-aanroep square String output = ""; // String die resultaten bevat 26
15
// lus 10 keer for ( int counter = 1; counter <= 10; counter++ ) { // berekenen kwadraat van counter en in result stoppen result = square( counter ); 32 // result toevoegen aan String output output += "The square of " + counter + " is " + result + "\n"; 36 } // einde for-lus 38 outputArea.setText( output ); // zet resultaten in JTextArea 40 } // einde methode init 42 // square methode definitie public int square( int y ) { return y * y; // return square of y 47 } // einde methode square 49 50 } // einde klasse SquareIntegers
17
12 // opzetten van GUI en berekenen van kwadraten van 1 tot 10
public void init() { // JTextArea om resultaten weer te geven JTextArea outputArea = new JTextArea(); 17 // een referentie naar de applets content pane Container container = getContentPane(); 20 // outputArea vasthechten aan container 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
18
Aanroep van de methode square
26 // lus 10 keer for ( int counter = 1; counter <= 10; counter++ ) { // berekenen kwadraat van counter en in result stoppen result = square( counter ); 32 // result toevoegen aan String output output += "The square of " + counter + " is " + result + "\n"; 36 } // 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.
19
Zelfgedefinieerde methode square Terugkeerwaarde = int
// square methode definitie public int square( int y ) { return y * y; // return square of y 47 } // 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
20
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!
21
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() { }
22
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
23
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)
24
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!
25
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.
26
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 { // initialiseer applet door gebruikersinput en maken van GUI public void init() { // vraag gebruikersinput String s1 = JOptionPane.showInputDialog( "Enter first floating-point value" ); String s2 = JOptionPane.showInputDialog( "Enter second floating-point value" ); String s3 = JOptionPane.showInputDialog( "Enter third floating-point value" ); 22 // converteer gebruikersinput naar double double number1 = Double.parseDouble( s1 ); double number2 = Double.parseDouble( s2 ); double number3 = Double.parseDouble( s3 ); 27
27
28 // methode-aanroep maximum om grootste waarde te bepalen
double max = maximum( number1, number2, number3 ); 30 // maak JTextArea om resultaten weer te geven JTextArea outputArea = new JTextArea(); 33 34 outputArea.setText( "number1: " + number1 + "\nnumber2: " + number2 + "\nnumber3: " + number3 + "\nmaximum is: " + max ); 38 // referentie naar de applets GUI component display area Container container = getContentPane(); 41 // outputArea vasthechten aan Container c container.add( outputArea ); 44 } // einde methode init 46 // maximum methode gebruikt Math klasse methode max om // de maximum waarde te bepalen public double maximum( double x, double y, double z ) { return Math.max( x, Math.max( y, z ) ); 52 } // einde methode maximum 54 55 } // einde klasse Maximum
28
Maximum.java
29
12 // initialiseer applet door gebruikersinput en maken van GUI
public void init() { // vraag gebruikersinput String s1 = JOptionPane.showInputDialog( "Enter first floating-point value" ); String s2 = JOptionPane.showInputDialog( "Enter second floating-point value" ); String s3 = JOptionPane.showInputDialog( "Enter third floating-point value" ); 22 // converteer gebruikersinput naar double double number1 = Double.parseDouble( s1 ); double number2 = Double.parseDouble( s2 ); double number3 = Double.parseDouble( s3 ); 27 // methode-aanroep maximum om grootste waarde te bepalen 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.
30
outputArea GUI-component wordt aan “content pane” gekoppeld
// maak JTextArea om resultaten weer te geven JTextArea outputArea = new JTextArea(); 33 34 outputArea.setText( "number1: " + number1 + "\nnumber2: " + number2 + "\nnumber3: " + number3 + "\nmaximum is: " + max ); 38 // referentie naar de applets GUI component display area Container container = getContentPane(); 41 // outputArea vasthechten aan Container c container.add( outputArea ); 44 } // 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
31
Zelfgedefinieerde methode maximum : Terugkeerwaarde = double
// maximum methode gebruikt Math klasse methode max om // de maximum waarde te bepalen public double maximum( double x, double y, double z ) { return Math.max( x, Math.max( y, z ) ); 52 } // 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.
32
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.
33
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 .
34
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)
35
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);
36
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;
39
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);....
40
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
41
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().
42
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 { // main methode begint uitvoering van Java applicatie public static void main( String args[] ) { int value; String output = ""; 14 // lus 20 keer for ( int counter = 1; counter <= 20; counter++ ) { 17 // kies willekeurige integer tussen 1 en 6 value = 1 + ( int ) ( Math.random() * 6 ); 20 output += value + " "; // value toevoegen aan output 22 // als counter deelbaar is door 5, // voeg newline toe aan String output if ( counter % 5 == 0 ) output += "\n"; 27 } // end for structuur
43
29 JOptionPane.showMessageDialog( null, output, "20 Random Numbers from 1 to 6", JOptionPane.INFORMATION_MESSAGE ); 33 System.exit( 0 ); // beëindigt de applicatie 35 } // einde methode main 37 38 } // einde klasse RandomIntegers
44
Genereert integers in het bereik 1- 6
// lus 20 keer for ( int counter = 1; counter <= 20; counter++ ) { // kies willekeurige integer tussen 1 en 6 value = 1 + ( int ) ( Math.random() * 6 ); 20 output += value + " "; // value toevoegen aan output 22 // als counter deelbaar is door 5, // voeg newline toe aan String output if ( counter % 5 == 0 ) output += "\n"; 27 } // end for structuur Lijn 19 Genereert integers in het bereik 1- 6 Math.random levert een double, die >= 0.0 en < We converteren (casten) de double naar een int
45
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.
46
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 { // main methode begint uitvoering van Java applicatie public static void main( String args[] ) { int frequency1 = 0, frequency2 = 0, frequency3 = 0, frequency4 = 0, frequency5 = 0, frequency6 = 0, face; 14 // resultaten samenvatten for ( int roll = 1; roll <= 6000; roll++ ) { face = 1 + ( int ) ( Math.random() * 6 ); 18
47
19 // bepaal waarde teerlingworp en verhoog gepaste teller
switch ( face ) { case 1: frequency1; break; 25 case 2: frequency2; break; 29 case 3: frequency3; break; 33 case 4: frequency4; break; 37 case 5: frequency5; break; 41 case 6: frequency6; break; 45 } // einde switch structuur RollDie.java
48
47 } // einde for structuur 49 JTextArea outputArea = new JTextArea(); 51 outputArea.setText( "Face\tFrequency" + "\n1\t" + frequency1 + "\n2\t" + frequency2 + "\n3\t" + frequency3 + "\n4\t" + frequency4 + "\n5\t" + frequency5 + "\n6\t" + frequency6 ); 56 JOptionPane.showMessageDialog( null, outputArea, "Rolling a Die 6000 Times", JOptionPane.INFORMATION_MESSAGE ); 60 System.exit( 0 ); // beëindigt applicatie 62 } // einde methode main 64 65 } // einde klasse RollDie RollDie.java
49
RollDie.java
50
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 { // main methode begint uitvoering van Java applicatie public static void main( String args[] ) { int frequency1 = 0, frequency2 = 0, frequency3 = 0, frequency4 = 0, frequency5 = 0, frequency6 = 0, face; 14 // resultaten samenvatten for ( int roll = 1; roll <= 6000; roll++ ) { 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
51
voor elke worp wordt de juiste frequentie-teller aangepast
// bepaal waarde teerlingworp en verhoog gepaste teller switch ( face ) { case 1: frequency1; break; 25 case 2: . 41 case 6: frequency6; break; 45 } // einde switch structuur 47 } // end for structure 49 RollDie.java Lijn 20-46 voor elke worp wordt de juiste frequentie-teller aangepast
52
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
53
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 { // constanten voor status van het spel weer te geven private final int WON = 0, LOST = 1, CONTINUE = 2; 15 // andere gebruikte variabelen private boolean firstRoll = true; // true bij eerste worp private int sumOfDice = 0; // som van teerling private int myPoint = 0; // niet gewonnen op eerste worp private int gameStatus = CONTINUE; // spel nog niet over 21 // GUI componenten private JLabel die1Label, die2Label, sumLabel, pointLabel; private JTextField die1Field, die2Field, sumField, pointField; private JButton rollButton; 26 Craps.java
54
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.
55
voor uitvoer van teerling 1 en teerling 2
// opzetten van GUI componenten public void init() { // haal referentie naar content pane en verander de layout // naar die van een FlowLayout Container container = getContentPane(); container.setLayout( new FlowLayout() ); 34 // maak label en tekstveld voor eerste teerling die1Label = new JLabel( "Die 1" ); container.add( die1Label ); die1Field = new JTextField( 10 ); die1Field.setEditable( false ); container.add( die1Field ); 41 // maak label en tekstveld voor tweede teerling die2Label = new JLabel( "Die 2" ); container.add( die2Label ); die2Field = new JTextField( 10 ); die2Field.setEditable( false ); container.add( die2Field ); 48 Craps.java Lijn 35-47 voor uitvoer van teerling 1 en teerling 2
56
Lijn 49-54 :voor uitvoer van de som van de worpen
// maak label en tekstveld voor som sumLabel = new JLabel( "Sum is" ); container.add( sumLabel ); sumField = new JTextField( 10 ); sumField.setEditable( false ); container.add( sumField ); 55 // maak label en tekstveld voor punten pointLabel = new JLabel( "Point is" ); container.add( pointLabel ); pointField = new JTextField( 10 ); pointField.setEditable( false ); container.add( pointField ); // maak knop voor gebruikers om teerling te werpen //registreer rolButton als component waarop de event zal 64 //plaatsgrijpen rollButton = new JButton( "Roll Dice" ); rollButton.addActionListener( this ); container.add( rollButton ); } Lijn :voor uitvoer van de som van de worpen Lijn : voor uitvoer van de speler zijn ‘point’ Lijn : knop om teerlingen te werpen
57
69 // proces van een teerlingworp
public void actionPerformed( ActionEvent actionEvent ) { // eerste teerlingworp if ( firstRoll ) { sumOfDice = rollDice(); // werp teerling 75 switch ( sumOfDice ) { 77 // winnen op eerste worp case 7: case 11: gameStatus = WON; pointField.setText( "" ); // leeg pointveld break; 83 // verliezen op eerste worp case 2: case 3: case 12: gameStatus = LOST; pointField.setText( "" ); // leeg pointveld 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.
58
Bij een van som 4, 5, 6, 8, 9 of 10 wordt dit de point
// Onthoud punt default: gameStatus = CONTINUE; myPoint = sumOfDice; pointField.setText( Integer.toString( myPoint ) ); firstRoll = false; break; 97 } // einde switch structuur 99 } // einde body if structuur 101 // aansluitende teerlingworp else { sumOfDice = rollDice(); // werp teerling 105 // bepaal status van het spel if ( sumOfDice == myPoint ) // winnen door maken punt gameStatus = WON; else if ( sumOfDice == 7 ) // verliezen door 7 te werpen gameStatus = LOST; } 113 // toon boodschap die status spel weergeeft displayMessage(); 116 } // 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
59
118 // werp teerling, bereken som en toon resultaten public int rollDice() { int die1, die2, sum; 123 // kies willekeurige waarden teerlingworpen die1 = 1 + ( int ) ( Math.random() * 6 ); die2 = 1 + ( int ) ( Math.random() * 6 ); 127 sum = die1 + die2; // som van de teerlingogen 129 // toon resultaten die1Field.setText( Integer.toString( die1 ) ); die2Field.setText( Integer.toString( die2 ) ); sumField.setText( Integer.toString( sum ) ); 134 return sum; // geef som van worpen terug 136 } // einde methode rollDice 138 Lijn : Methode rollDice() gebruikt Math.random() om twee teerlingen te simuleren en geeft de som ervan terug.
60
139 // bepaal spel status en geef de gepaste boodschap weer
// in de statusbalk public void displayMessage() { // spel mag doorgaan if ( gameStatus == CONTINUE ) showStatus( "Roll again." ); 146 // spel gewonnen of verloren else { 149 if ( gameStatus == WON ) showStatus( "Player wins. " + "Click Roll Dice to play again." ); else showStatus( "Player loses. " + "Click Roll Dice to play again." ); 156 // volgende worp is eerste van een nieuw spel firstRoll = true; } 160 } // eind methode displayMessage 162 163 } // einde klasse Craps Lijn 151 : Methode showStatus toont een string in de applet zijn containers statusbalk.
61
Craps.java
62
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.
63
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.
64
Scope van een identifier
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
65
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() {....}
66
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 // object-variabele x private int x = 1; 15 // initialiseert de applet: GUI toekennen aan de applet public void init() { outputArea = new JTextArea(); Container container = getContentPane(); container.add( outputArea ); 22 } // einde methode init 24 // methode start wordt opgeroepen nadat de methode init werd uitgevoerd; De methode // start roept de methodes useLocal en useInstance op. public void start() { int x = 5; // lokale variabele x van de methode start 30 outputArea.append( "local x in start is " + x ); 32 useLocal(); // useLocal bevat een lokale variabele x useInstance(); // useInstance gebruikt de object-variabele x Scoping.java
67
35 useLocal(); // useLocal herinitialiseert zijn lokale variabele x
useInstance(); // object-variable x heeft zijn vorige waarde behouden 37 outputArea.append( "\n\nlocal x in start is " + x ); 39 } // einde methode start 41 // useLocal herinitialiseert de lokale variable x telkens deze methode wordt opgeroepen public void useLocal() { int x = 25; // initialisatie van de lokale variabele x 46 outputArea.append( "\n\nlocal x in useLocal is " + x + " after entering useLocal" ); x; outputArea.append( "\nlocal x in useLocal is " + x + " before exiting useLocal" ); 52 } // einde methode useLocal 54 // useInstance wijzigt de object-variabele x telkens deze methode wordt opgeroepen public void useInstance() { outputArea.append( "\n\ninstance variable x is " + x + " on entering useInstance" ); x *= 10; outputArea.append( "\ninstance variable x is " + x + " on exiting useInstance" ); 63 } // einde methode useInstance 65 66 } // einde klasse Scoping
68
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 // object-variabele x 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.
69
16 // initialiseert de applet: GUI toekennen aan de applet
public void init() { outputArea = new JTextArea(); Container container = getContentPane(); container.add( outputArea ); 22 } // 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.
70
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).
71
41 // useLocal herinitialiseert de lokale variable x
// telkens deze methode wordt opgeroepen public void useLocal() { int x = 25; // initialisatie van de lokale variabele x 46 outputArea.append( "\n\nlocal x in useLocal is " + x + " after entering useLocal" ); x; outputArea.append( "\nlocal x in useLocal is " + x + " before exiting useLocal" ); 52 } // 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 { int x = 5; // lokale variabele x van de methode start … 40 } // einde methode start
72
54 // useInstance wijzigt de object-variabele x
// telkens deze methode wordt opgeroepen public void useInstance() { outputArea.append( "\n\ninstance variable x is " + x + " on entering useInstance" ); x *= 10; outputArea.append( "\ninstance variable x is " + x + " on exiting useInstance" ); 63 } // 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.
73
Scoping.java
74
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
75
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 { // roept verschillende versies van methode square op. public void init() { JTextArea outputArea = new JTextArea(); Container container = getContentPane(); container.add( outputArea );
76
19 outputArea.setText( "The square of integer 7 is " + square( 7 ) + "\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.
77
24 // methode square met argument int
25 public int square( int intValue ) 26 { System.out.println( "Called square with int argument: " + intValue ); 29 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!
78
34 // square methode met argument double
35 public double square( double doubleValue ) 36 { System.out.println( "Called square with double argument: " + doubleValue ); 39 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.
79
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 // eerste definitie van de methode square met argument double public int square( double x ) { return x * x; } 15 // tweede definitie van de methode square met argument double // veroorzaakt een ‘syntax error’ public double square( double y ) { return y * y; } 22 23 } // einde klasse MethodOverload
80
10 // eerste definitie van de methode square met argument double
public int square( double x ) { return x * x; } 15 // tweede definitie van de methode square met argument double // veroorzaakt een ‘syntax error’ public double square( double y ) { return y * y; } 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
81
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.
82
Bevat een recursieve oproep (call):
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!
83
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
84
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 Recursieve evaluatie van 5!.
85
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 { private JTextArea outputArea;
86
De methode factorial wordt 10 keer opgeroepen.
// initialisatie applet public void init() { outputArea = new JTextArea(); 17 Container container = getContentPane(); container.add( outputArea ); 20 // het faculteit berekenen van 0 tot en met 10 for ( long counter = 0; counter <= 10; counter++ ) outputArea.append( counter + "! = " + factorial( counter ) + "\n" ); 25 } // einde methode init Lijn 24 De methode factorial wordt 10 keer opgeroepen.
87
in een eenvoudiger probleem fac(n) = n * fac(n-1)
// Recursieve methode factorial public long factorial( long number ) { // basis case if ( number <= 1 ) return 1; 34 // recursive step else return number * factorial( number - 1 ); 38 } // 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)
89
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
90
f( 3 ) return f( 2 ) + f( 1 ) return f( 1 ) + f( 0 ) return 1 return 1
Fig Verzameling recursive calls naar methode fibonacci (f in dit diagram).
91
VOORBEELD 10 FibonacciTest.java
de fibonacci-waarde van een ingegeven getal wordt berekend in deze applet
92
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 implements ActionListener 13 { private JLabel numberLabel, resultLabel; private JTextField numberField, resultField; 16 // initialiseert de applet: GUI toekennen aan de applet public void init() { // "get content pane" en ken zijn layout toe aan FlowLayout Container container = getContentPane(); container.setLayout( new FlowLayout() ); 23 // creëer numberLabel en ken het toe aan “content pane” numberLabel = new JLabel( "Enter an integer and press Enter" ); container.add( numberLabel ); 28 // creëer numberField en ken het toe aan “content pane” numberField = new JTextField( 10 ); container.add( numberField ); 32 // bewaar deze applet als “numberField’s ActionListener” numberField.addActionListener( this ); 35
93
36 // creëer resultLabel en ken het toe aan “content pane”
resultLabel = new JLabel( "Fibonacci value is" ); container.add( resultLabel ); 39 // creëer resultField, maak het “uneditable” // en ken het toe aan “content pane” resultField = new JTextField( 15 ); resultField.setEditable( false ); container.add( resultField ); 45 } // einde methode init 47 // input wordt aan de gebruiker gevraagd en de methode fibonacci wordt opgeroepen public void actionPerformed( ActionEvent e ) { long number, fibonacciValue; 52 // de input van de gebruiker wordt omgezet naar long number = Long.parseLong( numberField.getText() ); 55 showStatus( "Calculating ..." ); 57 // bereken de fibonacci van het ingegeven getal fibonacciValue = fibonacci( number ); 60 // het resultaat (fibonacci van het ingegeven getal) weergeven showStatus( "Done." ); resultField.setText( Long.toString( fibonacciValue ) ); 64 } // einde methode actionPerformed 66
94
67 // recursieve methode fibonacci
public long fibonacci( long n ) { // basis case if ( n == 0 || n == 1 ) return n; 73 // recursieve stap else return fibonacci( n - 1 ) + fibonacci( n - 2 ); 77 } // einde methode fibonacci 79 80 } // einde klasse FibonacciTest
97
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 implements ActionListener 13 { private JLabel numberLabel, resultLabel; 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.
98
17 // initialiseert de applet: GUI toekennen aan de applet
public void init() { // "get content pane" en ken zijn layout toe aan FlowLayout Container container = getContentPane(); 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.
99
Lijn 27, 31 numberLabel numberField
// creëer numberLabel en ken het toe aan “content pane” numberLabel = new JLabel( "Enter an integer and press Enter" ); container.add( numberLabel ); 28 // creëer numberField en ken het toe aan “content pane” numberField = new JTextField( 10 ); 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
100
Lijn 43 : De component resultField dient enkel als output.
//registreer numberField als component waarop de event zal //plaatsgrijpen numberField.addActionListener( this ); 35 // creëer resultLabel en ken het toe aan “content pane” resultLabel = new JLabel( "Fibonacci value is" ); container.add( resultLabel ); 39 // creëer resultField, maak het “uneditable” // en ken het toe aan “content pane” resultField = new JTextField( 15 ); resultField.setEditable( false ); container.add( resultField ); 45 } // 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
101
48 // input wordt aan de gebruiker gevraagd en de methode fibonacci wordt opgeroepen
public void actionPerformed( ActionEvent e ) 50 { long number, fibonacciValue; 52 // de input van de gebruiker wordt omgezet naar long number = Long.parseLong( numberField.getText() ); 55 showStatus( "Calculating ..." ); 57 // bereken de fibonacci van het ingegeven getal fibonacciValue = fibonacci( number ); 60 // het resultaat (fibonacci van het ingegeven getal) weergeven showStatus( "Done." ); 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
102
67 // recursieve methode fibonacci
public long fibonacci( long n ) { // basis case if ( n == 0 || n == 1 ) return n; 73 // recursieve stap else return fibonacci( n - 1 ) + fibonacci( n - 2 ); 77 } // 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 )
103
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); }
104
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
105
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.
107
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.
109
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).
110
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).
111
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.
112
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.
113
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.
114
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.
115
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 = 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.
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.