Beispiele für Ausdrücke Der imperative Kern Deklarationen mit Initialisierung Variablendeklarationen int i = 10; int j = 15; Beispiele für Ausdrücke i+j i++ i & j i j [<Sichtbarkeit>] [static] <Typ> <Name 1 > [= <Init 1 >] [, <Name 2 > [= <Init 2 >], ] Beispiele: int i = 10; public static String Hello = Hello World! ; boolean flag = true; int i, j=10,k, l=2*j; 62 63 Der imperative Kern Imperativer Kern - Kontrollstrukturen Zuweisungen Blöcke <Variable> = <Ausdruck>; Sequenzen von Anweisungen und Deklarationen in Beispiele: { x = 1; y = 2; Zuweisungen sind auch Ausdrücke: x = y = 1; entspricht x = (y = 1); Beispiel { int i = 10; i = 2*i; int j; j = i+i; 64 65
Imperativer Kern - Kontrollstrukturen Imperativer Kern - Kontrollstrukturen Bedingte Anweisungen Endliche Fallunterscheidung (Switch) Sequenzen von Anweisungen und Deklarationen in if (<Bedingung>) { <Konsequenz> [ else { <Alternative> ] Beispiel switch (<Ausdruck>) { case c 1 : <Anweisung 1 >... c n : <Anweisung n > [ default : <Anweisung> ] if ( a < b ) { x = a; else { x = b; Spezielle Anweisung: break; 66 67 Imperativer Kern - Kontrollstrukturen Imperativer Kern - Kontrollstrukturen Endliche Fallunterscheidung (Switch) Beispiel: 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++; Schleifen (while, do, for) while (<Bedingung>) { <Anweisungen> do { <Anweisungen> while (<Bedingung>) for (<Init>; [<Bedingung>;] <Abschluss>) <Anweisungen> Beispiel for (i=0; i<10; i++) { x = x+i; 68 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) ); 70 71 Java als Programmiersprache Klassen und Objekte Klassen sind Datentypen(zeigerreferenzierte Recordtypen) Objektorientierung (Klassen, Objekte, Methoden, Vererbung) Kapselung(engl. encapsulation) Vererbung(engl. inheritance, Struktursicht, Typsicht) Nachrichtenaustausch(engl. message passing) 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 class Circle { float x, y, r; // Mittelpunkt (x,y) und Radius 72 73
Klassen und Objekte Objekte (Instanzen) Objekte sind Daten(Instanzen einer Klasse) Objekte sind Daten(zeigerreferenzierte Records) 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) new Circle()erzeugt 0104 0108 Circle x = 0.0 y = 0.0 class Circle { float x, y, r; // Mittelpunkt (x,y) und Radius r nocheinmal new Circle() 010C 0114 0118 r = 0.0 Circle X = 0.0 Y = 0.0 Circle c; c = new Circle(); // erzeugt ein Objekt der Klasse Circle // und weist es der Variablen c zu 011C Z = 0.0 74 75 Methoden Methoden Methoden entsprechen Prozeduren / Funktionen werden durch Nachrichten aufgerufen: Methodendeklarationen (in Klassen) objekt.methodenname(arg 1,, arg n ) [<Sichtbarkeit>] [static] <Typ> <Name> (<Parameter>) { <Rumpf> entspricht methodenname(objekt, arg 1,, arg n ) Methoden heissen auch (Objekt)Methoden Statische Methoden (static) heissen auch Klassenmethoden Beispiel: public class Circle { public double umfang () { return 2*3.14159 * this.r; Das Empfängerobjekt einer Nachricht (objekt) wird im Rumpf der Methode als this bezeichnet 76 77
Methodenaufruf (Nachricht) Objekterzeugung (Konstruktoren) (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: c.x = 2.0; c.y = 3.0; c.r = 1.0; double x = c.umfang(); Methoden, die keinen Resultattyp und denselben Namen haben wie die Klasse, sind Konstruktormethoden Beispiel: public Circle ( float x, y, r ) { this.x = x; this.y = y; this.r = r; 78 79 Objekte (Instanzen) Überladung Objekte sind Daten(zeigerreferenzierte Records) Speicher new Circle(2.0,3.0,1.0)erzeugt 0104 Circle float x = 2.0 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 0108 010C float y = 3.0 float r = 1.0 Beispiel: (hier: Konstruktormethoden): 0114 0118 public Circle ( float r ) { this.x = 0.0; this.y = 0.0; this.r = r; 011C public Circle ( Circle c ) { this.x = c.x; this.y = c.y; this.r = c.r; 80 81
Überladung Statische Komponenten 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 Instanzvariablensind globale Variablen. Sind sie zusätzlich final deklariert, wirken sie wie Konstanten Beispiel: (hier: Konstruktormethoden): Beispiele: public double umfang () { return 2 * Math.PI * r; public double umfang () { return Math.PI * ((r + s) * 3 / 2 - Math.sqrt(r * s)); public static int fac ( int n ) { public final static double PI = 3.14159; 82 83 Statische Variablen (Beispiel) Vererbung public class Circle { 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); Zugriff auf statische Variablen (Klassenvariablen): class B extends A { B erweitert(spezialisiert) A B heisstsubklassevon A, A heisstsuperklassevon B Klasse B erbt alle Komponenten (Attribute, Methoden) von A jedes B ist auch ein A, B ist Subtypvon A B Circle.num_circles 84 85
Vererbung (Struktursicht, Typsicht) Vererbung (Typsicht, Typ-/Subtyp-Beziehung) A A class B extends A { B class B extends A { B Struktursicht: B erbt alle Komponenten (Attribute, Methoden) von A Typsicht: B ist Subtypvon A, jedes B ist auch ein A jedes B ist auch ein A, B ist Subtypvon A überall dort, wo Instanzen des TypsA erwartet werden, dürfen auch Instanzen des Typs B auftauchen 86 87 Vererbung - Beispiel Objekte (Instanzen), Vererbung von Attributen public class GraphicCircle extends Circle { Objekte sind Daten(zeigerreferenzierte Records) Klasse GraphicsCircle erbt die Komponenten von Circle Color fill, outline; 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); Die Methoden drawoval( ) und filloval( ) in Java 1.5 erwarten Integer-Argumente (Anzahl Pixel) anstatt float. new GraphicsCircle() erzeugt 0104 0108 010C 0114 0118 Speicher GraphicsCircle float x = 0.0 float y = 0.0 float r = 0.0 Color fill = Color outline = Beteiligte Packages: java.awt.color, java.awt.graphics 011C 88 89
Vererbung Überdecken von Attributen Objekte (Instanzen), Überdecken von Attributen public class Circle extends Ellipse { double r; public double umfang () { return 2 * Math.PI * r; Objekte sind Daten(zeigerreferenzierte Records) Klasse Circle erbt alle Komponenten von Ellipse new Circle()erzeugt 0104 0108 010C Circle Speicher float x = 0.0 float y = 0.0 float r = 0.0 float r2 = 0.0 Kreise haben sowohl ein double r als auch das float r aus Ellipse 0114 0118 011C double r = 0.0 90 91