740 likes | 876 Views
Hoofdstuk 4: Klassen definiëren. Klasse. Herinner: Gelijksoortige objecten met hetzelfde gedrag en gelijksoortige attributen worden gedefinieerd door een klasse Toestand: attributen of instantie variabelen Gedrag: methoden Prototype van een methode
E N D
Klasse • Herinner: Gelijksoortige objecten met hetzelfde gedrag en gelijksoortige attributen worden gedefinieerd door een klasse • Toestand: attributen of instantie variabelen • Gedrag: methoden • Prototype van een methode • Naam methode, beschrijving van de argumentenen beschrijving van de “return” waarde • Argumenten worden ook wel parameters genoemd
delimiter klasse-naam x Klasse definitie class klasse-naam { instantie variabelenconstructor definities methode definities } Gebruik Lacher x ; Voorbeeld Class Lacher { ... }
Return-waarde: geen Parameter-definities: geen Methode-naam Body van de methode Methode definitie public return-waarde methode-naam ( parameter-definities) { body van de methode } Voorbeeld public void lachen ( ) { System.out.println( “haha”); System.out.println( “haha”); }
Lacher object lachen() lachen() x Methode aanroep • Veronderstel een referentie variabele x die verwijst naar een object van de klasse Lacher ... Lacher x ; ... x.lachen() ;
Lacher object lachen() x Methode - uitvoering public void lachen ( ) { System.out.println( “haha”); System.out.println( “haha”); } • Instructies in de body van de methode worden één voor één uitgevoerd
Constructor definitie • Zoals methode • Geen return-type • Naam is steeds naam van de klasse • Herinner: constructor maakt bij aanroep een nieuwe instantie van de klasse
Definitie van een constructor x Lacher object Constructor definitie - voorbeeld Voorbeeld class Lacher { public Lacher ( ) { // deze constructor maakt alleen een nieuwe instantie // van de klasse Lachter, verder doet die niets } } Gebruik Lacher x ; x = new Lacher();
De constructor Een methode Voorbeeld Lacher class Lacher { public Lacher ( ) { } public void lachen ( ) { System.out.println( “haha”); System.out.println( “haha”); } } Gebruik Lacher x ; x = new Lacher(); x.lachen() ;
Lacher object y x Lacher object Voorbeeld Lacher - meerdere instanties class Lacher { public Lacher ( ) { } public void lachen ( ) { System.out.println( “haha”); System.out.println( “haha”); } } Gebruik Lacher x , y; x = new Lacher(); y = new Lacher(); x.lachen() ; y.lachen() ;
type Naam van de parameter Definitie van het argument, ook parameter genoemd Methode met argumenten • We willen het geluid van de lacher kunnen veranderen. • Via een argument bij de methode lachen x.lachen ( “hihi”) x.lachen (“hoho”) • Methode definitie: public void lachen (String geluid )
Gebruik van de parameter, zoals een variabele Methode definitie - met parameters Voorbeeld public void lachen (String geluid ) { System.out.println( geluid ) ; System.out.println( geluid ) ; }
Parameters • Een parameter is zoals een variabele, maar • bestaat maar zolang de methode uitgevoerd wordt • De waarde bij aanvang wordt gegeven bij de aanroep van de methode
geluid “hihi” Parameters - werking public void lachen (String geluid ) { System.out.println( geluid ) ; System.out.println( geluid ) ; } Werking bij activatie x.lachen(“hihi”) ;
geluid “hihi” Parameters - werking (2) public void lachen (String geluid ) { System.out.println( geluid ) ; System.out.println( geluid ) ; } Werking bij activatie x.lachen(“hihi”) ; x.lachen(“hoho”) ;
geluid “hoho” Parameters - werking public void lachen (String geluid ) { System.out.println( geluid ) ; System.out.println( geluid ) ; } Werking bij activatie x.lachen(“hihi”) ; x.lachen(“hoho”) ;
Methode naam is “overladen” Maar verschillende signatuur. Klasse definitie met overloading class Lacher { public Lacher ( ) { } public void lachen () { System.out.println( “haha”) ; } public void lachen (String geluid ) { System.out.println( geluid ) ; } } Gebruik Lacher x ; x = new Lacher ; x.lachen(); x.lachen(“hihi”) ;
Klasse definitie met instantie variabelen • Instantie variabelen dienen om toestand van een object te beschrijven • Zijn variabelen • Zijn toegankelijk vanuit al de methoden gedefinieerd in de klasse • Zijn enkel toegankelijk voor die methoden private type identifier
x Instantie variabele defaultGeluid Voorbeeld instantie variabelen Voorbeeld: Lacher klasse die toelaat om het default lachgeluid bij het maken van een object vast te leggen. class Lacher { private String defaultGeluid ; public Lacher (String geluid ) { … } public void lachen () { … } public void lachen (String geluid) { … } } Gebruik Lacher x ; x = new Lacher( “hihi”);
Gebruik van de instantie variabele x Instantie variabele defaultGeluid “hihi” Gebruik van instantie variabelen class Lacher { private String defaultGeluid ; public Lacher (String default ) { defaultGeluid = default ; } public void lachen () { System.out.println( defaultGeluid) ; } public void lachen (String geluid) { System.out.println( geluid) ; } } Gebruik Lacher x ; x = new Lacher(‘hihi”); x .lachen(); x .lachen(“haha”);
x y defaultGeluid defaultGeluid “hihi” “hoho” Meerdere instanties en instantie variabelen class Lacher { private String defaultGeluid ; public Lacher (String default ) { defaultGeluid = default ; } public void lachen () { System.out.println( defaultGeluid) ; } public void lachen (String geluid) { System.out.println( geluid) ; } } Gebruik Lacher x, y ; x = new Lacher(‘hihi”); y = new Lacher(‘hoho”); x .lachen(); y .lachen();
Variabele enkel voor de methode lachen() Is een lokale variabele Variabelen voor methoden • We wijzigen de klasse en houden in de instantie variabele enkel de klank bij, bv. “ha” of “hi”. Bij de methode lachen wordt het lachgeluid dan samengesteld door concatenatie. class Lacher { private String defaultKlank ; public Lacher (String klank ) { defaultKlank = klank ; } public void lachen () { String geluid; geluid = defaultKlank.concat(defaultKlank) ; System.out.println( geluid) ; } }
geluid “hihi” x defaultKlank “hi” Lokale variabelen - werking public void lachen () { String geluid; geluid = defaultKlank.concat(defaultKlank) ; System.out.println( geluid) ; } Werking bij activatie Lacher x; x = new Lacher(‘hi”); x.lachen() ;
Variabele enkel voor deze methode lachen() Variabele enkel voor de methode lachten(String klank) Meerdere methoden met variabelen class Lacher { Private String defaultKlank ; public Lacher (String klank ) { defaultKlank = klank ; } public void lachen () { String defaultGeluid; defaultGeluid = defaultKlank.concat(defaultKlank) ; System.out.println( defaultGeluid) ; } public void lachen (String klank) { String geluid; geluid = klank.concat(klank) ; System.out.println( geluid) ; } }
Een klasse gebruiken • Stap 1: maak bestand klasse-naam.java met klasse definitie • Stap 2:Compileer dit bestand -> resultaat bestand klasse-naam.class • Stap 3:klasse kan nu gebruikt worden
Voorbeeld - definitie klasse • Lacher.java bestand import java.io.*; //nodig omdat we een PrintStream object gebruiken class Lacher { private String defaultKlank ; public Lacher (String klank ) { defaultKlank = klank ; } public void lachen () { String geluid; geluid = defaultKlank.concat(defaultKlank) ; System.out.println( geluid) ; } public void lachen (String klank) { String geluid; geluid = klank.concat(klank) ; System.out.println( geluid) ; } }
Voorbeeld - gebruik klasse import java.io.*; class ProgrammaLachen { public static void main(String[ ] arg) { System.out.println(“Lekker lachen”); Lacher x, y ; x = new Lacher(“yuk”) ; y = new Lacher(“harr”); x.lachen(); x.lachen(“hee”); y.lachen(); } }
Klassen ontwerpen Methode 1. Bepaal het gewenste gedrag • methoden 2. Bepaal de interface van de methoden • Prototype van de methoden 3. Schrijf een voorbeeld programma die de klasse gebruikt • Check 4. Maak het skelet van de klasse 5. Schrijf de code voor de methoden (implementeer)
Voorbeeld - klasse ontwerp • Ontwerp klasse voor het behandelen van tijdstippen :class Tijdstip
Tijdstip vb - Bepaal het gedrag • We willen het volgende gedrag • Een tijdstip een waarde (uren, min en sec) kunnen geven • Het uur van een tijdstip kunnen opvragen • De minuten van een tijdstip kunnen opvragen • De seconden van een tijdstip kunnen opvragen • Het uur van een tijdstip kunnen wijzigen • De minuten van een tijdstip kunnen wijzigen • De seconden van een tijdstip kunnen wijzigen • Het tijdstip kunnen afdrukken op het scherm
Tijdstip vb - Bepaal de interface • Class name: Tijdstip • Constructor: Tijdstip() • Vb: Tijdstip t1 = new Tijdstip(); • public Tijdstip() • Tijdstip een waarde geven: Vb: t1.zet(23, 40, 15); • public void zet( int u, int m, int s) • Het uur van een tijdstip kunnen opvragen: Vb: int u1 ; u1 = t1.geefUur(); • public int geefUur( )
Tijdstip vb - Bepaal de interface (vervolg) • De minuten van een tijdstip kunnen opvragen: Vb: int m1 ; m1 = t1.geefMin(); • public int geefMin( ) • De sec van een tijdstip kunnen opvragen: Vb: int s1 ; s1 = t1.geefSec(); • public int geefSec( ) • Het uur van een tijdstip kunnen wijzigen: Vb: t1.wijzigUur(11); • public void wijzigUur( int u)
Tijdstip vb - Bepaal de interface (vervolg) • De minuten van een tijdstip kunnen wijzigen: Vb: t1.wijzigMin(44); • public void wijzigMin( int m) • De seconden van een tijdstip kunnen wijzigen: Vb: t1.wijzigSec(20); • public void wijzigSec( int s) • Het tijdstip kunnen afdrukken op het scherm: Vb: t1.drukaf(); • public void drukaf( )
Tijdstip vb - Een vb-programma import java.io.*; class ProbeerTijdstip { public static void main(String[ ] arg) throws IOException { Tijdstip t1 = new Tijdstip (); Tijdstip t2 = new Tijdstip(); t1.zet(10, 15, 30) ; int u, m, s ; u = t1.geefUur (); m = t1.geefMin() ; s = t1.geefSec(); t2.zet(u +1, m, s) ; t1.wijzigMin(30) ; t1.drukaf(); t2.drukaf(); } }
Tijdstip vb - Klasse skelet class Tijdstip { instantie variabelen indien nodig public Tijdstip() { statements } // geef waarde public void zet(int u, int m, int s) { statements } // geef uur; public int geefUur( ) { statements }
Tijdstip vb - Klasse skelet (vervolg) // geef min; public int geefMin( ) { statements } // geef sec; public int geefSec( ) { statements } // wijzig uur ; public void wijzigUur(int u) { statements } // wijzig min ; public void wijzigMin(int m) { statements }
Tijdstip vb - Klasse skelet (vervolg) // wijzig sec ; public void wijzigSec(int s) { statements } // druk af op het scherm public void drukaf ( ) { statements } }
Tijdstip vb - Implementatie • Welke instantie variabelen nodig? • Bijhouden uur, minuten, seconden • 3 integer variabelen: uur, min en sec int uur, min, sec ; • De constructor Tijdstip() public Tijdstip() { }
Tijdstip vb - Implementatie (2) • Begin bij eender welke methode • Meestal de gemakkelijkste Bv. zet public void zet(int u, int m, int s) { uur = u ; min = m ; sec = s ; }
Speciale instructie: “return waarde” ; Tijdstip vb - Implementatie (3) • De methodes geefUur, geefMin en geefSec public int geefUur() { return uur ; } public int geefMin() { return min ; } public int geefSec() { return sec ; }
Tijdstip vb - Implementatie (4) • De methodes wijzigUur, wijzigMin en wijzigSec public void wijzigUur(int u) { uur = u ; } public void wijzigMin(int m) { min = m ; } public void wijzigSec(int s) { sec = s ; }
Tijdstip vb - Implementatie (5) • De methode drukaf public void drukaf() { String tijdstipAlsString ; // in het formaat uu:mm:ss tijdstipAlsString = uur + “:” + min + “:” + sec ; System.out.println( tijdstipAlsString); } of nog korter public void drukaf() { System.out.println(uur + “:” + min + “:” + sec ); }
Declaratie volgorde • De volgorde van variabelen en methoden binnen een klasse is niet van belang. • Java Conventie: • Constructors • Methoden • Instantie variabelen
Return statement • Uitvoering van een methode stopt indien: 1. return-statement wordt uitgevoerd 2. Einde ( } ) van methode bereikt wordt bij void-methode • Void-methode kan ook return hebben return; public void drukaf() { System.out.println(uur + “:” + min + “:” + sec ); return ; } public void drukafVerkeerd() { String st = uur + “:” + min + “:” + sec ; return ; System.out.println (st) ; }
Return waarde • Methoden kunnen slechts één waarde terug geven • return uur, min, seckan niet • Oplossing: zie later
public versus private • privateverhindert dat de methode of variabele buiten de klasse kan worden gebruikt • publiclaat gebruik van de methode of variabele buiten de klasse toe • In ‘t algemeen: • Methoden uit de interface zijn “public” • Hulp-methoden zijn “private” • Instantie variabelen zijn “private”
Draagwijdte (scope) van deze s Twee verschillende variabelen Draagwijdte (scope) van deze s Toegankelijkheid en zichtbaarheid • Lokale variabelen zijn niet toegankelijk buiten de methode • Ze zijn ook niet zichtbaar buiten de methode public void methode1() { String s = “test1” ; ... } public void methode2 () { String s = “test2” ; … }
De levensduur van een object • Het “leven” van een object begint bij de creatie van het object • door de new operator • Een object blijft “leven” zolang er ten minste één referentie variabele naar verwijst. • Java vernietigt automatische alle objecten waarnaar niet meer gerefereerd wordt
Referentie naar “herfst” is weg! Java zal “herfst” object vernietigen. t t t String t ; t = “herfst” ; String t ; String t ; t = “herfst” ; t = “winter” ; “herfst” “herfst” “winter” Voorbeeld
Object Toestand Kleur: “blauw” Merk: “Opel” Nummerplaat: “ARJ775” Gedrag Rijden Remmen Toeteren Levensduur van variabelen (1) • Instantie variabelen worden samen met het object gecreëerd • De levensduur is dus gelijk aan de levensduur van het object Instantie variabelen