Objectgeoriënteerd programmeren in Java 1

advertisement
Objectgeoriënteerd programmeren in Java 1
CPP Javaprogrammeur
Bijeenkomst 3
Leereenheden 7, 8, 9
De Java API
―
Java bevat een grote bibliotheek standaardklassen: de Java API
―
Voorbeelden
–
java.lang basisklassen (o.a. String)
–
javax.swing
userinterfaceklassen
–
Java.awt
userinterfaceklassen/eventhandling
–
java.util
veelgebruikte hulpklassen
De Java API
―
Demo
―
Te vinden op
–
http://download.oracle.com/javase/6/docs/api/
–
Op studienet informatie om api lokaal te installeren
Eclipse
―
Ook mogelijk: Shift F2:
–
Geeft API van klasse onder cursor
Klasse Math
(java.lang)
―
Klasse met alleen klassenattributen (constanten) en
klassenmethoden
―
Interface:
public static final double PI
public static double sin(double a)
public static double pow(double a, double b)
―
Gebruik:
double opp = Math.PI * straal * straal;
double resultaat = Math.sin(45.0);
double macht = Math.pow(3.0, 4.0);
Verpakkingsklassen
(java.lang)
―
Met behulp van een verpakkingsklasse kunnen we een primitief
type converteren naar een referentietype
―
Collection klassen in Java (b.v. ArrayList) vereisen objecten
―
Voorbeelden verpakkingsklassen:
―
–
Integer
–
Double
–
Boolean
Verpakkingsklassen bevatten ook methoden voor
stringconversies
Voorbeeld
Integers toevoegen en halen uit ArrayList
public void test () {
ArrayList<Integer> gLijst = new ArrayList<Integer>();
gLijst.add(new Integer(11));
gLijst.add(new Integer(2));
gLijst.add(new Integer(333));
int g = gLijst.get(2).intValue();
}
Auto(un)boxing
public void test1() {
ArrayList<Integer> gLijst = new ArrayList<Integer>();
gLijst.add(11);
gLijst.add(2);
gLijst.add(333);
Autoboxing
int g = gLijst.get(2);
}
Autounboxing
Geheugenmodel Java
―
Hiermee kunnen we de volgende soort vragen beantwoorden
–
Hoeveel rekeningen zijn er na
Rekening r1, r2;
r1 = new Rekening("Jansen", 7890);
r2 = r1;
–
Zijn r1 en r2 gelijk na
Rekening r1 = new Rekening("Jansen", 7890);
Rekening r2 = new Rekening("Jansen", 7890);
Variabelen
―
Variabele
–
heeft een (zelfgekozen) naam
–
heeft een locatie, locatie bevat een waarde
–
heeft een type:
–
―
primitief
―
referentie
is van een soort
―
attribuut
―
lokale variabele in een methode
―
formele parameter van een methode
Soorten variabelen
Attribuut
public class Rekening {
private double saldo = 0;
private int kredietLimiet = 0;
...
public boolean kanOpnemen(double bedrag) {
double ruimte = saldo + kredietlimiet;
return (ruimte >= bedrag);
}
}
Lokale
variabele
Formele
parameter
Variabelen
―
Zichtbaarheid:
–
―
Deel van de code waar variabele gerefereerd kan worden
(statisch)
Levensduur:
–
Periode gedurende uitvoer van programma waarin variabele
bestaat (dynamisch)
Variabelen
Soort
Levensduur
Zichtbaarheid (scope)
Initialisatie
Attribuut
Klasse: permanent
Afhankelijk van
toegangsmethode
Standaard beginwaarde
(type-afhankelijk) of bij
declaratie
Object: van creatie object tot
opruiming
Private: overal binnen klasse
Public: overal in programma
Formele
parameter
Gedurende methode- of
constructor-uitvoering
Romp van methode of
constructor
Bij aanroep door
toekenning van (de
waarde van) actuele
parameters
Lokale
variabele
Van declaratie variabele tot
einde blok waarin variabele
is gedeclareerd
Van declaratie variabele tot
einde blok waarin variabele is
gedeclareerd
Bij declaratie of later in
blok door
toekenningsopdracht
Toestandsdiagram / geheugenmodel
―
Waardetabel
–
Momentopname van variabelen
–
Bevat namen en waarden die op een bepaald moment in
betreffende locaties zijn opgeslagen
–
Geen UML
naam1
waarde1
naam2
waarde2
naam3
waarde3
Toestandsdiagram
int a = 5;
int b = 7;
boolean c = false;
a
5
b
7
c
false
Toestandsdiagram
rekening = new GiroRekening("Kees",3456)
Klassen:
Waardetabel in rechthoek
GiroRekening
INLEGKADO
7.50
GiroRekening
rekening
naam
Kees
saldo
7.50
gironummer
3456
Objecten:
Waardetabel in rechthoek
met afgeronde hoeken
Referentiewaarden
Breuk half = new Breuk(1,2);
Breuk b1 = null;
Breuk b2;
Referentiewaarden
zijn pijlen
half
b1
b2
null
??
Breuk
teller
noemer
1
2
Sleutelwoord null
duidt op ontbreken van pijl
Aliassen
Breuk half1 = new Breuk(1,2);
Breuk half2 = new Breuk(1,2);
Breuk half3 = half1;
half1
half2
half3
Aliassen: meerdere pijlen
verwijzen naar hetzelfde object
Breuk
teller
noemer
1
2
Breuk
teller
noemer
1
2
Aliassen
Breuk half1 = new Breuk(1,2);
Breuk half2 = new Breuk(1,2);
Breuk half3 = half1;
half1.setTeller(3);
half1
half2
half3
Als de toestand
van een object wijzigt,
wijzigt ook de toestand van de
aliassen
Breuk
teller
3 1X
noemer
2
Breuk
teller
noemer
1
2
Garbage collector
half1
half2
half3
Breuk
teller
noemer
Breuk
teller
noemer
1
2
Na de opdracht
half2 = half1;
wordt de situatie
1
2
half1
half2
half3
Instantie waar geen pijl naar verwijst
wordt t.z.t. opgeruimd
Breuk
teller
noemer
1
2
Breuk
teller
noemer
1
2
Testen op gelijkheid
―
Bij primitieve typen: == test of waarden gelijk zijn
if (a == 5) { …
―
Bij referentietypen: == test of verwezen wordt naar hetzelfde
object (zijn het aliassen?)
Vergelijken referentiewaarden
Wat is de waarden van de volgende expessies?
half1 == half2
false
half1 == half3
true
half1
half2
half3
vergelijken van referentiewaarde
met behulp van == levert uitsluitend true op
als het pijlen naar hetzelfde object zijn (aliassen)
Breuk
teller
noemer
1
2
Breuk
teller
noemer
1
2
Vergelijken inhoud objecten
―
Maak zelf vergelijkingsmethode (in klasse Breuk)
public boolean isGelijk(Breuk b) {
return teller == b.teller && noemer == b.noemer;
}
―
Vergelijking
boolean gelijk = half1.isGelijk(half2);
Alias of kopie
public Breuk kloon() {
return new Breuk(teller, noemer);
}
methode kloon
maakt kopie
b1
b2
b3
Breuk
teller
noemer
3
4
Breuk
teller
noemer
3
4
Breuk b1 = new Breuk(3, 4);
Breuk b2 = b1.kloon();
Breuk b3 = b1;
toekenning
referentiewaarde
creëert alias
Kopie is een verwijzing naar een
nieuw object met gelijke
attribuutwaarden als origineel
Pseudovariabele this
―
Iedere klasse heeft een extra attribuut beschikbaar: this
―
Voor een gegeven object is this een referentie naar zichzelf
b1
b2
Breuk
this
teller
noemer
3
4
Breuk
this
teller
noemer
1
2
Voorbeeld gebruik van this
―
Een attribuut is tijdelijk onzichtbaar in een methode waar een
formele parameter dezelfde naam heeft als attribuut.
―
this maakt attribuut toegankelijk
public class Rekening {
private double saldo;
public void setSaldo(double saldo) {
this.saldo = saldo;
}
}
Blok
―
Een blok is als volgt opgebouwd
{
opdrachten
}
―
Lokale variabelen gedeclareerd binnen blok, zijn alleen binnen
blok zichtbaar
Toekenningsopdracht
variabele = expressie;
―
Expressie wordt uitgerekend en toegekend aan variabele
―
Type van expressie moet in principe gelijk zijn aan type van
variabele
–
Soms omzetting van types mogelijk
―
Automatisch: coërcie
―
Gedwongen: cast
Type conversie
―
Veilige conversies (widening)
–
Automatisch toegepast (coërcie)
–
byte  short  int  long  float  double
double a = 5;
―
Riskante conversies (narrowing)
–
Expliciete typeconversie (casting) nodig
–
Vorm: (typenaam)expressie
int pi = (int)3.1415;
Expressies: deling of heling?
int i = 4, j = 3;
double d = i / j;
waarde d=1
double d = (double)i / j;
waarde d=1.3333
double d = i / (double)j;
waarde d=1.3333
double d = 4.0/3;
waarde d=1.3333
Download