H13 Zelf methodes maken

Leerdoelen

Na het bestuderen van dit hoofdstuk wordt van je verwacht dat je:

  • weet hoe je zelf methodes kunt maken en hoe je ze kunt aanroepen
  • weet wanneer je globale en wanner je lokale variabelen gebruikt
  • weet hoe je parameters aan een methode meegeeft
  • weet hoe je een methode een waarde kunt laten teruggeven (terugkeerwaarde)
  • weet wat void betekent

Praktijk

Inleiding

Methodes zijn stukjes programmatuur die een bepaalde functie vervullen. Veel methodes zijn voorgedefinieerd zoals drawString(). Er kan aan deze methode niets veranderd worden. Alleen met argumenten kan aangegeven worden wat waar op het beeldscherm gezet wordt.

Ook zijn er methodes waarvan je zelf de inhoud kunt bepalen. Daarbij moet wel rekening gehouden worden met het doel van de functie. Een voorbeeld is paint(). De bedoeling van de functie is dat er iets op het scherm gezet wordt en Windows roept de methode aan als het nodig is het scherm te verversen. Als er in deze methode een berekening gezet wordt, wordt deze berekening telkens uitgevoerd als het scherm ververst wordt. Er is dan niet bekend op welk moment de berekening wordt uitgevoerd.

Tot slot kun je zelf methodes maken. Je bepaalt dan niet alleen de inhoud van de methode, maar ook de naam en eventueel de argumenten en de terug te geven waarde van de methode.

De declaratie van een methode

De declaratie van een methode bepaalt drie eigenschappen van de methode: Of en zo ja de soort waarde die teruggegeven wordt, de naam van de methode en het aantal en de soort argumenten.

Het is belangrijk de methode een logische naam te geven, zodat je aan de naam van de methode kunt zien welke functie de methode heeft. Een naam als "xxx" zegt dus niets, een naam als "bereken" ook niet. Een naam als "berekenSom" zegt wel iets. Ook hier geldt evenals bij primitieve variabelen, dat de naam van een methode met een kleine letter begint en de tweede en andere woorden met een hoofdletter.

Een methode die als volgt is gedefinieerd: void berekenGemiddelde() heeft geen argumenten (Dat zien we aan de haakjes waar niets tussen staat) en geeft geen waarde terug Dat zien we aan het woord void voor de naam van de functie. De naam van de methode vertelt dat er een som wordt berekend.

De body van de methode

De body van een methode bestaat uit één of meerdere programmaregels. De body begint en eindigt met een accolade:

{
    int som, gem;
    int a = 5, b = 6;

    som = a + b;
    gem = som /2;
}

Deze body bestaat uit twee regels met declaraties van variabelen, uit twee opdrachtregels en uit een begin- en een eindaccolade.

Met deze kennis kunnen we een eerste eenvoudige methode schrijven:

void berekenGemiddelde() {
    double som, gem;
    double a = 5, b = 6;

    som = a + b;
    gem = som /2;
}

Toch kan deze methode nog niet veel. Het enige wat er gebeurt, is de berekening van het gemiddelde van 5 en 6. Ook de rest van het programma kan niets met de resultaten (de som en gemiddelde) van de methode.

Globale en lokale variabelen

De variabele gem kan bovenaan in klasse worden gedeclareerd. Dan kan overal in het programma de variabele gebruikt worden. Deze variabelen worden globaal genoemd. Nu kan dat niet omdat de variabelen som en gem zijn opgenomen in de body van de methode. Ze kunnen alleen gebruikt worden in de body van de functie en verder niet. som en gem zijn lokale variabelen. Als we willen dat gem globaal wordt, komt het programma er als volgt uit te zien:

//Voorbeeld 13.1

import java.awt.*;
import java.applet.*;

public class EersteMethode extends Applet {
	
    double gem;
	
    public void init() {
        berekenGemiddelde();
    }

    public void paint(Graphics g) {
        g.drawString("Het gemiddelde is: " + gem, 50, 60 );
    }
	
    void berekenGemiddelde() {
        double som;
        double a = 5, b = 6;
		
        som = a + b;
        gem = som / 2;
    }
}

Zou gem niet bovenaan in de applet staan, maar in de body van de methode, dan verschijnt de foutmelding: cannot resolve symbol.

Als vuistregel kun je hanteren dat wanneer je een variabele alleen in één methode gebruikt, je hem daar als lokale variabele declareert. Globale variabelen gebruik je alleen wanneer je ze in meerdere methodes gebruikt. Bovendien blijft je code op die manier overzichtelijker.

Aanroepen van een methode

In Init() van Voorbeeld 13.1 staat de aanroep van berekenGemiddelde(). De aanroep bestaat uit de naam van de methode en uit twee ronde haken. Eventueel staan tussen de ronde haken de argumenten, gescheiden door komma's.

Parameters

Toch is deze methode niet erg handig. Het enige wat deze methode uitrekent, is nog steeds het gemiddelde van 5 en 6. De methode moet nog algemener worden zodat de methode niet alleen geschikt is voor deze applet, maar ook in andere applets gebruikt kan worden.

Daarvoor moet zowel de aanroep als de declaratie van de methode aangepast worden. De aanroep verandert door argumenten of (invoer)parameters mee te geven aan de functie:

berekenGemiddelde(5, 6)

Om ervoor te zorgen dat de methode weet wat er met de 5 en de 6 moet gebeuren, moet ook de declaratie gewijzigd worden:

void berekenGemiddelde(double a, double b) {

}

