Info B VL 2: Java und Objekt-Orientierung Objektorientiere Programmierung in Java 2003 Ute Schmid (Vorlesung) Elmar Ludwig (Übung) FB Mathematik/Informatik, Universität Osnabrück Info B VL 2: Java und Objekt-Orientierung p.24
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) Info B VL 2: Java und Objekt-Orientierung p.25
Eigenschaften von OO-Sprachen (2) Objekte können 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önnen dieselben Botschaften erhalten Jedes Objekt einer Klasse kann alle Methoden, die in dieser Klasse definiert sind, ausführen, plus ererbte Methoden von Oberklassen. Info B VL 2: Java und Objekt-Orientierung p.26
Prinzipien der OO-Programmierung Kapslung (encapsulation) und Wiederverwendbarkeit (reuse) Info B VL 2: Java und Objekt-Orientierung p.27
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 Info B VL 2: Java und Objekt-Orientierung p.28
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 Info B VL 2: Java und Objekt-Orientierung p.29
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 Internet-Anwendungen Einsatz für 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 Info B VL 2: Java und Objekt-Orientierung p.30
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) Info B VL 2: Java und Objekt-Orientierung p.31
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) Info B VL 2: Java und Objekt-Orientierung p.32
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,...) Info B VL 2: Java und Objekt-Orientierung p.33
3 Ebenen von Java Programmiersprache Virtuelle Maschine (Interpreter) Plattform (APIs) Info B VL 2: Java und Objekt-Orientierung p.34
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) Info B VL 2: Java und Objekt-Orientierung p.35
8-Damen Problen in OO OO Lösung, Programm QueensOO 1 Queen #row: int #column: int +findsolution(): boolean #advance(): boolean #predeccanattack(queen:queen): boolean +printsolution() creates creates QueensOO +MAX: int +main() left neighbor NeighborQueen #neighbor: Queen Info B VL 2: Java und Objekt-Orientierung p.36
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 Info B VL 2: Java und Objekt-Orientierung p.37
Klassen in Java Java als OO-Sprache Struktur Klassen sind fundamentale 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) Info B VL 2: Java und Objekt-Orientierung p.38
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. Info B VL 2: Java und Objekt-Orientierung p.39
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 Info B VL 2: Java und Objekt-Orientierung p.40
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) Info B VL 2: Java und Objekt-Orientierung p.41
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 ) Info B VL 2: Java und Objekt-Orientierung p.42
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. Info B VL 2: Java und Objekt-Orientierung p.43
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) Info B VL 2: Java und Objekt-Orientierung p.44
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. Info B VL 2: Java und Objekt-Orientierung p.45
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 Info B VL 2: Java und Objekt-Orientierung p.46
Objekt-Erzeugung/Initialisierung Erzeugung von Objekten mit new Circle c = new Circle(); Konstruktor 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. Info B VL 2: Java und Objekt-Orientierung p.47
Instanz-Methoden (1) public double circumference() return 2 * PI * r; Jede Methode, die nicht static deklariert ist, ist eine Instanz-Methode. Instanz-Methoden arbeiten auf einer Instanz einer Klasse (auf einem Objekt) und nicht auf der Klasse selbst. Instanz-Methoden sind der zweite wesentliche Kern der Objektorientierung. Um eine Instanz-Methode ausserhalb der Klasse, in der sie definiert ist, zu verwenden, muss zunächst ein entsprechendes Objekt erzeugt werden. Info B VL 2: Java und Objekt-Orientierung p.48
Instanz-Methoden (2) Objekte nicht Funktionen stehen im Mittelpunkt! (a = area(c) vs. a = c.area()) An die Methode area() muss kein Parameter übergeben werden, weil alle Informationen über das Objekt implizit in der Instanz c vorhanden sind. Instanz-Methoden können auf Klassen- und Instanz-Members zugreifen. In circumference() ist r mit dem Wert aus der gerade betrachteten Instanz belegt. 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 double a = c.area(); // Invoke an instance method of the object Info B VL 2: Java und Objekt-Orientierung p.49