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