Klassen

Leerdoelen

Na het bestuderen van dit hoofdstuk wordt van je verwacht dat je de volgende begrippen kent en kunt gebruiken:

  • klassendiagram
  • namen van klassen, attributen en methoden
  • case-sensitive
  • public en private
  • project
  • gebruik van de constructor en keyword "this"
  • gebruik verschillende soorten methoden
  • getters en setters
  • commentaar

In dit hoofdstuk ga je aan de slag met de klassen Bankrekening en Leerling. De broncode van de klassen vind je in het werkboek. Klassen hebben i.h.a. attributen en methoden. Door middel van zogenaamde getters en setters kun je de waarde van attributen respectievelijk opvragen en beïnvloeden.

Klassendiagram

Een klassendiagram gebaseerd op de Unified Modeling Language (UML) bestaat uit een kop met de naam van de klasse, een onderdeel met de attributen en een onderdeel met de methoden. De naam van de klasse begint altijd met een hoofdletter. Attributen beginnen met een kleine letter en de methoden - afgezien van de constructor - beginnen ook met een kleine letter.

Bankrekening
saldo
naam
nummer
Bankrekening()
getSaldo()
neemOp()
stort()

Opdracht

In de laatste opdracht van hoofdstuk 4 heb je een applicatie gemaakt volgens onderstaand schema.

Maak dezelfde opdracht maar nu met Eclipse. Maak de volgende klassen:

  • Datum met 3 attributen van het type int (dag, maand en jaar)
  • Speler met 2 attributen (String naam en Datum geboortedatum)
  • Team met 3 attributen (String naam en twee spelers van het type Speler)
  • Wedstrijd met 4 attributen (Datum wedstrijdDatum, 2 teams en een String uitslag)
  • Een Applet die er ongeveer als volgt uitziet:

Aanwijzingen

Als je in Eclipse een klasse maakt en deze een aantal attributen geeft, kun je vervolgens automatisch de constructor en de "getters" en de "setters" aanmaken. Dit kan je enorm veel typewerk besparen.

Constructor

Een constructor maakt een object van een klasse. Bij het aanmaken van het object moeten de attributen een waarde krijgen. Dit doe je met behulp van parameters.

public class Speler {
    String naam;
    Datum geboortedatum;
    
    // constructor
    public Speler(String naam, Datum geboortedatum) {
        this.naam = naam;
        this.geboortedatum = geboortedatum;
    }
    ...

Met het keyword this geef je aan dat het om een attribuut van de eigen klasse gaat.

Als je van een klasse een object maakt roep je de constructor aan met het keyword new. De benodigde parameters die je in de constructor hebt gedefinieerd kun je op verschillende manieren meegeven.

Datum datum = new Datum(12, 1, 1987);
Speler speler1 = new Speler("Pietje", datum);						

In bovenstaande code wordt eerst een datum-object gemaakt dat vervolgens wordt meegegeven als parameter bij het maken van het speler-object. Het volgende codefragment laat zien dat dit ook in één keer kan.

Speler speler1 = new Speler("Pietje", new Datum(12, 1, 1987));						

Als je een object maar één keer nodig hebt, is de tweede methode wel zo efficiënt.

Getters

Een getter is een methode die de waarde van een attribuut teruggeeft bijvoorbeeld:

public class Team {
    private String naam;
    private Speler speler1;
    private Speler speler2;
   
    //constructor
    public Team(String naam, Speler speler1, Speler speler2) {
        this.naam = naam;
        this.speler1 = speler1;
        this.speler2 = speler2;
    }
    
    /****** Getters ******/
    
    public String getNaam() {
        return naam;
    }
    
    public Speler getSpeler1() {
        return speler1;
    }
    
    public Speler getSpeler2() {
        return speler2;
    }
}

Een getter heeft altijd een terugkeerwaarde. De terugkeerwaarde (in bovenstaande code gemarkeerd) kan van een primitief type zijn (bijvoorbeeld een int), een string of een object (bijvoorbeeld van type Speler). Je kunt met getters bijvoorbeeld de naam van de spelers van een team opvragen.

Team team1 = new Team("Heren 1",
	new Speler("Pietje", new Datum(12, 1, 1987)),
	new Speler("Jantje", new Datum(6, 7, 1992)) );
	
String naamSpeler1VanTeam1 = team1.getSpeler1().getNaam();
String naamSpeler2VanTeam1 = team1.getSpeler2().getNaam();

Setters

Met een setter kun je een attribuut een waarde geven of de waarde ervan veranderen. De klasse wedstrijd bijvoorbeeld heeft de volgende setter.

public void setUitslag(String uitslag) {
    this.uitslag = uitslag;
}

Setters hebben geen terugkeerwaarde (void) en één parameter die de waarde bevat die het attribuut moet krijgen.

team1 = new Team("4A", new Speler("Jantje", new Datum(20, 1, 1987)), 
        new Speler("Pietje", new Datum(15,1, 1988)));
team2 = new Team("4B", new Speler("Klaas", new Datum(3, 10, 1977)), 
        new Speler("Melvin", new Datum(8, 11, 1991)));
wedstrijd = new Wedstrijd(new Datum(20,1,2015), team1, team2);
wedstrijd.setUitslag("5-3");

De methode toString

Iedere klasse stamt af van de klasse "Object" en erft o.m. al haar methoden. Eén van de methoden is toString() die een string representatie van een object geeft. Om een string van een datum te maken zou je de volgende code kunnen gebruiken:

Datum datum = new Datum(1, 1, 2015);
String datumString = "" + datum.getDag() + "-" + datum.getMaand(); + "-" + datum.getJaar();

Om te vermijden dat je bovenstaande code keer op keer moet aanmaken, kun je ook in de klasse Datum de methode toString() "overriden"

@Override
public String toString() {
    return "" + dag + "-" +maand + "-" + jaar;
}

Als je dit hebt gedaan kun je voortaan als volgt van een datum de gewenste string maken. Je hoeft de methode niet aan te roepen omdat java dat vanzelf doet als ze van een object een string moet maken.

Datum datum = new Datum(1, 1, 2015);
String datumString = "" + datum; 

De klasse Datum

package sportwedstrijd;

public class Datum {
	int dag;
	int maand;
	int jaar;
	
