Info B VL 2: Java und Objekt-Orientierung
Objektorientiere Programmierung in Java 2003
Ute Schmid (Vorlesung) Elmar Ludwig ( ¨ Ubung)
FB Mathematik/Informatik, Universit¨at Osnabr¨uck
Eigenschaften von OO-Sprachen (1)
Alles ist ein Objekt
(in Smalltalk, in Java gibt es auch primitive Datentypen)
Datentyp eines Objekts: Klasse, mit der es erzeugt wurde
Objekte können Daten (Felder) und Operationen (Methoden), die auf diesen Daten agieren,
enthalten.
Ein Programm ist eine Menge interagierender Objekte Objekt kann (via Methode) Botschaften an ein
anderes Objekt schicken (z.B. Aufforderung eine
Methode auszuführen)
Eigenschaften von OO-Sprachen (2)
Objekte k¨onnen zu komplexen Objekten kombiniert werden
Komplexe Objekte können aus einfachen
Bausteinen aufgebaut werden, indem Objekte Referenzen auf andere Objekte enthalten.
Alle Objekte eines Typs k ¨onnen dieselben Botschaften erhalten
Jedes Objekt einer Klasse kann alle Methoden, die in dieser Klasse definiert sind, ausführen, plus
ererbte Methoden von Oberklassen.
Prinzipien der OO-Programmierung
Kapslung (encapsulation) und
Wiederverwendbarkeit (reuse)
Kapslung
Organisation von Daten und Methoden in Klassen information hiding: Verstecken von
Implementierungsdetails
Kapslung ist guter Programmierstil:
Gliederung eines Problems in kleinere, unabhängige Komponenten (Klassen), Prinzip der strukturierten Programmierung
Durchschaubarkeit, Testbarkeit, weniger Fehleranfälligkeit
Pakete als Strukturierungsmittel für Klassen
Zugriffsrechte: z.B. Einschränkung von Zugriff auf
Felder, kann helfen Informationen konsistent zu halten Verstecken von Implementationsdetails unterstützt
Austauschbarkeit von Code
Wiederverwendbarkeit
möglich, weil
Klassen unabhängig von konkreten Daten definierbar Spezialisierung durch Vererbung
Schreibe Code und Dokumentation so, dass Funktionalität der Klasse transparent ist
Arbeite mit Interfaces
Guter Stil: Verwendung der vordefinierten Java Klassen
APIs (Application Program Interfaces) sind
üblicherweise gut designed und getested
Entstehungsgeschichte von Java
Start 1990 bei Sun, Gruppe von James Gosling, ursprünglicher Namen “Oak”
Angelehnt an C++, Elemente aus Smalltalk (Bytecode, Garbage Collection) – via Objective C
objekt-orientiert.
Ziel: Entwicklung einer Hochsprache für hybride
Systeme im Consumer-Electronic Bereich: Steuerung von Waschmaschinen, Telefonanlagen, ...
Boom des WWW 1993
Einsatz für Internet-Anwendungen
Java-Applets: kleine Programme, die in HTML-Seiten eingebunden werden können (Sun Demo
Web-Browser HotJava in den 90-ern)
Durchbruch 1995: Netscape Navigator 2.0 mit
integrierter Java Virtual Machine
Java Versionen
Java 1: bezeichnet Versionen 1.0 und 1.1 Java 2: alle Versionen ab 1.2
1.2: viele neue Features
1.3: Verbesserung von APIs (z.B. Corba), Geschwindigkeitsverbesserung (just in time compiler)
1.4: neue APIs (assertions, regular expressions, XML-Parser, ...)
Version # Klassen # Pakete Ersch. Anmerkungen
1.0 212 8 Jan. 1996
1.1 504 23 Feb. 1997
1.2 1520 59 Dez. 1998 auch “Java 2, Release 1.2”
1.3 1840 76 Mai 2000 "Java 2, Release 1.3, Standard Ed."
1.4 2977 135 Feb. 2002 (1.4.0)
Java Buzzwords (1)
Objekt-Orientiert: Kapslung in Klassen, Vererbung Robust: kein explizites Arbeiten mit Zeigern,
Speicherverwaltung wird von Java gehandhabt (Garbage Collection)
Portabel: JVM (virtuelle Maschine ist bewährtes Prinzip);
alle Datentypen sind unabhängig von der Implementierung festgelegt (Standards) Dynamisch, Erweiterbar: Organisation des
Programmcodes in Klassen, in verschiedenen Dateien gespeichert, load when needed
Internationalisierung: 16-bit Unicode (statt ASCII)
Java Buzzwords (2)
Multithreaded: Zerlegung in einzelne “Prozesse”
(Threads), die unabhängig voneinander ablaufen können
Verteilt: Remote Method Invocation (RMI),
Netzwerk-Programmierung basierend auf Client-Server Architekturen
Sicher: Plattform erlaubt Laden von unbekanntem Code,
der in einer sicheren Umgebung abläuft (kein Lesen
und Schreiben von Festplatte, ...)
3 Ebenen von Java
Programmiersprache
Virtuelle Maschine (Interpreter)
Plattform (APIs)
8-Damen Problem
8-Damen Problem: Platziere 8 Damen so auf einem
Schachbrett, dass keine eine andere schlagen kann
Allgemein:
Damen Problem
Standard-Beispiel für generate and test Algorithmen, Tiefensuche mit Backtracking
Problem mit exponentieller Komplexität
Imperative Lösung, Programm: QueensIM Klassenfeld: Array queens[1..MAX-1]
Index: Spalte der Dame, Index-Eintrag (änderbar):
Zeile der Dame
Globale Kontrolle über alle Damen (in der
main -Methode)
8-Damen Problen in OO
OO Lösung, Programm QueensOO
QueensOO
+MAX: int +main()
Queen
#row: int
#column: int
+findSolution(): boolean
#advance(): boolean
#predecCanAttack(queen:Queen): boolean +printSolution()
NeighborQueen
#neighbor: Queen left neighbor
1
creates
creates
Erinnerung: OO Konzepte
Programm als Menge interagierender Objekte: 8 Queen -Objekte
Kombination zu komplexen Objekten: eine NeighborQueen enthält eine Queen
Botschaften: sag der Nachbarin, dass sie sich
versetzen soll
Klassen in Java
Java als OO-Sprache
Klassen sind fundamentale Struktur
Jedes Java Programm ist als Klasse definiert; alle Java Programme benutzen Objekte.
Eine Klasse ist die kleinste Einheit an Java-Code, die für sich allein stehen kann und vom Java-Compiler und -Interpreter erkannt wird
Jede Klasse definiert einen neuen Datentyp!
primitiver Datentyp – Wert (int 42)
Klasse – Objekt (Circle ‘Kreis mit Radius 2’)
Klasse: Sammlung von Attributen (typisierte Platzhalter für Daten) und von Programmcode (gespeichert in
benannten Methoden, die auf diesen Daten arbeiten)
Klassendefinition
Klassendefinition: Im einfachsten Fall class Name
Members
Konvention: Erster Buchstabe des Klassennamens wird gross geschrieben.
Die erste Zeile der Klassendefinition repräsentiert die
“Klassen-Signatur” (vgl. erste Zeile einer Methodendefinition)
Der Java-Interpreter lädt Klassen dynamisch (dynamic
loading): Wenn das erste Mal ein Objekt dieser Klasse
erzeugt bzw. eine statische Komponente benötigt wird.
Members/Komponenten einer Klasse
Drei Arten von Members:
Felder
Methoden
innere Klassen
class members: als static deklariert, assoziiert mit der Klasse selbst
instance members: assoziiert mit individuellen Instanzen der Klasse (Objekten!)
Beispielprogramm: Circle
Klassen-Felder (1)
public static final double PI = 3.14159;
Assoziiert mit Klasse selbst durch static modifier:
Klassen-Feld (static field)
Es existiert nur eine einzige Kopie eines statischen Feldes!
Feld vom Typ double mit Namen PI und zugewiesenem Wert 3.14159
final modifier: Wert des Feldes ändert sich nach erster Zuweisung nicht mehr (Konstante)
public modifier: “jeder” kann das Feld benutzen
(visibility modifier)
Klassen-Felder (2)
Lokale Variable/Konstante: innerhalb einer Methode oder eines Blocks
Felder: Komponenten einer Klasse!
ähnlich einer globalen Variable in einem Programm Innerhalb der Klasse Circle kann PI mit seinem einfachen Namen referenziert werden;
ausserhalb: Circle.PI (eindeutige Spezifikation:
“das PI, das in Klasse Circle definiert ist”)
Klassen-Methoden (1)
public static double radiansToDegrees(double rads) return rads * 180/PI;
Assoziiert mit Klasse selbst durch static modifier:
Klassen-Methode (static method)
Aufruf (invocation) von ausserhalb der Klasse:
Circle.radiansToDegrees(2.0)
oft guter Stil Klassennamen auch innerhalb der Klasse mitanzugeben, um klar zu machen, dass eine
Klassen-Methode benutzt wird
Klassen-Methoden sind “globale Methoden” (in anderen Programmiersprachen sind alle
Prozeduren/Funktionen global), “imperativer
Programmierstil” kann in Java realisiert werden, wenn
nur Klassen-Methoden benutzt werden.
Klassen-Methoden (2)
radiansToDegree() ist eine “utility”-Methode, die in Circle definiert ist, weil sie beim Arbeiten mit Kreisen nützlich sein kann.
benutzt das Klassen-Feld PI
Klassen-Methoden können alle anderen
Klassen-Komponenten der eigenen Klasse (oder auch anderer Klassen) benutzen.
Klassen-Methoden können nicht direkt (mit this ) auf Instanz-Felder oder -methoden zugreifen! (weil die
Klassen-Methoden nicht mit einer Instanz assoziiert
sind)
Instanz-Felder (1)
public double r;
Jedes Feld, das nicht static deklariert ist, ist ein Instanz-Feld.
Instanz-Felder sind mit den Objekten der Klasse assoziiert.
Jedes Objekt der Klasse Circle hat seine eigene Kopie des Felds r . Jeder Kreis hat seinen eigenen Radius.
Innerhalb von Klassen werden Instanz-Felder durch
ihren Namen referenziert. In Code ausserhalb wird der
Name über eine Referenz zu dem Objekt, das das Feld
enthält, angegeben.
Instanz-Felder (2)
Instanz-Felder sind der Kern des objekt-orientierten Programmierens: Mit Instanz-Feldern wird ein Objekt (über seine Eigenschaften) definiert. Die Werte dieser Felder machen Objekte zu unterschiedlichen
Identitäten.
Circle c = new Circle(); // Create a new Circle object // store it in variable c
c.r = 2.0; // Assign a value to its instance field r Circle d = new Circle(); // Create a different Circle object
d.r = c.r * 2; // Make this one twice as big
Objekt-Erzeugung/Initialisierung
Erzeugung von Objekten mit new Konstruktor
Circle c = new Circle();
Ein Objekt mit Namen name vom Typ des Konstruktors ( Klasse oder Unterklasse der Klasse) wird erzeugt und durch Aufruf eines Konstruktors für diese Klasse initialisiert.
Konstruktoren können selbst definiert werden. (Kapitel
‘Konstruktoren und Vererbung’)
Wenn eine Klasse keinen eigenen Konstruktor
definiert, dann bekommt sie automatisch einen
Default-Konstruktor ohne Parameter.
Instanz-Methoden (1)
public double circumference() return 2 * PI * r;