Beispiele für Ausdrücke Der imperative Kern Deklarationen mit Initialisierung Variablendeklarationen int i = 10; int j = 15; [<Sichtbarkeit>] [static] <Typ> <Name1> [= <Init1>] [ , <Name2> [= <Init2>], … ] Beispiele für Ausdrücke Beispiele: – – – – i+j i++ i & j i | j int i = 10; public static String Hello = “Hello World !“; boolean flag = true; int i, j=10,k, l=2*j; Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 62 63 Imperativer Kern - Kontrollstrukturen Der imperative Kern Blöcke Zuweisungen Sequenzen von Anweisungen und Deklarationen in <Variable> = <Ausdruck>; { … } Beispiele: Beispiel x = 1; y = 2; { int i = int j = } Zuweisungen sind auch Ausdrücke: x = y = 1; Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) entspricht x = (y = 1); Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 64 i = 10; 2*i; j; i+i; Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 65 Imperativer Kern - Kontrollstrukturen Imperativer Kern - Kontrollstrukturen Bedingte Anweisungen Endliche Fallunterscheidung (Switch) Sequenzen von Anweisungen und Deklarationen in switch (<Ausdruck>) { case c1 : <Anweisung1> . . . cn : <Anweisungn> [ default : <Anweisung> ] } if (<Bedingung>) { <Konsequenz> } [ else { <Alternative> } ] Beispiel Spezielle Anweisung: break; if ( a < b ) { x = a; } else { x = b;} Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 66 Imperativer Kern - Kontrollstrukturen Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 67 Imperativer Kern - Kontrollstrukturen Endliche Fallunterscheidung (Switch) Schleifen (while, do, for) Beispiel: while (<Bedingung>) { <Anweisungen> } int x = 2, j; switch (x) { case 1: j=10; case 2: j=20; case 3: { j=25; break; } case 4: j=0; default: j++; } Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) do { <Anweisungen> } while (<Bedingung>) for (<Init>; [<Bedingung>;] <Abschluss>) <Anweisungen> Beispiel for (i=0; i<10; i++) { x = x+i; } 68 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 69 Imperativer Kern Java als Programmiersprache Die Fakultät in Java public class Fakultaet { static int fac (int n) { if (n==0) return 1; else return n*fac(n-1); } Objektorientierung (Klassen, Objekte, Methoden, Vererbung) public static void main (String[] argv) { System.out.println ( fac(6) ); } } Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 70 Java als Programmiersprache Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 71 Klassen und Objekte Klassen sind Datentypen (zeigerreferenzierte Recordtypen) – entsprechen etwa zeigerreferenzierten Records in Modula 2 – legen die Struktur (Instanzvariablen, erlaubte Operationen) ihrer Instanzen (Objekte) fest – können Komponenten einer anderen Klasse erben – kapseln Funktionalität etwa durch Deklaration von Sichtbarkeiten Objektorientierung (Klassen, Objekte, Methoden, Vererbung) Kapselung (engl. encapsulation) Vererbung (engl. inheritance, Struktursicht, Typsicht) Nachrichtenaustausch (engl. message passing) Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) class Circle { float x, y, r; } 72 // Mittelpunkt (x,y) und Radius Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 73 Klassen und Objekte Objekte (Instanzen) Objekte sind Daten (zeigerreferenzierte Records) Objekte sind Daten (Instanzen einer Klasse) Speicher – entsprechen etwa zeigerreferenzierten Records in Modula 2 – werden i.a. dynamisch erzeugt (zur Laufzeit) new Circle(); – Haben eine Identität (Unterschied zu Tabellen in Datenbanken) class Circle { float x, y, r; } new Circle()erzeugt 0100 nocheinmal new Circle() // Mittelpunkt (x,y) und Radius r 0110 0100 Circle 0104 x = 0.0 0108 y = 0.0 010C r = 0.0 0110 Circle 0114 X = 0.0 0118 Y = 0.0 011C Z = 0.0 Circle c; c = new Circle(); // erzeugt ein Objekt der Klasse Circle // und weist es der Variablen c zu Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 74 Methoden Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 75 Methoden Methoden entsprechen Prozeduren / Funktionen – werden durch Nachrichten aufgerufen: Methodendeklarationen (in Klassen) [<Sichtbarkeit>] [static] <Typ> <Name> (<Parameter>) { <Rumpf>} objekt.methodenname(arg1, …, argn) entspricht Beispiel: methodenname(objekt, arg1, …, argn) public class Circle { … public double umfang () { return 2*3.14159 * this.r; } } – Methoden heissen auch (Objekt)Methoden – Statische Methoden (static) heissen auch Klassenmethoden – Das Empfängerobjekt einer Nachricht (objekt) wird im Rumpf der Methode als this bezeichnet Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 76 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 77 Objekterzeugung (Konstruktoren) Methodenaufruf (Nachricht) (Objekt-) Methoden – werden durch Nachrichten aufgerufen: Instanzen von Klassen (Objekte) werden durch Konstruktoraufrufe erzeugt, z.B. durch new Circle(2.0, 3.0, 1.0); – Beispiel: – Methoden, die keinen Resultattyp und denselben Namen haben wie die Klasse, sind Konstruktormethoden c.x = 2.0; c.y = 3.0; c.r = 1.0; – Beispiel: public Circle ( float x, y, r ) { this.x = x; this.y = y; this.r = r; } double x = c.umfang(); Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 78 79 Überladung Objekte (Instanzen) Objekte sind Daten (zeigerreferenzierte Records) In Java sind zwei Methoden verschieden, wenn sie • verschiedene Namen oder • gleiche Namen und verschiedene Signaturen haben, d.h. Anzahl, Reihenfolge oder Typen der Parameter verschieden sind Speicher new Circle(2.0,3.0,1.0)erzeugt 0100 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 0100 Circle 0104 float x = 2.0 0108 float y = 3.0 010C float r = 1.0 Beispiel: (hier: Konstruktormethoden): 0110 public Circle ( float r ) { this.x = 0.0; this.y = 0.0; this.r = r; } 0114 0118 011C Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) public Circle ( Circle c ) { this.x = c.x; this.y = c.y; this.r = c.r; } 80 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 81 Statische Komponenten Überladung In Java sind zwei Methoden gleich, wenn sie • den gleichen Namen und • die gleiche Signatur haben, d.h. Anzahl, Reihenfolge und Typen der Parameter gleich sind – Statische Methoden sind gewöhnliche Funktionen oder Prozeduren (Schlüsselwort static) – Statische Instanzvariablen sind globale Variablen. Sind sie zusätzlich final deklariert, wirken sie wie Konstanten Beispiel: (hier: Konstruktormethoden): – Beispiele: public static int fac ( int n ) { … } public double umfang () { return 2 * Math.PI * r; } public double umfang () { return Math.PI * ((r + s) * 3 / 2 - Math.sqrt(r * s)); Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) public final static double PI = 3.14159; 82 Statische Variablen (Beispiel) Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 83 Vererbung A public class Circle { class B extends A { … } static int num_circles = 0; float x,y,r; public Circle (float x, float y, float z) { this.x = x; this.y = y; this.r = z; num_circles++ // zählt Anzahl der Instanziierungen } – – – – public Circle () { this (0.0, 0.0, 1.0); } } B B erweitert (spezialisiert) A B heisst Subklasse von A, A heisst Superklasse von B Klasse B erbt alle Komponenten (Attribute, Methoden) von A jedes B ist auch ein A, B ist Subtyp von A Zugriff auf statische Variablen (Klassenvariablen): Circle.num_circles Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 84 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 85 Vererbung (Struktursicht, Typsicht) Vererbung (Typsicht, Typ-/Subtyp-Beziehung) A class B extends A { … } A class B extends A { … } B Struktursicht: B erbt alle Komponenten (Attribute, Methoden) von A – jedes B ist auch ein A, B ist Subtyp von A – überall dort, wo Instanzen des Typs A erwartet werden, dürfen auch Instanzen des Typs B auftauchen Typsicht: B ist Subtyp von A, jedes B ist auch ein A Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) B 86 Vererbung - Beispiel Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) Objekte (Instanzen), Vererbung von Attributen Objekte sind Daten (zeigerreferenzierte Records) Klasse GraphicsCircle erbt die Komponenten von Circle public class GraphicCircle extends Circle { Color fill, outline; Speicher new GraphicsCircle() erzeugt public void draw (Graphics g) { g.setColor(outline); g.drawOval(x-r, y-r, 2*r, 2*r); g.setColor(fill); g.fillOval(x-r, y-r, 2*r, 2*r); } } 87 0100 Die Methoden drawOval(…) und fillOval(…) in Java 1.5 erwarten Integer-Argumente (Anzahl Pixel) anstatt float. 0100 GraphicsCircle 0104 float x = 0.0 0108 float y = 0.0 010C float r = 0.0 0110 Color fill = 0114 Color outline = 0118 – Beteiligte Packages: 011C java.awt.Color, java.awt.Graphics Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 88 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 89 Vererbung – Überdecken von Attributen Objekte (Instanzen), Überdecken von Attributen Objekte sind Daten (zeigerreferenzierte Records) Klasse Circle erbt alle Komponenten von Ellipse public class Circle extends Ellipse { Speicher double r; new Circle()erzeugt public double umfang () { return 2 * Math.PI * r; } 0100 } 0100 Circle 0104 float x = 0.0 0108 float y = 0.0 010C float r = 0.0 0110 float r2 = 0.0 0114 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) double r = 0.0 0118 – Kreise haben sowohl ein double r als auch das float r aus Ellipse 011C 90 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 91