Modelleren en Programmeren Jeroen Bransen 6 december 2013
Terugblik
Programma en geheugen Opdrachten Variabelen Methoden Objecten Klasse
Programma en geheugen Opdrachten Variabelen zijn gegroepeerd in Methoden Objecten Klasse
Programma en geheugen Opdrachten Variabelen zijn gegroepeerd in Methoden Objecten zijn gegroepeerd in Klasse
Programma en geheugen Opdrachten Methoden zijn gegroepeerd in Variabelen Objecten zijn gegroepeerd in zijn gegroepeerd in Klasse
Programma en geheugen Opdrachten Methoden zijn gegroepeerd in Variabelen Objecten zijn gegroepeerd in zijn gegroepeerd in hebben als type Klasse
Programma en geheugen Opdrachten veranderen Variabelen Methoden zijn gegroepeerd in Objecten zijn gegroepeerd in zijn gegroepeerd in hebben als type Klasse
Programma en geheugen Opdrachten veranderen Variabelen zijn gegroepeerd in zijn gegroepeerd in Methoden bewerken Objecten zijn gegroepeerd in hebben als type Klasse
Constructor Constructor bevat stukje code dat uitgevoerd wordt bij creatie van object
Constructor Constructor bevat stukje code dat uitgevoerd wordt bij creatie van object Wordt gebruikt om object te initialiseren
Constructor Constructor bevat stukje code dat uitgevoerd wordt bij creatie van object Wordt gebruikt om object te initialiseren Java maakt standaard een constructor die alle variabelen op 0 (standaardwaarde) zet
Constructor Constructor bevat stukje code dat uitgevoerd wordt bij creatie van object Wordt gebruikt om object te initialiseren Java maakt standaard een constructor die alle variabelen op 0 (standaardwaarde) zet Constructor is vergelijkbaar met methode, maar moet dezelfde naam als klasse hebben en heeft geen resultaat
Constructor Constructor bevat stukje code dat uitgevoerd wordt bij creatie van object Wordt gebruikt om object te initialiseren Java maakt standaard een constructor die alle variabelen op 0 (standaardwaarde) zet Constructor is vergelijkbaar met methode, maar moet dezelfde naam als klasse hebben en heeft geen resultaat Net als een methode mag een constructor parameters hebben
Constructor Constructor bevat stukje code dat uitgevoerd wordt bij creatie van object Wordt gebruikt om object te initialiseren Java maakt standaard een constructor die alle variabelen op 0 (standaardwaarde) zet Constructor is vergelijkbaar met methode, maar moet dezelfde naam als klasse hebben en heeft geen resultaat Net als een methode mag een constructor parameters hebben Kan dus gebruikt worden om waarden voor variabelen mee te geven
this keyword De variabele this is een speciale variabele die naar het huidige object wijst
this keyword De variabele this is een speciale variabele die naar het huidige object wijst Wordt vaak gebruikt in constructor of methode verschil te maken tussen variabelen met dezelfde naam
this keyword De variabele this is een speciale variabele die naar het huidige object wijst Wordt vaak gebruikt in constructor of methode verschil te maken tussen variabelen met dezelfde naam Kan ook gebruikt worden om methoden aan te roepen of om als argument mee te geven
Object constructor public class Persoon { String naam; int leeftijd; int lengte; public Persoon(String naam, int leeftijd, int lengte) { this.naam = naam; this.leeftijd = leeftijd; this.lengte = lengte; // Als iemand jarig is wordt hij 1 jaar ouder public void vierverjaardag() { leeftijd++;
Gebruik van object public class PersoonMain { public static void main(string[] args) { // Maak de personen aan Persoon[] personen = { new Persoon("Sinterklaas", 417, 181), new Persoon("Cornelis", 22, 176), new Persoon("Marleen", 19, 170) ; // Iemand is jarig vandaag personen[0].vierverjaardag(); // Print leeftijden uit for(int i = 0; i < personen.length; i++) { System.out.println(personen[i].naam + " is " + personen[i].leeftijd + " jaar");
Call-by-reference en call-by-value
Wat print dit programma? public class CallBy { public static void main(string[] args) { // Variabele i met waarde 2 int i = 2; // Hoog i 1 op add1(i); // Print op scherm System.out.println(i); public static void add1(int i) { i++;
Call-by-value Een parameter is een losse variabele, die alleen bestaat binnen die methode
Call-by-value Een parameter is een losse variabele, die alleen bestaat binnen die methode Bij aanroep wordt de waarde (value) in die variabele opgeslagen
Call-by-value Een parameter is een losse variabele, die alleen bestaat binnen die methode Bij aanroep wordt de waarde (value) in die variabele opgeslagen Wijzigen van de parameter heeft dus geen effect buiten de functie
Call-by-value Een parameter is een losse variabele, die alleen bestaat binnen die methode Bij aanroep wordt de waarde (value) in die variabele opgeslagen Wijzigen van de parameter heeft dus geen effect buiten de functie Dit noemen we call-by-value en wordt in Java voor simpele typen gebruikt
Wat print dit programma? public class CallBy { public static void main(string[] args) { int[] i = new int[1]; i[0] = 2; add1(i); System.out.println(i[0]); public static void add1(int[] i) { i[0]++;
Call-by-reference Een array of object wordt in een variabele opgeslagen als verwijzing
Call-by-reference Een array of object wordt in een variabele opgeslagen als verwijzing Bij aanroep wordt de verwijzingen (reference) opgeslagen in de parameter
Call-by-reference Een array of object wordt in een variabele opgeslagen als verwijzing Bij aanroep wordt de verwijzingen (reference) opgeslagen in de parameter Wijzigen van object/array waar parameter naar verwijst heeft dus wel effect buiten de functie
Call-by-reference Een array of object wordt in een variabele opgeslagen als verwijzing Bij aanroep wordt de verwijzingen (reference) opgeslagen in de parameter Wijzigen van object/array waar parameter naar verwijst heeft dus wel effect buiten de functie Dit noemen we call-by-reference en wordt in Java voor objecten en arrays gebruikt
Call-by-reference Een array of object wordt in een variabele opgeslagen als verwijzing Bij aanroep wordt de verwijzingen (reference) opgeslagen in de parameter Wijzigen van object/array waar parameter naar verwijst heeft dus wel effect buiten de functie Dit noemen we call-by-reference en wordt in Java voor objecten en arrays gebruikt Maar: de verwijzing zelf aanpassenheeft dan weer geen effect (voorbeeld op volgende slide)
Call-by overzicht public class CallBy { public static void main(string[] args) { int i = 2; int[] j = { 2 ; int[] k = { 2 ; Persoon p = new Persoon("Sinterklaas", 417, 181); add1(i, j, k, p); System.out.println(i); // Print 2 System.out.println(j[0]); // Print 3 System.out.println(k[0]); // Print 2 System.out.println(p.leeftijd); // Print 418 static void add1(int a, int[] b, int[] c, Persoon p) { a++; // heeft geen effect b[0]++; // heeft wel effect c = new int[1]; c[0]++; // heeft geen effect p.leeftijd++; // heeft wel effect
Objecten en geheugen
Variabelen in geheugen Primitieve waarden:
Variabelen in geheugen Primitieve waarden: Arrays:
Variabelen in geheugen Primitieve waarden: Arrays: Objecten:
De lege verwijzing Een variabele met array/object type verwijst naar ander stuk geheugen
De lege verwijzing Een variabele met array/object type verwijst naar ander stuk geheugen Dat andere stuk geheugen wordt met new gemaakt
De lege verwijzing Een variabele met array/object type verwijst naar ander stuk geheugen Dat andere stuk geheugen wordt met new gemaakt Maar wat nou als we nog geen new hebben gebruikt?
De lege verwijzing Een variabele met array/object type verwijst naar ander stuk geheugen Dat andere stuk geheugen wordt met new gemaakt Maar wat nou als we nog geen new hebben gebruikt? Een verwijzing naar niks is null
De lege verwijzing Een variabele met array/object type verwijst naar ander stuk geheugen Dat andere stuk geheugen wordt met new gemaakt Maar wat nou als we nog geen new hebben gebruikt? Een verwijzing naar niks is null We kunnen null gebruiken om te controleren of er een verwijzing is
Voorbeeld met null public class NullPointer { Persoon p; // Hier nog andere code public void printleeftijd() { System.out.println(p.naam + " is " + p.leeftijd); // In een ander bestand: public class NullPointerMain { public static void main(string[] args) { NullPointer np = new NullPointer(); np.printleeftijd();
Voorbeeld met null public class NullPointer { Persoon p; // Hier nog andere code public void printleeftijd() { if(p == null) System.out.println("Persoon is niet aangemaakt"); else System.out.println(p.naam + " is " + p.leeftijd); // In een ander bestand: public class NullPointerMain { public static void main(string[] args) { NullPointer np = new NullPointer(); np.printleeftijd();
Gelijkheid van objecten
Nog een klein puzzeltje public class ObjectEquality { public static void main(string[] args) { String a = "a"; String b = "b"; String x = a + b; String y = a + b; System.out.println(x == y);
Gelijkheid van objecten Strings zijn ook objecten
Gelijkheid van objecten Strings zijn ook objecten Met == controleren we of variabelen dezelfde waarde hebben
Gelijkheid van objecten Strings zijn ook objecten Met == controleren we of variabelen dezelfde waarde hebben Maar bij objecten is de waarde de verwijzing
Gelijkheid van objecten Strings zijn ook objecten Met == controleren we of variabelen dezelfde waarde hebben Maar bij objecten is de waarde de verwijzing Dus == controleert of de variabelen naar hetzelfde object verwijzen
Gelijkheid van objecten Strings zijn ook objecten Met == controleren we of variabelen dezelfde waarde hebben Maar bij objecten is de waarde de verwijzing Dus == controleert of de variabelen naar hetzelfde object verwijzen x en y zijn niet hetzelfde object!
Gelijkheid van objecten Strings zijn ook objecten Met == controleren we of variabelen dezelfde waarde hebben Maar bij objecten is de waarde de verwijzing Dus == controleert of de variabelen naar hetzelfde object verwijzen x en y zijn niet hetzelfde object! Ze representeren alleen dezelfde string
Correcte versie public class ObjectEquality { public static void main(string[] args) { String a = "a"; String b = "b"; String x = a + b; String y = a + b; System.out.println(x.equals(y)); // dit print true
Meer controlestructuren
Break Keyword break breekt een for of while meteen af
Break Keyword break breekt een for of while meteen af Bijvoorbeeld: public class Break { public static void main(string[] args) { // Dit print 0, 1, 2 en 3 (elk op een regel) for(int i = 0; i < 10; i++) { if(i == 4) break; System.out.println(i);
Continue Keyword continue gaat naar de volgende iteratie van een for of while
Continue Keyword continue gaat naar de volgende iteratie van een for of while Bij een for wordt de teller zoals altijd opgehoogd
Continue Keyword continue gaat naar de volgende iteratie van een for of while Bij een for wordt de teller zoals altijd opgehoogd Kan ook voor het afbreken van de herhaling zorgen als expressie onwaar wordt
Continue Keyword continue gaat naar de volgende iteratie van een for of while Bij een for wordt de teller zoals altijd opgehoogd Kan ook voor het afbreken van de herhaling zorgen als expressie onwaar wordt Bijvoorbeeld: public class Continue { public static void main(string[] args) { // Dit print 0, 1, 2, 3, 5, 6, 7, 8 en 9 for(int i = 0; i < 10; i++) { if(i == 4) continue; System.out.println(i);
Object als String printen Dit doet niet wat we willen: Persoon p = new Persoon("Sinterklaas", 417, 181); System.out.println("p = " + p);
Object als String printen Dit doet niet wat we willen: Persoon p = new Persoon("Sinterklaas", 417, 181); System.out.println("p = " + p); Bij het omzetten naar een String wordt de tostring methode aangeroepen
Object als String printen Dit doet niet wat we willen: Persoon p = new Persoon("Sinterklaas", 417, 181); System.out.println("p = " + p); Bij het omzetten naar een String wordt de tostring methode aangeroepen Voor onze eigen klasse kunnen we die zelf implementeren
Object als String printen Dit doet niet wat we willen: Persoon p = new Persoon("Sinterklaas", 417, 181); System.out.println("p = " + p); Bij het omzetten naar een String wordt de tostring methode aangeroepen Voor onze eigen klasse kunnen we die zelf implementeren En dan dus zelf kiezen wat we zien, in plaats van de standaard implementatie
Object als String printen public class Persoon { String naam; int leeftijd; int lengte; public Persoon(String naam, int leeftijd, int lengte) { this.naam = naam; this.leeftijd = leeftijd; this.lengte = lengte; public String tostring() { return naam + " (" + leeftijd + ")";
Recursie
Recursie Om recursie te begrijpen, moet je eerst recursie begrijpen
Recursie Om recursie te begrijpen, moet je eerst recursie begrijpen Recursieve functie roept zichzelf aan
Recursie Om recursie te begrijpen, moet je eerst recursie begrijpen Recursieve functie roept zichzelf aan Minstens 1 parameter moet kleiner worden
Recursie Om recursie te begrijpen, moet je eerst recursie begrijpen Recursieve functie roept zichzelf aan Minstens 1 parameter moet kleiner worden Herhalingsconstructies (for, while) kunnen ook recursief worden beschreven
Factorial voorbeeld // A simple example of recursion. public class Factorial { // This is a recursive function. public static int factr(int n) { int result; if(n==1) return 1; result = factr(n-1) * n; return result; // This is an iterative equivalent. public static int facti(int n) { int t, result; result = 1; for(t=1; t <= n; t++) result *= t; return result;
Mutuele recursie
Mutuele recursie Twee (of meerdere) functies die elkaar aanroepen
Mutuele recursie Twee (of meerdere) functies die elkaar aanroepen Functies roepen indirect zichzelf aan
Mutuele recursie Twee (of meerdere) functies die elkaar aanroepen Functies roepen indirect zichzelf aan Ook hier moet er een parameter kleiner worden om oneindige recursie tegen te gaan
Even en oneven voorbeeld // Mutuele recursie voorbeeld public class MutualRecursion { public static boolean even(int x) { if(x == 0) return true; return oneven(x-1); public static boolean oneven(int x) { if(x == 0) return false; return even(x-1); public static void main(string[] args) { System.out.println("7 is even: " + even(7));