	public Datum(int dag, int maand, int jaar) {
		this.dag = dag;
		this.maand = maand;
		this.jaar = jaar;
	}

	public int getDag() {
		return dag;
	}

	public void setDag(int dag) {
		this.dag = dag;
	}

	public int getMaand() {
		return maand;
	}

	public void setMaand(int maand) {
		this.maand = maand;
	}

	public int getJaar() {
		return jaar;
	}

	public void setJaar(int jaar) {
		this.jaar = jaar;
	}

	@Override
	public String toString() {
		return "" + dag + "-" +maand + "-" + jaar;
	}

}

De klasse Speler

package sportwedstrijd;

public class Speler {
	String naam;
	Datum geboortedatum;
	
	public Speler(String naam, Datum geboortedatum) {
		this.naam = naam;
		this.geboortedatum = geboortedatum;
	}

	public String getNaam() {
		return naam;
	}

	public void setNaam(String naam) {
		this.naam = naam;
	}

	public Datum getGeboortedatum() {
		return geboortedatum;
	}

	public void setGeboortedatum(Datum geboortedatum) {
		this.geboortedatum = geboortedatum;
	}

}


De klasse Team

package sportwedstrijd;

public class Team {
	String naam;
	Speler speler1;
	Speler speler2;
	
	public Team(String naam, Speler speler1, Speler speler2) {
		this.naam = naam;
		this.speler1 = speler1;
		this.speler2 = speler2;
	}

	public String getNaam() {
		return naam;
	}

	public void setNaam(String naam) {
		this.naam = naam;
	}

	public Speler getSpeler1() {
		return speler1;
	}

	public void setSpeler1(Speler speler1) {
		this.speler1 = speler1;
	}

	public Speler getSpeler2() {
		return speler2;
	}

	public void setSpeler2(Speler speler2) {
		this.speler2 = speler2;
	}

}

De klasse Wedstrijd

package sportwedstrijd;

public class Wedstrijd {
	Datum wedstrijddatum;
	Team team1;
	Team team2;
	String uitslag;
	
	public Wedstrijd(Datum wedstrijddatum, Team team1, Team team2) {
		this.wedstrijddatum = wedstrijddatum;
		this.team1 = team1;
		this.team2 = team2;
	}

	public String getUtslag() {
		return uitslag;
	}

	public void setUitslag(String uitslag) {
		this.uitslag = uitslag;
	}

	public Datum getWedstrijddatum() {
		return wedstrijddatum;
	}

	public void setWedstrijddatum(Datum wedstrijddatum) {
		this.wedstrijddatum = wedstrijddatum;
	}

	public Team getTeam1() {
		return team1;
	}

	public void setTeam1(Team team1) {
		this.team1 = team1;
	}

	public Team getTeam2() {
		return team2;
	}

	public void setTeam2(Team team2) {
		this.team2 = team2;
	}

}

De Applet

package sportwedstrijd;

import java.applet.Applet;
import java.awt.Graphics;

public class Overzicht extends Applet {
	Team team1;
	Team team2;
	Wedstrijd wedstrijd; 
	
	public void init() {
		setSize(400, 400);
		team1 = new Team("4A", new Speler("Jantje", new Datum(20, 1, 1987)), 
				new Speler("Pietje", new Datum(15,1, 1988)));
		team2 = new Team("4B", new Speler("Klaas", new Datum(3, 10, 1977)), 
				new Speler("Melvin", new Datum(8,11, 1991)));
		wedstrijd = new Wedstrijd(new Datum(20,1,2015), team1, team2);
		wedstrijd.setUitslag("5-3");
	}
	
	public void paint(Graphics g) {
		g.drawString("Datum wedstrijd: " + wedstrijd.getWedstrijddatum(), 20, 20);
		g.drawString("Spelers team 1:", 20, 50);
		g.drawString("-" + team1.getSpeler1().getNaam(), 20, 70);
		g.drawString("-" + team1.getSpeler2().getNaam(), 20, 90);
		g.drawString("Spelers team 2:", 20, 120);
		g.drawString("-" + team2.getSpeler1().getNaam(), 20, 140);
		g.drawString("-" + team2.getSpeler2().getNaam(), 20, 160);
		g.drawString("Uitslag: " + wedstrijd.getUitslag(), 20, 200);
	}
}