Nu kunnen we in de applet waar we dat willen, de methode aanroepen met willekeurige getallen. We kunnen nu ook met variabelen van dezelfde soort de methode aanroepen:

//Voorbeeld 13.2

import java.awt.*;
import java.applet.*;

public class EersteMethode extends Applet {
	
    double gem;
	
    public void init() {
        double c = 6;
        double d = 7;
        berekenGemiddelde(c, d);
    }

    public void paint(Graphics g) {
        g.drawString("Het gemiddelde is: " + gem, 50, 60 );
    }
	
    void berekenGemiddelde(double a, double b) {
        double som;
        som = a + b;
        gem = som / 2;
    }
}

Toch is de methode nog niet algemeen genoeg. gem Is nog steeds een globale variabele. Als deze lokaal wordt, moet de methode op een andere manier het resultaat van de berekening aan het programma doorgeven. Dan spreken we van een uitvoerparameter of terugkeerwaarde (return value). Welke soort variabele de methode teruggeeft, moet in de declaratie worden aangegeven. In plaats van void komt er double te staan:
double berekenGemiddelde(double a, double b)

In de laatste regel van de body van de methode komt dan de opdracht return te staan met daarachter de waarde (eventueel in de vorm van een variabele) die teruggeven wordt: return gem; Daar waar de methode wordt aangeroepen, moet komen te staan in welke variabele het resultaat van de methode moet worden opgeslagen:
gemiddelde = BerekenGemiddelde(c, d);

Het volledige programma komt er als volgt uit te zien:

//Voorbeeld 13.3

import java.awt.*;
import java.applet.*;

public class EersteMethode extends Applet {
	
    double gemiddelde;
	
    public void init() {
        double c = 6;
        double d = 7;
        gemiddelde = berekenGemiddelde(c, d);
    }

    public void paint(Graphics g) {
        g.drawString("Het gemiddelde is: " + gemiddelde, 50, 60 );
    }
	
    double berekenGemiddelde(double a, double b) {
        double som;
        double gem;
        som = a + b;
        gem = som / 2;
        return gem;
    }
}

Toch is de methode nog niet algemeen genoeg, want er kan alleen nog maar een gemiddelde van twee waarden worden berekend. Wat we willen, is dat een tabel van een willekeurig aantal getallen aan de methode wordt aangeboden en dat de methode dan het gemiddelde teruggeeft. Dat kan door een tabel aan de methode door te geven als invoerparameter:

//Voorbeeld 13.4

import java.awt.*;
import java.applet.*;

public class EersteMethode extends Applet {
	
    double[] getallen = { 2, 4, 6, 8};
    double gemiddelde;
	
    public void init() {
       gemiddelde = berekenGemiddelde(getallen);
    }

    public void paint(Graphics g) {
        g.drawString("Het gemiddelde is: " + gemiddelde, 50, 60 );
    }
    
    /**
     *geeft gemiddelde van reeks getallen
     *@param array van doubles
     *@return double gemiddelde
     */
    double berekenGemiddelde(double[] d) {
        int teller;
        double som = 0;
        double gem = 0;
        
        for (teller = 0; teller < d.length; teller++) {
            som += d[teller];
        }
        gem = som / d.length;
        
        return gem;
    }
}

De declaratie van de methode is veranderd: De invoerparameters a en b zijn verdwenen en er is een tabel a voor in de plaats gekomen. Eerst wordt som geïnitialiseerd. Anders is in de lus niet bekend welke waarde som heeft. Verder staat er in de body van de methode een lus, die de tabel doorloopt. De methode d.length geeft het aantal elementen van de tabel terug. In de lus wordt de som van de getallen in de tabel berekend. Daarna wordt de som van alle getallen gedeeld door het aantal elementen in de tabel en wordt het gemiddelde aan het programma teruggegeven. De methode is nu in veel situaties te gebruiken. De enige beperking is dat de tabel geheel gevuld moet zijn met getallen.

Opdracht 13.1

Schrijf een applet in Java waarin vijf knoppen in het venster worden geplaatst die elk een andere achtergrondkleur en de naam van de achtergrondkleur als tekst hebben. Als de gebruiker op één van de knoppen drukt, komt in het venster de naam van de kleur te staan.

Opdracht 13.2

2. Maak een applet in Java met een methode om een driehoek te tekenen. De declaratie van de methode ziet er als volgt uit:

void tekenDriehoek( Graphics g, int x1, int y1, int x2, int y2, int x3, int y3);

De methode roep je aan vanuit paint(). De argumenten x1, y1 en x2, y2 en x3, y3 zijn de coördinaten van de hoekpunten van de driehoek.

Opdracht 13.3

Schrijf een applet in Java waarin in een methode een muur van rode bakstenen wordt getoond.

Opdracht 13.4

Schrijf een applet die bij de start alleen twee knoppen toont. Als de gebruiker op de éne knop klikt krijgt hij een muur met rode bakstenen te zien en als hij op de andere knop klikt, krijgt hij een muur met grijze betonblokken te zien. De betonblokken zijn groter dan de bakstenen. Bedenk zelf welke methodes je nodig hebt met welke argumenten.

Praktijkopdracht

1. Maak een applet met een methode om een eenvoudige boom te tekenen. Bedenk zelf welke argumenten de methode zou moeten hebben.

2. Gebruik de methode uit opdracht 1 om een boomgaard te tekenen die uit tenminste 2 rijen van minimaal 5 bomen bestaat.

Als je klaar bent, lever je de broncode in