SWE-18 Klassen und Objekte Eine Klasse definiert gleichartige Objekte mit ihren Datenelementen (Variable, fields) und Operationen (Methoden) in einer geschlossenen Programmstruktur. Beispiel: class Circles Objektvariable Objektmethoden © 1999 bei Prof. Dr. Uwe Kastens Konstruktormethode x, y, radius getX () getY () getRadius () move (...) grow (...) Circles (...) 3 Objekte der Klasse Circles 0 0 1.0 1 1 0.5 10 20 100.0 SWE-19 Objekte einer Klasse bilden Objekte werden durch die new-Operation zu einer Klasse gebildet: new Circles (0, 0, 1.0) new-Operation führt zum Aufruf der Konstruktormethode. Die Parameter legen initiale Eigenschaften des Objektes fest. Das Ergebnis ist eine Objektreferenz (Identität des Objektes). Sie kann z. B. an eine Variable 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 Objekte sind verschieden, d. h. sie haben verschiedene Objektreferenzen. Das gilt auch, falls die Werte ihrer Objektvariablen gleich sind. © 1999 bei Prof. Dr. Uwe Kastens Ein Klassenname wird auch als Typangabe (z. B. Variablendeklarationen) verwendet, er steht dann für den Typ der Referenzen von Objekten der Klasse. Objektmethoden werden für ein bestimmtes Objekt aufgerufen. Sie benutzen dessen Objektvariablen und können sie auch verändern: big.getRadius() liefert den radius-Wert des Objektes in der Variablen big small.move(1,2); ändert dieKoordinaten des Objektes in der Variablen small SWE-35 Aufrufe von Objektmethoden Objektmethoden werden für ein bestimmtes Objekt aufgerufen; sie benutzen dessen Objektvariablen: double r = big.getRadius (); Methodenaufrufe können auch die Werte von Objektvariablen (den Objektzustand) verändern: class Circles { int getX () { return x; } int getY () { return y; } double getRadius () { return radius; } void move (int dx, int dy) { x += dx; y += dy; } void grow (double dr) { radius += dr; } small.move (1, 2); © 1999 bei Prof. Dr. Uwe Kastens Schnittstelle der Klasse: von außen aufrufbare Methoden: getX, getY, getRadius, move, grow, Konstruktor Circles Circles (int ix, int iy, double ir) { x = ix; y = iy; radius = ir; } Der Zugriff von außen auf Objektvariable kann durch Modifizierer private verboten werden, d. h. small.radius = 2.3; ist nicht erlaubt. private int x, y; private double radius; } SWE-36 Beispiel für den Entwurf einer Klasse Aufgabe: Eine Klasse, zu der man Stempel als Objekte erzeugen kann. Ein Stempel soll Wertmarken bestimmter Größe aber mit unterschiedlichen Preisen drucken können. (siehe B-26, B-28) class Stamps { Stamps (int w, int d) private void aLine(char price) {width = w; depth = d;} { System.out.print (border); for (int i=2; i<width; i++) void aTicket (char price) System.out.print (price); { aLine (border); System.out.println (border); for (int i=2; i<depth; i++) } aLine (price); aLine (border); private int width, depth; private static final } char border = ’=’; }// Stamps © 1999 bei Prof. Dr. Uwe Kastens Variable für Stempel verschiedener Größe und ihre Benutzung: Stamps small = new Stamps(4,4); small.aTicket(’1’); Stamps big = new Stamps(7,7); big.aTicket(’5’); big.aTicket(’8’); ein 4x4-Stempel eine 1-er-Marke drucken ein 7x7-Stempel 5er- und 8er-Marken Drucken SWE-20 Klassenvariable, Klassenmethoden Klassenvariable und Klassenmethoden gehören inhaltlich zur Klasse insgesamt. Sie beziehen sich nicht auf ein spezielles Objekt. Sie werden über den Klassennamen zugegriffen: Circles.noOfObjects Eine Klassenvariable existiert nur einmal pro Klasse - nicht für jedes Objekt. Eine Klassenmethode greift nicht auf Objektvariable zu! Klassenvariable und -methoden werden durch static gekennzeichnet. Beispiel: Anzahl der zur Klasse Circles erzeugten Objekte zählen: © 1999 bei Prof. Dr. Uwe Kastens class Circles { ... Circles (int ix, int iy, double ir) { noOfCircles = noOfCircles + 1; ... } Konstruktor Klassenmethode static int getCounter () { return noOfCircles; } Klassenvariable Objektvariable private static int noOfCircles = 0; private int x, y; double radius; } SWE-21 Begriffe zur Struktur objektorientierter Programme Programm besteht aus Klassen besteht aus Elemente members sind Datenelemente (Variable) fields Methoden Konstruktor sind sind Klassenvariable Objektvariable Objektmethoden haben © 1999 bei Prof. Dr. Uwe Kastens Klassenmethoden ohne sind mit Ergebnis besteht aus Typ Parameter (Variable) lokale Variable Anweisungen statements SEW-23 Benutzung von Klassen aus Bibliotheken Package: Menge thematisch zusammengehöriger Klassen- (und Interface-) Deklarationen Bibliothek oder Teil davon Gültigkeitsgrenze für Klassennamen, falls nicht als public public class Date { ... } // auch außerhalb des Package gültig class Intern {...} // nur innerhalb des Package gültig © 1999 bei Prof. Dr. Uwe Kastens Einige Packages, die zu jeder Java-Implementierung gehören: lang grundlegende Klassen zur Sprache Java util nützliche Datenstrukturen mit ihren Operationen io Ein- und Ausgabe text spezielle Formatierung awt Graphik und graphische Benutzungsoberflächen (GUI) awt.event Ereignisbehandlung applet Java programme im WWW net Operationen in Netzwerken Benutzung von Klassen aus Packages: import java.util.Date; // nur die Klasse Date import java.util.*; // beliebige Klassen aus java.util SWE-22 Einfache Ausgabe Klassen in vordefinierten Standardbibliotheken machen einfache Ausgabefunktionen verfügbar: class System { ... static PrintStream out; static InputStream in; ... } class PrintStream { ... void print (String s) {...} void println (String s) {...} void println () {...} ... } Einfache Aufrufe von Ausgabefunktionen mit String-Objekten als Parameter: © 1999 bei Prof. Dr. Uwe Kastens System.out.println System.out.println System.out.println System.out.println ("Welcome to Java"); ("Welcome " + "to " + "Java"); ("Die Gesamtnote ist " + gesamtNote); (); String ist eine vordefinierte Klasse für Zeichenreihen als Datentyp mit Operationen darauf. String-Literale: z. B. "Welcome to Java" Der Operator + konkateniert zwei String-Objekte. Operanden von Grundtypen (z. B. int) werden dazu in String-Objekte konvertiert. SWE-43 Einfache Eingabefunktionen Zeichenfolgen von der Standardeingabe (Tastatur) lesen: Ein Objekt der Klasse BufferedReader aus der Bibliothek java.io wird mit dem Objekt System.in initialisiert und dessen Funktionen werden benutzt: import java.io.*; class Greetings { public static void main (String [] args) throws IOException { BufferedReader in = new BufferedReader (new InputStreamReader (System.in)); System.out.println ("What is your name?"); String name = in.readLine (); System.out.println ("Hello " + name); } } © 1999 bei Prof. Dr. Uwe Kastens in.readLine() liest bis zum nächsten Zeilenwechselzeichen oder bis zum Eingabeende und liefert die Zeichen davor als String-Objekt. throws IOException gibt an, daß ein Aufruf dieser Funktion E/A-Ausnahmen auslösen könnte (siehe SWE-48). SWE-44 Java Gently‘s Text Class Vereinfacht interaktive Eingabedialoge mit Fehlerbehandlung. Benutzt E/A-Ströme wie in SWE-22 und SWE-43gezeigt. Einige Funktionen aus der Klasse Text: public public public public public static static static static static void int double String char prompt (String s); readInt (BufferedReader in); readDouble (BufferedReader in); readString (BufferedReader in); readChar (BufferedReader in); Beispiel von SWE-43: © 1999 bei Prof. Dr. Uwe Kastens import java.io.*; import javagently.*; class Greetings { public static void main (String [] args) throws IOException { BufferedReader in = Text.open (System.in); Text.prompt ("What is your name?"); String name = Text.readString (in); System.out.println ("Hello " + name); } } SWE-45 Eingabe von Zahlenfolgen Es sollen Zahlenfolgen unterschiedlicher Länge gelesen werden. Die Länge wird erst bei der Ausführung des Programms bestimmt. 4 Techniken dazu: 1. Länge interaktiv erfragen; dann entsprechend viele Elemente lesen (SWE-46). 2. Auf der Eingabedatei die Angabe der Länge den Elementen voranstellen, dann entsprechend viele Elemente lesen (SWE-47). 3. Leseschleife am Eingabeende durch eine Ausnahmebehandlung beenden (SWE-48). 4. Einen speziellen Wert, der nicht in der Folge vorkommen kann, als Endezeichen (Sentinel) anfügen. © 1999 bei Prof. Dr. Uwe Kastens Beispiel siehe SWE-46. SWE-46 Eingabe von Zahlenfolgen, Beispiel 1 Technik 1: Länge interaktiv erfragen; dann entsprechend viele Elemente lesen. import java.io.*; import javagently.*; public class Summation1 { public static void main(String[] args) throws IOException { BufferedReader in = Text.open (System.in); © 1999 bei Prof. Dr. Uwe Kastens Text.prompt ("How many numbers?"); int count = Text.readInt (in); // Länge interaktiv erfragen double total = 0; for (int i = 1; i <= count; i++) // Leseschleife { Text.prompt (i + ">"); double number = Text.readDouble(in); total += number; } System.out.println ("That’s enough, thanks."); System.out.println ("The total is " + total); } } SWE-47 Ein- und Ausgabe mit Dateien Statt der vordefinierten Dateiobjekte System.in, System.out werden neue Dateiobjekte für Dateien unter deren Dateinamen (Unix-Pfad) von den Funktionen Text.open und Text.create erzeugt: statt Standardeingabe: BufferedReader in = Text.open (System.in); Eingabedatei: BufferedReader in = Text.open ("numbers.in"); Ausgabedatei: PrintWriter out = Text.create ("totals.out"); Im Beispiel SWE-46 nur die Erzeugung des Dateiobjektes und das Lesen der Länge ändern: © 1999 bei Prof. Dr. Uwe Kastens BufferedReader in = Text.open ("numbers.in"); int count = Text.readInt (in); // Länge von der Datei lesen // Lesen der Werte wie in SWE-46