Klassen und Objekte Objekte einer Klasse bilden

Werbung
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
Herunterladen