Doelstellingen
Statische methodes en variabelen leren gebruiken Leren hoe Java omgaat met referenties aan objecten
Beginselen van programmeren 9
Het top-down design principe leren gebruiken voor ontwerpen van methodes
Meer over objecten en methodes
Constructor methodes leren definiëren en gebruiken Packages en import opdrachten leren gebruiken
1
Inhoud
Methodes
Statische Methodes and Statische Variabelen
Objecten en referenties
Ontwerp en testen van Methodes
Overloading
Constructoren
Information Hiding herbezocht
Packages
2
Methodes die andere methodes oproepen
De romp van een methode kan oproepen naar andere methodes bevatten de methodes opgeroepen in de main methode horen meestal bij een welbepaald object; dat object wordt in de oproep vermeld wordt (calling object)
vb: speciesOfTheMonth.populationIn10();
de oproep van een methode uit dezelfde klasse gebeurt meestal zonder calling object
3
4
1
Methodes die andere methodes oproepen
Methodes die andere methodes oproepen
5
Methodes die andere methodes oproepen
6
Methodes die andere methodes oproepen Methode main roept de methode dialog in de klasse Oracle via het object delphi (calling object). Binnen dezelfde klasse, wordt de naam van het calling object achterwege gelaten Methode dialog roept de methode answerOne op in dezelfde klasse. Methode answerOne roept de methode seekAdvice en de methode update op in dezelfde klasse.
Geen calling object = impliciete uitvoering op het this object
7
8
2
De null constante
Statische Methodes en Statische Variabelen: Inhoud
Wanneer de compiler vereist dat een object referentie geïnitialiseerd
wordt, gebruik dan null String line = null;
Statische methodes
Statische variabelen
De Math klasse
Wrapper klassen
null is geen object, maar een constante die aangeeft dat een object
variabele naar geen enkel object verwijst Controleren of een object verwijst naar null
== en != gebruiken in plaats van equals Met een object dat naar null verwijst, kan je geen methodes oproepen
null pointer exception
9
Statische methodes en statische variabelen
10
Statische methodes
Stel dat je functionaliteit wil die je niet direct met een object kan
associëren vb: sommige methodes hebben geen zinvolle verbinding met een object, zoals
het maximum vinden van twee getallen
Een statische methode is nog steeds een lid van de klasse Opgelet: de methode wordt opgeroepen via de naam van de klasse
in plaats van via een object.
een vierkantswortel berekenen een letter van onderkast naar bovenkast omzetten een willekeurig getal genereren.
Syntax:
= .<Static_Method_Name>(<Parameterlist>);
dergelijke methodes kunnen we definiëren als static ook variabelen kunnen als static gedefinieerd worden Statische methodes en statische variabelen behoren tot een klasse
en worden NIET aan een object geassocieerd 11
12
3
Statische methodes: voorbeeld
Statische methodes: voorbeeld (2)
13
Statische methodes: voorbeeld (2)
14
Definiëren van statische methodes
static toevoegen aan de hoofding
vb: public static double area(double radius) Niets in de definitie mag naar een calling object verwijzen, of naar
instantievariabelen van een object.
15
16
4
Statische en niet-statische methodes
statische en niet-statische methodes onderscheid tussen statische en niet-statische methodes: een statische methode hoort niet bij een object, maar bij de klasse een niet-statische methode hoort bij een object, en kan enkel aangeroepen worden mits het object bestaat
voorbeeld: in de klasse PlayCircle wordt in de statische methode areaDialog de niet-statische methode showArea aangeroepen; daarvoor moet er een object van die klasse gecreëerd worden, nl. c
17
Statische en niet-statische methodes
18
Statische Variabelen Een klasse kan zowel statische variabelen en constanten bevatten als
statische methodes vb: public static final double PI = 3.14159; public static int numberOfInvocations = 0; Net zoals instantievariabelen kan je ze private declareren
toegang via inspector methodes wijzigingen via mutator methodes Elk object heeft toegang tot de statische variabelen via deze methodes. voorbeeld: in StaticDemo worden twee objecten van de klasse StaticDemo
gecrëerd, die elk de statische variabele numberOfInvocations wijzigen 19
20
5
Statische Variabelen: voorbeeld
Statische Variabelen: voorbeeld
21
22
De Math klasse
Statische variabelen
Statische variabelen worden ook klasse variabelen genoemd
De voorgedefinieerde klasse Math biedt verscheidene wiskundige
methodes
Al deze methodes zijn statische methodes
Het nut van statische variabelen bestaat erin
informatie te bewaren die voor de hele klasse van objecten van toepassing is.
Deze methodes kan je oproepen met Math.<Methodenaam> (<parameterlijst>)
PAS OP: er zijn weinig gevallen waarin statische variabelen nodig zijn.
vb: Math.sqrt(25) berekent de vierkantswortel van 25 Math.random() genereert een random getal in het interval [0.0 , 1.0)
23
24
6
De Math klasse: enkele methodes
De Math klasse
De Math klasse heeft twee voordefinieerde constanten, E en PI
vb:
area = Math.PI * radius * radius;
25
De Math klasse
26
Objecten en Referenties: Inhoud
Variabelen Variabelen van een primitief type Variabelen van een klasse type
27
28
7
Variabelen
Variabelen van een primitief type
We kunnen we in twee soorten indelen: variabelen van primitieve types (int, double, boolean, char,…) variabelen van een klasse type vb: object dephi van de klasse Oracle
Een variabele van een primitief type wordt geassocieerd met het
geheugenadres waar de waarde van de variabele wordt opgeslagen.
dergelijke variabelen verwijzen naar objecten
int i;
Alle variabelen worden als geheugenlocaties gerealiseerd De waarde van een primitieve variabele wordt op de toegewezen locatie opgeslagen De waarde van een klasse type variabele is het adres waar een object van die klasse wordt opgeslagen. Dit adres noemen we een referentie (reference).
i
i = 13;
29
Variabelen van een klasse type
13
30
Variabelen van een klasse type
Een variabele van een klasse type bevat de referentie aan een object. SpeciesFourthTry klingonSpecies, earthSpecies; SpeciesFourthTry name klingonSpecies
population growthRate
earthSpecies SpeciesFourthTry
klingonSpecies = new SpeciesFouthTry();
name population
earthSpecies = new SpeciesFouthTry();
growthRate 31
32
8
Variabelen van een klasse type
Variabelen van een klasse type
33
Variabelen van een klasse type
34
Variabelen van een klasse type
Een variabele van een klasse type kunnen referen aan hetzelfde object. Variabelen van een klasse type die naar hetzelfde object verwijzen, noemen we aliassen. Dit object kan gewijzigd worden via elk van deze variabelen De numerieke adressen van geheugenlocaties zijn voor de programmeur
niet beschikbaar.
35
36
9
Variabelen van een klasse type
Geheugen reserveren voor objecten
Een declaratie zoals SpeciesFourtTry s;
creeërt een variabele s die een geheugenadres kan bevatten. Een declaratie zoals s = new SpeciesFourthTry();
wijst geheugen toe voor een object van type SpeciesFourthTry.
37
== voor variabelen van een klasse type
38
== voor variabelen van een klasse type
39
40
10
== voor variabelen van een klasse type
equals methode voor een klasse type
Voor variabelen van een klasse type, test de == operator of de
variabelen aliassen zijn van elkaar, NIET of ze refereren aan objecten waarvan instantievariabelen dezelfde waarden hebben. Om te testen op intuïtieve gelijkheid van objecten, definieer en gebruik
een gepaste equals methode.
41
variabelen van een klasse type vergelijken
42
Variabelen van een klasse type vergelijken
43
44
11
De methode equals
Programmavoorbeeld
De definitie van de methode equals hangt af van de omstandigheden
In sommige gevallen worden twee objecten reeds als “gelijk” beschouwd als één van de instantievariabelen overeen komt
In andere gevallen zijn objecten soms pas “gelijk” als al hun instantievariabelen overeen komen. Geef deze methode steeds de naam equals
45
Programmavoorbeeld
46
Programmavoorbeeld
47
48
12
Programmavoorbeeld
Programmavoorbeeld
49
Integer, Double en andere Wrapper klassen
50
Integer, Double en andere Wrapper klassen
Soms is het handig om voor primitieve types ook met objecten te kunnen
Opvragen van de integer waarde
int i = n.intValue();
werken. methodes op die objecten oproepen referenties aan die objecten aan methodes doorgeven
Primitief type
De Java wrapper klassen converteren de waarde van een primitief type
naar een object. Integer n = new Integer(42); De instantievariabele van het object n heeft de waarde 42
51
int long float double char
Wrapper klasse Integer Long Float Double Character
Extractie methode intValue longValue floatValue doubleValue charValue
52
13
Verkorte schrijfwijze in Java 5.0
Nuttige methodes en constanten
Omzetten in een wrapper object kan automatisch in Java 5.0
Wrapper klassen bevatten nuttige statische methodes
Converteren van String naar andere types
Integer n = 42;
vb parseDouble()
is de verkorte schrijfwijze van Integer n = new Integer (42);
Omzetten naar String vb toString()
Analoog is
int i = n; equivalent aan int i = n.intValue();
En ook constanten
Deze operaties worden ook wel automatic boxing en unboxing
genoemd.
Integer.MAX_VALUE Integer.MIN_VALUE Double.MAX_VALUE Double.MIN_VALUE
53
Statische methodes in de klasse Character
54
Ontwerpen van methodes: Inhoud Gevalstudie: Formatteren van output Top-Down Design Het testen van methodes
55
56
14
Definiëren van de methodes write en writeln
Gevalstudie: formatteren van output
De methodes write en writeln moeten
Probleem bij het schrijven van bedragen in dollar (double)
Het dollarteken vooraan toevoegen Exact twee cijfers na de komma uitvoeren Het laatste cijfer afronden Overeenkomen met hun tegenhangers print en println
your cost is $19.981123576432 terwijl dit is wat je eigenlijk wil zien: your cost is $19.98 Java biedt klassen voor het formatteren van output, maar hier gaan we dit
zelf proberen
57
Definiëren van de methodes write en writeln
58
Definiëren van de methodes write en writeln
De “dollars” en “cents” moeten afzonderlijk uitgevoerd worden,
Hoe verwijderen we het decimale punt ?
voorafgegaan van het dollarteken en gescheiden door een punt.
vermenigvuldig alles met 100 en rond dan af
int allCents = (int)Math.round(amount*100); Eerste poging: Hoe vinden we hieruit de dollarwaarde ? int dollars = allCents/100;
System.out.print(‘$’); System.out.print(dollars); System.out.print(‘.’); uitvoer van cents, juist geformatteerd
59
60
15
Definiëren van de methodes write en writeln
Definiëren van de methodes write en writeln
Hoe vinden we de waarde voor de cents ?
int cents = allCents%100; Indien cents een waarde heeft kleiner dan 10 …
… moeten we een nul voorzien na het decimaal punt. if (cents < 10) System.out.print(‘0’); System.out.print(cents);
61
Definiëren van de methodes write en writeln
62
Definiëren van de methodes write en writeln
63
64
16
Definiëren van de methodes write en writeln
Definiëren van de methodes write en writeln
Negatieve getallen worden niet goed behandeld in de vorige klasse
$-1.0-20 in plaats van -$1.20 Hoe kunnen we dit oplossen ?
converteer het getal naar een positief getal en schrijf een min-teken voor de andere uitvoer.
65
Definiëren van de methodes write en writeln
66
Definiëren van de methodes write en writeln
67
68
17
Top-Down Design
Top-Down Design
Een groot probleem kan in deelproblemen opgesplitst worden.
De verzameling van kleinere taken werken samen om de het grotere
probleem op te lossen Deze deelproblemen kan je nog verder opdelen in kleinere taken. Typisch worden kleinere taken geïmplementeerd als private “hulp” Verschillende kleine taken zijn gemakkelijker te programmeren dan één
methodes.
grote. Deze techniek heet Top-Down design of verdeel en heers.
69
Het testen van methodes
70
Bottom-up testing
Een driver programma is nuttig voor het testen van één methode of klasse
in ontwikkeling Een driver programma moet niet in detail uitgewerkt worden De bedoeling is om een methode of klasse op te roepen en te testen. Nadat de methode of klasse voldoende getest is, is het driver programma niet meer nodig.
71
Gouden regel
Als methode A methode B gebruikt, dan MOET methode B volledig getest zijn alvorens methode A te testen Het testen van alle “onderliggende” methodes, die door een andere
methode worden opgeroepen, ALVORENS deze andere methode te testen, noemen we Bottom-up testing.
72
18
Stubs
Overloading
Soms moet een algemene aanpak getest worden alvorens alle methodes
We zagen reeds eerder dat verschillende klassen methodes kunnen
hebben met dezelfde naam.
geschreven kunnen worden.
Ook in dezelfde klasse kan je methodes dezelfde naam geven
Een stub is een vereenvoudigde versie van een methode,
die goed genoeg is voor test doeleinden MAAR nog niet goed voor de uiteindelijke klasse definitie. zo kan een stub bijvoorbeeld een willekeurig getal teruggeven, maar dit kan voldoende zijn om te testen.
ALS EN SLECHTS ALS door de lijst van parameters kan bepaald worden welke methode aangeroepen wordt.
deze nuttige eigenschap noemen we overloading
73
Overloading
74
Overloading
75
76
19
Overloading
Overloading
Het aantal argumenten en de types van de argumenten bepalen welke
methode average er wordt opgeroepen
Als er geen overeenkomst gevonden wordt probeert Java eenvoudige
Zonder het te weten heb je reeds overloading gebruikt
methode println de max methode van Math
conversies van types
Als er dan nog geen overeenkomst is, wordt een foutboodschap
Overloading kan je met alle soorten methodes
void methodes methodes die een waarde teruggeven statische methodes niet statische methodes …
gegeven.
77
Overloading: programmavoorbeeld
78
Overloading: programmavoorbeeld
79
80
20
Overloading: programmavoorbeeld
Overloading: programmavoorbeeld
81
Overloading: programmavoorbeeld
82
Overloading: programmavoorbeeld
83
84
21
Overloading: programmavoorbeeld
Overloading: programmavoorbeeld
85
Overloading: programmavoorbeeld
86
Overloading: gevaren
Conflicten met automatische type conversie
Stel, je hebt een bestaande methode die doubles als invoer krijgt Je gebruikt af en toe de methode ook met int als argument … een int wordt immers toch naar double omgezet bij de oproep
Als je een methode implementeert met dezelfde naam die int als argument gebruikt gaan je oude oproepen bij deze nieuwe methode terechtkomen
87
88
22
Overloading: gevaren
Constructoren
De volgende code zal compileren:
Wanneer je een object van een klasse aanmaakt, is het nuttig om een
aantal initialisaties te doen
public static void oops (double n1, int n2); . . . public static void oops (int n1, double n2);
Een constructor is een speciale methode waarin je deze initialisaties kan
uitvoeren
Wat gebeurt er bij volgende oproep ?
sample.oops(5,10);
89
Constructoren Definiëren
90
Constructoren Definiëren
Nieuwe objecten worden als volgt aangemaakt
Elke constructor heeft dezelfde naam als zijn klasse
= new (<Parameter_List>);
Een constructor heeft GEEN terugkeertype, zelfs niet void
Een constructor wordt automatisch opgeroepen wanneer een nieuw object
Constructoren worden vaak overladen, elk met verschillende parameters
wordt aangemaakt. (<Parameter_List>) roept de constructor aan en
Typisch is er voor elke klasse een constructor die geen parameters heeft
geeft een referentie naar het object terug De constructor voert de instructies in zijn definitie uit, waarbij de instantievariabelen worden geïnitialiseerd.
91
92
23
Constructoren definiëren: voorbeeld
Constructoren definiëren: voorbeeld
93
Constructoren definiëren: voorbeeld
94
Constructoren definiëren: voorbeeld
95
96
24
Constructoren definiëren: voorbeeld
Constructoren definiëren: voorbeeld
97
Constructoren definiëren: voorbeeld
98
Constructoren definiëren Wanneer een klassedefinitie geen constructor bevat, creeërt Java een
standaard constructor automatisch. Wanneer er tenminste één constructor gedefinieerd is, wordt er geen extra
constructor automatisch aangemaakt.
99
100
25
Constructoren gebruiken
Een referentie teruggeven
Een constructor kan enkel aangeroepen worden bij het aanmaken van een
nieuw object. newBorn.PetRecord(“Fang”, 1, 150.0); //invalid Nadat een object is aangemaakt, heb je een set methode nodig om de
waarden van instantievariabelen te veranderen. newBorn.set(“Fang”, 1, 150.0); //valid
101
Andere methodes in een constructor
102
Wrapper klassen De Wrapper klassen
Andere methodes uit dezelfde klasse kunnen gebruikt worden in de
Byte Float Short Double Integer Character Long Boolean hebben geen standaard constructoren.
definitie van een constructor. Vooral aanroepen van set methodes komt veel voor.
public Class_Name(Parameters){ set(…); }
Om een object van een van deze klassen aan te maken, is een argument
nodig. Character myMark = new Character(‘Z’);
103
104
26
Information Hiding herbezocht
Information Hiding herbezocht: voorbeeld
Een klasse kan instantievariabelen hebben van gelijk welk type. Variabelen van een klasse type bevatten het geheugenadres van het
object waar de variabele naar verwijst. Elke verandering aan een instantievariable van een klasse type,
beïnvloedt alle andere referenties aan dat object.
105
Information Hiding herbezocht: voorbeeld
106
Information Hiding herbezocht: voorbeeld
107
108
27
Oplossing !
Packages: inhoud
Een eenvoudige oplossing is om enkel primitieve types te gebruiken als
instantievariabelen.
Packages en import Naamgeving en directories
Een betere oplossing is om bij het aanroepen van instantievariabelen een
exacte kopie terug te geven. Een referentie naar een kloon wordt teruggegeven in plaats van een referentie naar de echte variabele. Zie appendix 8 voor details.
109
Packages
110
Packages
Een package groepeert en benoemt een verzameling gerelateerde klassen
en kan dienen als een bibliotheek voor andere programma’s.
Aan het begin van een klasse die tot een package behoort vinden we
package <Package_Naam>; voorbeeld
De klassen worden gegroepeerd in een directory en krijgen een package
package general.utilities;
naam.
111
112
28
Directories
Directories
Directories worden ook wel mappen genoemd in besturingssystemen. De package vermelding aan het begin van een klasse reflecteert de
mapstructuur van die package Voorbeeld:
het bestand Foo.java bevind zich in de map /werktuigen/test/ als de package werktuigen heet, staat aan het begin van de klasse: package werktuigen.test;
113
De import declaratie
114
De import declaratie
Alle klassen van het java.lang package zijn automatisch in elk
Om een klasse uit een package te gebruiken,
Kan je de volledige naam gebruiken (fully qualified name)
programma geïmporteerd
java.util.Scanner
Kan je de klasse importeren
Alsof elk programma de volgende regel zou bevatten:
import java.util.Scanner;
import java.lang.*;
Kan je alle klassen van een package importeren Daarentegen behoort de klasse Scanner tot het java.util package
import java.util.*;
en moet daarom wel geïmporteerd worden
115
116
29
Samenvatting
Je leerde statische methodes en variabelen gebruiken Je leerde wat het verschil is tussen variabelen van een primitief type en
van een klasse type. Je leerde nieuwe technieken voor het ontwerpen van methodes (oa Top
Down design) gebruiken Je leerde constructor methodes definiëren en gebruiken Je leerde packages en import declaraties gebruiken
117
30