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); } } Formele parameter Lokale variabele
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 Object: van creatie object tot opruiming Afhankelijk van toegangsmethode Private: overal binnen klasse Standaard beginwaarde (type-afhankelijk) of bij declaratie 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 naam2 naam3 waarde1 waarde2 waarde3
Toestandsdiagram int a = 5; int b = 7; boolean c = false; a b c 5 7 false
Toestandsdiagram rekening = new GiroRekening("Kees",3456) rekening GiroRekening INLEGKADO 7.50 GiroRekening naam Kees saldo 7.50 gironummer 3456 Klassen: Waardetabel in rechthoek 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 1 noemer 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 Breuk teller 1 noemer 2 Aliassen: meerdere pijlen verwijzen naar hetzelfde object Breuk teller 1 noemer 2
Aliassen Breuk half1 = new Breuk(1,2); Breuk half2 = new Breuk(1,2); Breuk half3 = half1; half1.setteller(3); Als de toestand van een object wijzigt, wijzigt ook de toestand van de aliassen half1 half2 half3 Breuk teller 3 1X noemer 2 Breuk teller 1 noemer 2
Garbage collector half1 half2 half3 Breuk teller 1 noemer 2 Na de opdracht half2 = half1; Breuk teller 1 noemer 2 half1 half2 half3 wordt de situatie Breuk teller 1 noemer 2 Instantie waar geen pijl naar verwijst wordt t.z.t. opgeruimd Breuk teller 1 noemer 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 half1 == half3 false true half1 half2 half3 Breuk teller 1 noemer 2 vergelijken van referentiewaarde met behulp van == levert uitsluitend true op als het pijlen naar hetzelfde object zijn (aliassen) Breuk teller 1 noemer 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 3 noemer 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 Breuk teller 3 noemer 4
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 3 noemer 4 Breuk this teller 1 noemer 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; double d = i / (double)j; double d = 4.0/3; waarde d=1.3333 waarde d=1.3333 waarde d=1.3333