Oefening 1: Het liftershandboek naar objectoriëntatie
Doel
Schrijf klassen, instantieer objecten van deze klassen en roep methodes op deze objecten aan.
Opdracht
Maak een Scorebord om de 3 topscores bij te houden van personen.
Klassen en objecten
Een persoon heeft een voornaam, familienaam en leeftijd. Maak een klasse voor een Persoon met deze attributen.
- Maak een nieuw BlueJ project.
Maak in dit project een nieuwe klasse Persoon.
Figuur 1: Maak een nieuwe klasse Persoon.
Verwijder alle voorbeeldcode behalve de klasse zelf:
public class Persoon { }
- Voeg de attributen String voornaam, String familienaam en int leeftijd toe. Maak deze private.
public class Persoon { //Attributen private String voornaam; private String familienaam; private int leeftijd; }
Maak een object van de klasse Persoon.
Klik rechts op de klasse Persoon.
Figuur 2: Maak een object van de klasse Persoon.
- Klik op new Persoon(). Geef de instantie een naam. In de objectenbalk onderaan het projectvenster verschijnt een nieuw object van het type Persoon.
Dubbelklik op het object om de attributen van het object te bekijken.
Figuur 3: Inspecteer het object.
Constructor
Maak een constructor voor de klasse Persoon waarbij de parameters waardes opgeven voor de attributen.
public class Persoon { //... //Constructor public Persoon(String voornaam, String familienaam, int leeftijd){ this.voornaam = voornaam; this.familienaam = familienaam; this.leeftijd = leeftijd; } }
- Maak een object. Geef een voornaam, familienaam en leeftijd op. Inspecteer de waardes. Tip: indien een String parameter verwacht wordt, plaats dan de waarde tussen aanhalingstekens.
- Maak een tweede object. Geef andere parameters op. Inspecteer opnieuw het object.
Vraag 1
Wat gebeurt er indien je een object aanmaakt van de Persoon klasse, maar je this. bij de toekenning vergeet. bvb.
public class Persoon
{
//...
//Constructor
public Persoon(String voornaam, String familienaam, int leeftijd){
voornaam = voornaam;
familienaam = familienaam;
leeftijd = leeftijd;
}
}
Methodes
Voorzie accessoren (i.e. getters) voor alle attributen. Bvb.
public class Persoon { //... //Methodes public String getVoornaam(){ return voornaam; } //... }
Maak een object van de klasse Persoon. Roep de verschillende methoden aan. Controleer de waardes.
Figuur 4: Klik rechts op het object om de methoden aan te roepen.
Voorzie mutatoren (i.e. setters) voor familienaam en voornaam. Bvb.
public class Persoon { //... //Methodes public void setVoornaam(String voornaam){ this.voornaam = voornaam; } //... }
- Maak een object van de klasse Persoon. Roep de verschillende methoden aan. Controleer de waardes.
- Maak een methode void verjaar(). Bij het aanroepen van de methode verhoogt de leeftijd van de persoon met 1.
Vraag 2
Wat is de correcte code voor het verhogen van de leeftijd met 1?
Overschrijven van methodes
Roep de toString() methode aan. Deze methode bevindt zich in het methoden menu onder inherited from Object.
Figuur 5: Roep de toString methode aan onder het menu inherited from Object.
Vraag 3
Wat krijg je terug bij het aanroepen van de toString methode?
Schrijf zelf een String toString() methode waarin de terugkeerwaarde het volgende patroon volgt:
[voornaam] [familienaam] is [leeftijd] jaar
. Bvb. Suske Van Amoras is 15 jaar.- Roep opnieuw de toString methode aan op een Persoon object en controleer de code. Tip: de methode toString bevindt zich niet meer onder inherited from Object.
- Importeer het bestand TestPersoon.java. Compileer en voer de testen uit. Indien er testen falen, probeer de problemen op te lossen.
UML klassendiagram
- Maak op papier een UML klassendiagram van de klasse Persoon.
- Teken een rechthoek. Schrijf de naam van de klasse bovenaan in de rechthoek en trek hier een lijn onder.
- Schrijf alle attributen van de klasse onder deze lijn.
- Begin met een aanduiding van de access modifier. private wordt aangeduid met een min symbool, public met een plus symbool.
- Schrijf dan de naam van het attribuut.
- Plaats daarna een dubbelpunt en plaats daarna het type van het attribuut.
- Trek hieronder opnieuw een lijn.
- Schrijf alle methoden onder deze lijn. Begin met de constructor.
- Begin met een aanduiding van de access modifier.
- Schrijf de naam van de methode.
- Plaats alle parameters tussen haakjes. Schrijf eerst de naam van de parameter dan een dubbelpunt en daarna het type van de parameter.
- Plaats na de haakjes van de parameterlijst een dubbelpunt en daarna het terugkeertype. Bemerk: de constructor heeft geen terugkeertype.
Vul het voorbeeld verder aan:
Figuur 6: Voorbeeld klassendiagram van de Persoon klasse.
Compositie van objecten
- Maak een nieuwe klasse Score, verwijder alle voorbeeldcode behalve de klasse zelf in hetzelfde project. De klasse Score houdt de score van een Persoon, een geheel getal, bij. De score en de Persoon zijn attributen in deze klasse.
- Maak een constructor waarbij de score en de Persoon als argumenten ingegeven kunnen worden.
- Voorzie voor beide attributen van getters en enkel de score van een setter.
- Maak een Score object. Tip: maak eerst een Persoon object en geef de naam van het Persoon object mee als argument met de constructor van Score. Probeer de verschillende methoden eens uit.
Overladen van methodes of constructoren
- Maak een tweede constructor voor de klasse Score waarbij de score, de voornaam, de familienaam en de leeftijd als argumenten worden meegegeven. Het is niet nodig om nieuwe attributen te maken.
- De argumenten voornaam, familienaam en leeftijd worden gebruikt om een Persoon object te maken. Dit doe je door gebruik te maken van de new operator. Een voorbeeld:
public Score (int score, String voornaam, String familienaam, int leeftijd){ //Vergeet het attribuut score niet toe te kennen ;-) persoon = new Persoon(voornaam, familienaam, leeftijd); }
- De argumenten voornaam, familienaam en leeftijd worden gebruikt om een Persoon object te maken. Dit doe je door gebruik te maken van de new operator. Een voorbeeld:
- Maak een toString methode die het volgende patroon volgt:
[voornaam] : [score] punten
. Bvb. Suske : 1000 punten. Probeer deze methode eens uit en controleer.- Om de voornaam van het persoon object op te halen, maak gebruik van de getVoornaam methode.
Het UML klassendiagram wordt ter ondersteuning gegeven. De pijl tussen de Score klasse en de Persoon klasse duidt een associatie tussen deze klasses aan. De richting van de pijl wijst erop dat de Score klasse van de Persoon klasse gebruik maakt.
Figuur 7: Associatie tussen de Score en de Persoon klasse.
- Importeer de klasse TestScore.java. Compileer en voer de testen uit. Indien er testen falen, probeer de problemen op te lossen.
Scorebord
- Maak een nieuwe klasse Scorebord in hetzelfde project, verwijder alle voorbeeldcode behalve de klasse zelf. De Scorebord klasse houdt de top 3 scores bij.
- Maak 3 Score attributen.
- Maak een constructor waarbij 3 lege scores, met als score 0 en naam "XXXXXX" worden aangemaakt.
- Maak een methode voegToe(Score nieuw), die de nieuwe score op de correcte plaats in het Scorebord plaatst. Indien de nieuwe score lager is dan de derde score, wordt die niet toegevoegd aan het Scorebord. Probeer de methode eens uit. Inspecteer het object om de code te controleren.
- Maak een methode toString die de waardes in het Scorebord onder elkaar weergeeft.
- Maak een main methode (public static void main(String[] args)) die met System.out.println het Scorebord in de console weergeeft. Tip: maak eerst in de main methode een scorebord object en voeg enkele nieuwe scores toe.
- Importeer de klasse TestScorebord.java. Compileer en voer de testen uit. Indien er testen falen, probeer de problemen op te lossen.
- Maak op papier een UML klassendiagram van de klasse Scorebord.
Vraag 4
Wat is het correcte klassediagram van de klasse Scorebord?
Extra
Bankrekening
- Maak een nieuw project met een klasse Bankrekening. Een Bankrekening bestaat uit een rekeningnummer, i.e. een String, en een saldo, i.e. een double.
- Voorzie twee constructoren. De ene constructor maakt het mogelijk om beide attributen in te vullen en de andere constructor enkel een rekeningnummer en wordt het saldo initieel op 0 geplaatst.
- Voorzie methodes voor:
- Het opvragen van het saldo.
- Opnemen van een bepaald bedrag, geef hierbij het opgenomen bedrag terug.
- Storten van een bepaald bedrag.
- Maak een methode toString waarin de informatie over de Bankrekening wordt weergegeven.
- Maak een klasse Bank. Maak drie Bankrekeningen in deze Bank.
- Maak in de klasse Bank een methode schrijfOver. Deze methode heeft als argumenten van welke Bankrekening, naar welke Bankrekening, een bepaald saldo wordt overggeschreven.
- Maak een methode toString waarin alle Bankrekeningen van de Bank worden weergegeven.
Controleer de code met TestBankrekening.java en TestBank.java.
Figuur 8: UML klassendiagram Bank.
Boek
- Maak een nieuw project. Een Boek heeft een ISBNnummer, een titel, een uitgever en een prijs. Maak een klasse Boek voorzie de nodige getters en een toString methode.
- Maak een aparte klasse voor het ISBNnummer. Het ISBNnummer bestaat uit:
- Een driecijferige EAN code: dit is altijd 978
- Tweecijferige code voor het taalgebied: bvb. 90 voor Nederlands
- Een driecijferige uitgeverscode
- Viercijferige identificatie van het boek
- Een controlecijfer. Dit wordt als volgt berekend:
- Tel alle cijfers op een even positie op en vermenigvuldig met 3.
- Tel alle cijfers op een oneven positie hierbij op.
- Het controlecijfer is het cijfer dat bij het resultaat van de vorige stappen opgeteld moet worden om tot een veelvoud van 10 te komen.
- Maak een UML klassendiagram.