Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Technische Informatik für Ingenieure Kapitel 10 Java: Klassen Wintersemester 2001 / 2002 Wolfram Hardt Zusammenfassung Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn ? Unterprogramme <modifier> <ergebnistyp> <name> (parameterliste) anweisungsblock ? modifier: static, pubic, private ? ergebnistyp: Typ, wenn das Unterprogramm ein Ergebnis liefert, ansonsten "void". ? Unterprogramme heißen „Funktionen“, wenn ? ein Ergebnis zurückgegeben wird. ? Programmkonstrukt zur Rückgabe des Ergebnis: return ? Unterprogramme heißen „Prozeduren“, wenn ? kein Ergebnis zurückgegeben wird. ? Parameter können globale Variablen sein 10-2 1 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Zusammenfassung static int sumplus (int a, int b) { a++; // a um 1 erhoehen (inkrementieren) b++; // b um 1 erhoehen (inkrementieren) return a+b; // Summe als Ergebnis zurueckliefern } int x=3; int y=4; int s1 = sumplus(x,y); int s2 = sumplus(x,y); // s1=9 // s2=9 int a=3; int b=4; int s3 = sumplus(a,b); // s3=9, a=3, b=4 ? Formale Parameter: Unterprogrammdeklaration; BSP: a, b ? Aktuelle Parameter: aufrufendes Programm; BSP: x, y, a, b 10-3 Beispiel II zu Rekursion Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn ? Die Fibonacci-Zahlen (Leonardo Fibonacci, 1202) ? Rekursive Definition: f0 = 0; f1 = 0; fn = fn-1 + fn-2 für n > 1 n: 0 fn: 0 1 1 2 1 3 2 4 3 5 5 6 8 7 8 9 10 11 12 13 13 21 34 55 89 144 233 10-4 2 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Rekursive Funktion (Fibonacci) static int fib(int n) { // Berechnet die n-te Fibonacci-Zahl if ( n == 0) return 0; // 1. Startwert else if (n==1) return 1; // 2. Startwert else return (fib(n-1) + fib(n-2)); // Rekursion } Die rekursive Lösung führt zu Mehrfachberechnungen. Bei n=40 bereits über 200 Millionen Additionen ! Der Rechenaufwand steigt exponentiell mit n. 10-5 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Struktur des rekursiven Aufrufs f7 f5 f6 f5 f4 f3 f4 f3 f2 f2 f2 f1 f1 f0 f1 f0 f3 f1 f2 f2 f1 f1 f1 f0 f3 f4 f3 f0 f2 f2 f1 f1 f2 f0 f1 f1 f0 f1 f0 f1 f0 10-6 3 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Iterative Lösung static int fib(int n) { //Berechnet die n-te Fibonacci-Zahl int f [] = new int [n+1]; // Feld fuer Fibonacci Zahlen f[0]= 0; f[1]= 1; // Startwerte if (n>1) for (int i = 2; i<=n; i++) f[i]= f[i-1]+f[i-2]; return f[n]; // Fuelle Tabelle // hole Werte aus Tabelle } Braucht für n=40 nur 39 Additionen! 0 1 1 2 3 5 8 13 21 Der Rechenaufwand wächst linear mit n. 10-7 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Klassen: Idee ? Abstrakte Datenstruktur ? Vergleich mit Datenfledern (Arrays) ? Gruppierung mehrerer Daten gleichen Typs ? abstraktes Objekt Array, definierte Elemente ? Klassen ? Gruppierung mehrerer Daten ? Gruppierung von Daten und Funktionen ? abstraktes Objekt, definierte Elemente ? einfache Datentypen (int, float, ... ) Member ? komplexe Datentypen (String, Array, ... ) ? Unterprogramme, dediziert zu Daten Methode ? Sichtbarkeitsbreiche 10-8 4 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Klassen ? Beschreibung von Objekten der realen Welt ? Konzentration auf relevante Einzelheiten Abstraktion ? Vernachlässigung nicht relevanter Einzelheiten ? Zugriff auf die Elemente eines Objektes ? Member-Variablen und Methoden ? Sichtbarkeitsbereiche ? public: ? static: ? private: ? keine Einschränkung globale Variable für alle Objekte dieses Typs nur innerhalb der Klasse sichtbar nur innerhalb eines Packages ? Package ? Gruppe von Klassen 10-9 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Packages ? neues Schlüsselwort: package ? Beispiel ? package tifi.uebung ? Voraussetzung ? es existiert der Pfad tifi/uebung ? ls tifi/uebung ? loesung1.java ? loesung2.java ? Alle Klassen aus den Files loesung1.java und loesung2.java gehören zum Package package tifi.uebung 10-10 5 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Konstruktor ? Klassen verfügen über spezielle Initialisierungs-Operatoren ? Konstruktoren ? Namen der Klasse, Parameter ? Beispiel class Forwarder { private float private float Forwarder length: float weight: float length; weight; public Forwarder length weight = } public Forwarder length weight = } { = -1; -1; Forwarder() Forwarder(len: float (float len ){ = len; -1 } 10-11 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Bisher ... ? Klassen ? Gruppierung von Daten und Funktionalität ? Sichtbarkeitsbereich ? public - private - static ? Initialisierungsoperator ? Konstruktor ? unterschiedliche Parameter möglich ? Klassen spiegeln wesentliche Aspekte der ‚realen Welt‘ wider ? Daten und Methoden sind ? Basis von Klassen und wesentliche Bausteine der ? Objektorientierten Programmierung 10-12 6 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Objektorientierung ? Objekte der ‚realen Welt‘ werden in einem Programm repräsentiert ? z.B. Gegenstände, Personen ? Diesen Vorgang nennt man Abstraktion: nur bestimmte Aspekte des realen Objekts interessieren ? Person: Name, Vorname, Adresse, Telefonnummer ? Motor: Drehzahl, Drehmoment, Temperatur ? Objekte gleichen Typs werden zu einer Klasse zusammengefasst ? Objekte können auch ein Verhalten zeigen, man kann an ihnen Handlungen, d.h. Operationen durchführen ? Person: aufnehmen, abweisen, einordnen ? Flasche: öffnen, trinken, wegwerfen ? Personenliste: sortieren, drucken ? In gewisser Weise definiert sich das Objekt durch das, was man mit ihm „machen“ kann 10-13 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Klassen und Instanzen Eigenschaften Zustandsgrößen (Typen,Variablen) (Typen,Variablen) Verhalten Methoden Reales Objekt Abstraktes Objekt Konkrete Objekte Klasse Objekte, Instanzen Datenobjekte Datenobjekte Datenobjekte (Werte) Datenobjekte (Werte) (Werte) in der Vorlesung wird der Begriff Instanz verwendet. 10-14 7 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Klassen und Instanzen Klassenname class Circles Instanzvariable x, y, radius Instanzmethoden Konstruktormethode Drei Instanzen der Klasse Circles getX () getY () getRadius () move (...) grow (...) Circles (...) Circles (1,1,0.5) 0 0 1.0 1 1 0.5 Circles (0,0,1.0) 10 20 100.0 Circles (10,20,100.0) 10-15 Bildung von Klassen Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn ? Instanzen werden durch den new-Operator klassenspezifisch erzeugt: new Circles (0,0,1.0) ? Die new-Operation führt zum Aufruf der Konstruktor-Methode, deren Parameter die initialen Eigenschaften der Instanz festlegen. ? Das Ergebnis der new-Operation kann einer Variablen passenden Typs zugewiesen werden. Circles unit = new Circles(0,0,1.0); Circles small = new Circles(1,1,0.5); Circles big = new Circles(10,20,100.0); ? Alle Instanzen sind verschieden, auch wenn sie dieselben Werte haben. int a, b; ? zwei Instanzen vom Typ integer a = 5; ? beide speichern den gleichen Zahlenwert b = 5; ? in verschiedenen Speicherstellen a = 3; System.out.println(‚Welchen Wert hat b?‘ + b); 5 10-16 8 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Bildung von Klassen ? Der Klassenname wird wie eine Typangabe verwendet. ? Objektmethoden werden werden für eine bestimmte Instanz aufgerufen. ? Die Variablen dieser Instanz werden verwendet. ? Die Variablen dieser Instanz können verändert werden. big.getRadius(); small.move(1,2); // Liefert den Radius-Wert der Instanz big // ändert die Koordinaten des Objekts small ? Achtung: Es gibt eine Ausnahme ? Variablen, die als ‚static‘ definiert sind static int a; ? eine Änderung gilt für alle Instanzen ? spezielle Bezeichnung: Klassenvariable Instanz 2 a = 2 10-17 a = 3 Instanz 1 a = 4 Instanz 3 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Klassenvariable (static) ? Klassenvariable und Klassenmethoden gehören zur Klasse als Ganzes. ? Sie beziehen sich nicht auf eine spezielle Instanz. ? Klassenvariable und Klassenmethoden werden durch static gekennzeichnet. ? Eine Klassenmethode kann nicht auf Variable einzelner Instanzen zugreifen. ? Eine Klassenvariable existiert nur einmal pro Klasse, nicht für jede Instanz. Beispiel: class Circles { ... Circles (int ix,int iy, double ir) { noOfCircles ++; ...} static int getCounter (); { return noOfCircles; } private static int noOfCircles = 0; private int x, y; double radius; } // Konstruktor // Klassenmethode // Klassenvariable // Instanzvariable 10-18 9 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Begriffe Programm besteht aus Klassen besteht aus Elemente sind Methoden Daten sind Klassenvariable sind sind Instanzvariable haben Konstruktor Klassenmethoden sind haben Instanzmethoden ohne mit Ergebnis Typ besteht aus besteht aus Parameter lokale Variable Anweisungen 10-19 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Beispielklasse Class Circles { private int x, y; private double radius; int getX () { return x;} // x-pos. d. Mittelp. int getY () { return y;} // y-pos. d. Mittelp. double getRadius () { return radius;} void move (int dx, int dy){ x += dx; y += dy; } void grow (double dr){ radius += dr;} Circles (int ix, int iy, double ir) { x = ix; y = iy; radius = ir; } } ? Schnittstelle (von außen aufrufbare Methoden): getX, getY, getRadius,move, grow, Konstruktor Circles ? Direkter Zugriff auf Instanzvariable big.radius = 3.14 ist verboten, denn radius ist als private deklariert. 10-20 10 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Beispiel: Stack ? Ein Stack (Stapel) ist eine Datenstruktur zum Abspeichern von Elementen nach dem Prinzip „last in first out“ (LIFO) ? Operationen auf dieser Datenstruktur ? push: ablegen von Daten ? pop: wiederholen von Daten ? Beispiel 4 10 12 Stack push(12); push(10); push(4); a = pop(); System.out.println(a + ‚wurde vom Stack geholt‘); Ausgabe: 4 10-21 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Beispiel: Stack class Stack { private int Size; // aktuelle Groesse private int V[]; // der eigentliche Speicher public Stack (int capacity) // Konstruktor { V = new int[capacity]; // Erzeugen eines Arrays zur // Aufnahme von integer-Daten Size = 0; // Size zeigt auf den ersten } // freien Platz des Stacks public void push (int value) // lege ein Element auf den Stack { V[Size++] = value; // speichern und Size erhoehen } public int pop () // nehme ein Element from Stack { Size--; // Size erniedrigen return V[Size]; // oberstes Element herausnehmen } public int top () // lies oberstes Element { return V[Size-1]; } } // unvollständig: Fehlersituationen müssen abgefangen werden 10-22 11 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Vererbung (Inheritance) ? Hierarchische Relation zwischen Klassen zur: Oberklasse (allgemeiner) ? Spezialisierung: Instanzen einer Unterklasse können wie Instanzen der Oberklasse behandelt werden Unterklasse (spezieller) ? Wiederverwendung: Unterklasse erbt die Implementierung der Oberklasse und erweitert diese. Beispiele Geometrics Circles Java-Schlüsselwörter: extends super abstract Motor Rectangles Diesel Benzin Elektro 10-23 Beispiel für Vererbung Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn abstract class Geometrics { int getX () { return x; } int gety () { return y; } void move (int dx, int dy){ x += dx; y += dy; } Geometrics (int ix, int iy){ x = ix; y = iy;} private int x,y; } class Circles extends Geometrics { double getRadius () { return radius;} void grow (double dr){ radius += dr;} Circles(int ix,int iy,double ir) {super(ix,iy); radius=ir;} private double radius; } class Rectangles extends Geometrics { Rectangles(int ix, int iy, double l, double w) { super (ix,iy); length =l; width = w;} private double length, width; } 10-24 12 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Vererbung ? Die Oberklasse Geometrics ist als abstract gekennzeichnet, d.h. es gibt keine Instanzen dieser Klasse. ? Circles und Rectangles erben von Geometrics die x- und yKoordinaten und die zugehörigen Methoden. ? Circles und Rectangles definieren weitere, speziellere Methoden und Instanzvariable. ? super ist der Aufruf des Konstruktors der Oberklasse zur Durchführung der Initialisierung der Werte, für die die Oberklasse zuständig ist Ein Rectangles-Objekt Ein Circles-Objekt X X y y radius length width 10-25 Polymorphie: Variablentypen Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn ? Polymorphie (=Vielgestaltigkeit) ? Instanzen verschiedener Unterklassen können wie eine Instanz der gemeinsamen Oberklasse behandelt werden, d.h. allgemeinere Methoden der Oberklasse können auf speziellere Instanzen von Unterklassen angewendet werden. Circles cir = new Circles (1,2,3.0); Rectangles rec = new Rectangles (3,4,5.0,6.0); Geometrics geo; geo = cir; // Typausweitung: Circles ->Geometrics geo.move(1,1); // Aufruf einer allgemeinen Methode geo = rec; geo.move(2,3) rec = (Rectangles)geo; // Einengen des Typs // Geometrics > Rectangles rec = geo; // Übersetzungsfehler ! 10-26 13 Polymorphie: Dynamische Methodenbindung Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn ? Die Klassenzugehörigkeit der Instanz bestimmt, welche Methode aufgerufen wird. abstract class Motor class Diesel extends Motor { { void on() {...} void off() {...} void glueh() void on() void accelerate (...) {...} {...} // überschreibt { glueh(); super.on();} ... ... } } class Elektro extends Motor... ? In einer Unterklasse können Methoden definiert werden, die mit gleichem Namen, gleichen Typen von Parametern und Ergebnis auch in der Oberklasse definiert sind. Sie überschreiben die der Oberklasse. Sie sollen konzeptuell das gleiche leisten, nur speziell bezogen auf die Unterklasse. ? Ein Aufruf von m.on() führt je nach aktuellem Inhalt von m auf die Motor-, Diesel- oder Elektromethode. 10-27 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Vererbung: Zusammenfassung ? Die Unterklasse B erbt Methoden und Variable von der Oberklasse A: Die Methoden und Variablen von A sind auch für B definiert. ? Eine B-Instanz kann wie eine A-Instanz behandelt werden: Oberklasse class A A ? zu einer B-Instanz Methoden aufrufen, die in A definiert sind ? eine Referenz der B-Istanz an eine Variable vom Typ A zuweisen ? Eine B-Instanz enthält auch Instanzvariable, die in A definiert sind. B Unterklasse class B extends A ? Eine B-Instanz bleibt immer eine B-Instanz, auch wenn seine Referenz an Variable eines anderen Typs zugewiesen wird. ? In den Methodendefinitionen von B können Methoden von A aufgerufen und Variable von A benutzt werden, sofern sie nicht private sind 10-28 14 Technische Informatik für Ingenieure Wolfram Hardt Universität Paderborn Frohes und gesegnetes Weihnachtsfest 10-29 15