Objectgericht programmeren 1 joost.vennekens@kuleuven.be http://www.cs.kuleuven.be/~joost/dn
Objectgericht ontwerpen 35% Objectgericht ontwerpen 65% OP1 Informatiesystemen 50% Databanken 50% OP1
Evaluatie 40% permanente evaluatie practica 60% Examen 30% oefening Gesloten boek, schriftelijk Op PC, zoals in practica 30% theorie Gesloten boek, mondeling
Inhoud OOP Manier van denken over structuur van programma s In meer of mindere mate ondersteund door programmeertaal (C++, Python, ) In dit vak: Java
Java Strikte regels Sterk getypeerd Statisch getypeerd Onderscheid tussen ingebouwde en gebruikersgedefinieerde types Geen expliciet geheugenbeheer
Strikte regels Beperkingen Minder mogelijkheden Verbose en weinig elegant Hulpmiddelen Samenwerken Minder bugs, vooral @runtime
Waarom Java? Grote projecten
Vergelijking Python: Flexibel, snel te programmeren -> prototypes en kleine projecten C/C++: Volledige controle aan programmeur, alles kan en mag -> snelle programma s Java: OO toeters & bellen, strenge compiler -> bugs vermijden
... 99-bottles-of-beer.net
class Bottles { public static String tekst(int b) { if (b == 0) return "no more"; else return "" + b; public static void main(string[] args) { boolean firsttime = true; for (int beers = 99; beers >= 0; beers--) { if (firsttime) System.out.println(tekst(beers) + " bottle(s) of beer on the wall"); System.out.print("\n" + tekst(beers) + " bottle(s) of beer on the wall, "); System.out.println(tekst(beers) + " bottle(s) of beer"); if (beers > 0) System.out.print("take one down and pass it around, "); firsttime = false; System.out.println("go to the store, buy some more");
$ ls Bottles* Bottles.java $ javac Bottles.java $ ls Bottles* Bottles.class Bottles.java $ java Bottles 99 bottle(s) of beer on the wall, 99 bottle(s) of beer take one down and pass it around, 98 bottle(s) of beer on the wall 98 bottle(s) of beer on the wall, 98 bottle(s) of beer take one down and pass it around, 97 bottle(s) of beer on the wall... 2 bottle(s) of beer on the wall, 2 bottle(s) of beer take one down and pass it around, 1 bottle(s) of beer on the wall 1 bottle(s) of beer on the wall, 1 bottle(s) of beer take one down and pass it around, no more bottle(s) of beer on the wall no more bottle(s) of beer on the wall, no more bottle(s) of beer go to the store, buy some more $ Compileren Uit voeren
Datatypes // Geheel int geheelgetal; long longergetal; // Komma float drijvendekomma; double dubbeleprecisie; // Booleaanse waardes boolean waaroffout; // Tekst char letter; String stukjetekst; // Rijen int[] rij; int[][] matrix;
While lus while (test) {... public void printaf(int[] rij) { int i = 0; while (i < rij.length) { System.out.println(rij[i++]);
For lus for (initializatie; test; stap) {... public void printaf(int[] rij) { for (int i = 0; i < rij.length; i++) { System.out.println(rij[i]);
If-then-else if (test) {... else {... public boolean isleeg(int[] rij) { if (rij.length > 0) { return true; else { return false;
Kwis (1) public static void main(string[] args) { int i = 9; int j = i; while (--i > 7) { for (int k = 2; k < i; k *= 2) { j += k; if (i < j) j++; else j--; System.out.println(j);
Objectgeorienteerd
Object...... is een verzameling van gegevens die samen een geheel vormen Werknemer Naam Joost Vennekens Geboortedatum 27/09/1980......
Klasse Werknemer Naam Joost Vennekens Geboortedatum 27/09/1980 Zelfde structuur Werknemer Naam Herman Crauwels Geboortedatum ***
Klasse...... is een soort van object... is een verzameling van objecten met allemaal dezelfde structuur
class Werknemer { // Aantal dagen sinds 01/01/1900 int geboortedatum; String naam; Attribuut public static void main(string[] arg) { // Een klasse kan gebruikt worden als datatype Werknemer joost = new Werknemer(); joost.naam = "Joost Vennekens"; joost.geboortedatum = 365*80+5*31+2*30+28+20;
class Datum { int dag; int maand; int jaar; class Werknemer { Datum geboortedatum; String naam; // String is ook gewoon een klasse, trouwens public static void main(string[] arg) { Werknemer joost = new Werknemer(); Datum d = new Datum(); d.dag = 27; d.maand = 9; d.jaar = 1980; joost.naam = "Joost Vennekens"; joost.geboortedatum = d;
Werknemer Naam Geboortedatum Naam Geboortedatum String Joost Vennekens Herman Crauwels Datum Dag 27 Maand 9 Jaar 1980 Dag ** Maand ** Jaar ****
Object = Gegevens + Gedrag
Vb:twee soorten datums class SindsDatum { int sindseenjanuari1980; public static SindsDatum eendagvroeger(sindsdatum vandaag) { SindsDatum gisteren = new SindsDatum(); gisteren.sindseenjanuari1980 = vandaag.sindseenjanuari1980-1; return gisteren; SindsDatum x = new SindsDatum(); x.sindseenjanuari1980 = 5*31+2*30+28+27; SindsDatum y = eendagvroeger(x);
Andere voorstelling class DMJDatum { int dag; int maand; int jaar;
public static DMJDatum eendagvroeger(dmjdatum vandaag) { DMJDatum gisteren = new DMJDatum(); if (vandaag.dag > 1) { // Niet de 1e van de maand gisteren.dag = vandaag.dag - 1; gisteren.maand = vandaag.maand; gisteren.jaar = vandaag.jaar; else { if (vandaag.maand > 1) { // 1e dag van maand gisteren.maand = vandaag.maand - 1; gisteren.jaar = vandaag.jaar; gisteren.dag = laatstedag(gisteren.maand, gisteren.jaar); else { // Nieuwjaar gisteren.maand = 12; gisteren.jaar = vandaag.jaar - 1; gisteren.dag = 31; return gisteren;
Conclusie Hoe gedrag geimplementeerd moet worden Hangt onafscheidelijk samen met hoe gegevens worden voorgesteld Dus: gedrag en gegevens horen samen
Object = Gegevens + Gedrag
Daarnet: class SindsDatum { int sindseenjanuari1980; public static SindsDatum eendagvroeger(sindsdatum vandaag) { SindsDatum gisteren = new SindsDatum(); gisteren.sindseenjanuari1980 = vandaag.sindseenjanuari1980-1; return gisteren; SindsDatum x = new SindsDatum(); x.sindseenjanuari1980 = 5*31+2*30+28+27; SindsDatum y = eendagvroeger(x);
class SindsDatum { int sindseenjanuari1980; Object wordt impliciet meegegeven this.sindseenjanuari1980 public SindsDatum eendagvroeger() { SindsDatum gisteren = new SindsDatum(); gisteren.sindseenjanuari1980 = sindseenjanuari1980-1; return gisteren; SindsDatum x = new SindsDatum(); x.sindseenjanuari1980 = 5*31+2*30+28+27; SindsDatum y = x.eendagvroeger();
class DMJDatum { int dag; int maand; int jaar; public DMJDatum eendagvroeger() {... DMJDatum x = new DMJDatum(); x.sindseenjanuari1980 = 365*80+5*31+2*30+28+20; DMJDatum y = x.eendagvroeger(); Juiste methode
Voordeel: Encapsulatie
class Datum {??? Datum x = new Datum(); x.vulin(27, 9, 1980); Datum y = x.eendagvroeger(); public void vulin(int dag, int maand, int jaar) {... public Datum eendagvroeger() {...
Ondersteuning voor encapsulatie Toegansniveaus private: voor niemand niets: voor klassen uit zelfde pakket protected: voor subklassen of uit hetzelfde pakket public: voor iedereen
class Datum { private int sindseenjanuari1980; public void vulin(int dag, int maand, int jaar) {... public Datum eendagvroeger() {... Datum x = new Datum(); x.vulin(27, 9, 1980); Datum y = x.eendagvroeger();
Constructors Object ook initializeren bij het aanmaken Niet meer Datum d = new Datum(); d.vulin(27,09,1980); maar: Datum d = new Datum(27,09,1980);
class Datum { public Datum () { dag = 1; maand = 1; jaar = 1980; public Datum(int d, int m, int j) { dag = d; maand = m; jaar = j; private int dag; private int maand; private int jaar; Datum d1 = new Datum(27,09,1980); Datum d2 = new Datum();
Constructor Als er geen constructors zijn, verzint de compiler er een zonder argumenten Andere constructor aanroepen: public class Werknemer { private int ancieniteit; private String naam; private Datum geboortedatum; public Werknemer() { ancieniteit = 1; public Werknemer(String n) { this (); naam = n; public Werknemer(String n, Datum g) { this (n); geboortedatum = g; public int getancieniteit() { return ancienieit; public void setancieniteit(int a) { ancienieit = a;
Vb: complexe getallen Complex getal: reeel en imaginair deel c = a + bi Optellen: (a+bi) + (a +b i) = a+a + (b+b )i Polaire voorstelling: magnitude r en argument φ a = r cos φ en b = r sin φ
public class ComplexGetal { /** Complex getal: reeel + imaginair * i **/ private double reeel; private double imaginair; public ComplexGetal(double r, double i) { reeel = r; imaginair = i; public double getreeel() { return reeel; public double getimaginair() { return imaginair; public ComplexGetal plus(complexgetal ander) { return new ComplexGetal(ander.getReeel() + getreeel(), ander.getimaginair() + getimaginair());
public class ComplexGetal { private double magnitude; private double argument; public ComplexGetal(double r, double i) { magnitude = Math.sqrt(Math.pow(r,2) + Math.pow(i, 2)); argument = Math.atan(i / r); public double getreeel() { return magnitude * Math.cos(argument); public double getimaginair() { return magnitude * Math.sin(argument); public ComplexGetal plus(complexgetal ander) { return new ComplexGetal(ander.getReeel() + getreeel(), ander.getimaginair() + getimaginair());
Statische methodes Methodes die bij een klasse horen ipv. bij een object public class Docent { public static Docent rector() { return new Docent( Rik Torfs"); private String naam; public Docent(String n) { naam = n; Docent.rector();
Statische attributen Attributen die bij een klasse horen ipv. bij een object public class Docent { public static Docent rector = new Docent( Rik Torfs"); Docent.rector;
Voorbeelden van static public static void main(string[] args) {... System.out.println(...); public class System { public static PrintWriter out;... Math.sqrt(49);