Java Objectgeoriënteerd Programmeren in Java met BlueJ Hoofdstuk 2: Zelf klassen maken © 2014, Gertjan Laan, versie 2
Objectgeoriënteerde taal Java is een objectgeoriënteerde programmeertaal Objecten spelen een belangrijke rol In een objectgeoriënteerde taal probeer je dingen uit de werkelijkheid in software vorm te geven door middel van objecten
Objecten Een object kan een ding zijn dat je kunt vasthouden Een object kan een abstract begrip zijn Voorbeelden van objecten: Een persoon Een geboortedatum Een adres Een bankrekening
Klassen Je kunt pas objecten maken als je een klasse hebt Een klasse bestaat doorgaans uit drie gedeelten: Een kop, met daarin de naam van de klasse Attributen (zodat objecten gegevens kunnen onthouden) Methoden (zodat je objecten iets kunt laten doen)
Waaruit bestaat een klasse? Naam van de klasse Attributen Methoden
Een klasse voor leerlingen Voorbeeld: Een klasse voor objecten waarin je de gegevens van een leerling kunt opslaan Welke gegevens behoren tot de klasse? Van elke leerling bijvoorbeeld: de naam de klas het geslacht en leerlingnummer Vraag: hoe maak je zo’n klasse?
1. Naam van de klasse Een voor de hand liggende naam voor de klasse is Leerling In Java komt de kop van de klasse er zo uit te zien: public class Leerling Het woord public duidt erop dat deze klasse voor algemeen gebruik is
Body van de klasse Behalve de kop bestaat elke klasse uit een body met accolades er omheen: public class Leerling { ... }
2. Attributen van de klasse In de body komen de attributen en methoden Eerst de attributen Het zijn er 4 Ik geef ze de volgende namen: naam, klas, geslacht en nummer Voordat je de attributen in de klasse kunt plaatsen moet je eerst van elk attribuut het type vaststellen
Type String Java kent het type String voor een rijtje tekens En voor gehele getallen het type int naam, klas en geslacht zijn van het type String nummer is van het type int
Klasse met attributen public class Leerling { private String naam; private String klas; private String geslacht; private int nummer; ... } Het woord private geeft aan dat deze gegevens niet openbaar zijn Je kunt ze niet zomaar opvragen of wijzigen
Broncode De klasse zoals die nu is kun je intikken in een editor (tekstverwerker) De tekst die je intikt heet de broncode van de klasse Deze broncode moet je naar bytecode laten vertalen (to compile - compileren) Broncode intikken en compileren kun je in BlueJ doen
Objecten maken Als je een klasse hebt ingetikt en deze gecompileerd is kun je er objecten van maken Zoveel je wilt Een nieuw object maak je met het woord new: new Leerling() In BlueJ doe je dit door uit een menu new Leerling() te kiezen
Namen van objecten Vaak is het handig elk object een eigen naam te geven, bijvoorbeeld: leerling1 = new Leerling() leerling2 = new Leerling() Met behulp van deze namen kun je de objecten uit elkaar houden De naam van een object heet ook wel een referentie naar dat object
Defaultwaarden van attributen De twee Leerling-objecten zijn nog leeg De attributen bevatten nog geen geschikte gegevens (waarden) Wel krijgen ze automatisch een defaultwaarde Een String krijgt null als defaultwaarde Een int krijgt 0 als defaultwaarde
De twee objecten naam=null klas=null geslacht=null nummer=0 leerling1
Attributen een waarde geven Aan zulke objecten met alleen de waarden null en 0 erin heb je niet veel De attributen moeten een zinvolle waarde krijgen Dat kan op verschillende manieren Een veel gebruikte manier is: Geef de klasse een constructor
Een constructor Een constructor is een soort methode die een object levert van de klasse waar hij constructor van is Een constructor heeft altijd dezelfde naam als de klasse De constructor van de klasse Leerling heet Leerling() en levert een Leerling-object Constructor van de klasse Schildpad heet Schildpad()en levert een Schildpad-object
Argumenten Een constructor kan argumenten hebben Via de argumenten kun je de attributen een andere waarde dan de default-waarde geven
Zelf constructor maken public class Leerling { private String naam; private String klas; private String geslacht; private int nummer; // Constructor public Leerling( String nm, String kl, String gesl, int nr ) { naam = nm; klas = kl; geslacht = gesl; nummer = nr; }
De constructor (kop) // Constructor public Leerling( String nm, String kl, String gesl, int nr ) { naam = nm; klas = kl; geslacht = gesl; nummer = nr; }
De constructor (body) // Constructor public Leerling( String nm, String kl, String gesl, int nr ) { naam = nm; klas = kl; geslacht = gesl; nummer = nr; }
Aanroep van de constructor new Leerling( "Jaap","5B","m",101 ) 4 actuele argumenten Aanroep van constructor
Wat gebeurt bij aanroep? public class Leerling { private String naam; private String klas; private String geslacht; private int nummer; // Constructor public Leerling( String nm, String kl, String gesl, int nr ) { naam = nm; klas = kl; geslacht = gesl; nummer = nr; } "Jaap" "5B" "m" 101 4 formele argumenten
Meer objecten maken Op dezelfde manier kun je van deze klasse meer objecten maken leerling1 = new Leerling( “Filip","5B", “v",102 ) leerling2 = new Leerling( “Mathilde","5A, "v",104 )
De twee objecten naam="Filip" klas="5B" geslacht="v" leerling1 nummer=102 leerling1 naam ="Mathilde" klas="5A" geslacht="v" nummer=104 leerling2
Methoden Ik kan nu objecten maken … … en gegevens in de attributen opbergen Maar verder nog niets Als je wilt dat je iets met objecten kunt doen iets opvragen, iets wijzigen, een opdracht geven ... dan moet je methoden maken
Getters Een getter is een methode waarmee je de waarde van een attribuut opvraagt De naam van een getter begint altijd met het woord get Gevolgd door de naam van het attribuut met een hoofdletter Bijvoorbeeld: getNaam() getKlas() getGeslacht() getNummer()
De methode getNaam() public String getNaam() { return naam; } De methode heeft als retourwaarde een String De retourwaarde is in dit geval de waarde van het attribuut naam
De methode getKlas() public String getKlas() { return klas; } De methode heeft als retourwaarde een String De retourwaarde is in dit geval de waarde van het attribuut klas
De methode getGeslacht() public String getGeslacht() { return geslacht; } De methode heeft als retourwaarde een String De retourwaarde is in dit geval de waarde van het attribuut geslacht
De methode getNummer() public int getNummer() { return nummer; } De methode heeft als retourwaarde een int De retourwaarde is de waarde van het attribuut nummer
De klasse tot nu toe Broncode van de klasse Leerling in Word-document Ik heb nu een klasse om gegevens van leerlingen op te bergen en deze gegevens op te vragen
Klassediagram van Leerling naam klas geslacht nummer getNaam() getKlas() getGeslacht() getNummer()
Sportweek Tijdens de sportweek doen teams van twee leerlingen mee Voor de leerlingen gebruik ik de klasse Leerling Voor de teams maken ik een nieuwe klasse met de naam Team Team Leerling
Associatie Om aan te geven dat de klasse Team en de klasse Leerling iets met elkaar te maken hebben teken je een lijn tussen de klassen We zeggen dat er een associatie is tussen de klassen Team Leerling
Naam van associatie Om duidelijk te maken wat de associatie inhoudt zet je een toelichting bij de lijn Een team bestaat uit leerlingen In dit geval bestaat een team uit precies twee leerlingen bestaat uit Team Leerling bestaat uit 2 Team Leerling
De klasse Team Ik maak een klasse voor een team van twee leerlingen De klasse Team heeft twee attributen: de twee teamleden public class Team { private Leerling lid1; private Leerling lid2; ... }
Constructor public class Team { private Leerling lid1; public Team() { lid1 = new Leerling( “Filip","5B",“v",102 ) lid2 = new Leerling( “Mathilde","5A, "v",104 ) }
Nadeel Deze aanpak heeft een belangrijk nadeel: elk team dat je maakt bestaat uit precies dezelfde twee leden Dus dat moet anders Hoe?
Andere constructor public class Team { private Leerling lid1; public Team( Leerling lid1, Leerling lid2 ) { this.lid1 = lid1; this.lid2 = lid2; }
Een nieuw team maken leerling1 = new Leerling("Filip","5B",“v",102) new Leerling("Mathilde","5A, "v",104) team1 = new Team(leerling1, leerling2);
Nog een nieuw team maken leerling3 = new Leerling("Suske","5B","m",212) leerling4 = new Leerling("Wiske","5B,"v",213) team2 = new Team(leerling3, leerling4);
this In deze broncode staat this.lid1 en lid1 public Team( Leerling lid1, Leerling lid2 ) { this.lid1 = lid1; this.lid2 = lid2; } In deze broncode staat this.lid1 en lid1 this.lid1 is het attribuut lid1 lid1 zonder this is het argument lid1
Attribuut en argument public class Team { private Leerling lid1; public Team( Leerling lid1, Leerling lid2 ) { this.lid1 = lid1; this.lid2 = lid2; }
Dit alles en meer In hoofdstuk 2 van OO-programmeren in Java met BlueJ
Einde