Algorithmen und Datenstrukturen II Robert Giegerich Technische Fakultät Vorlesung Sommer 2011 Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Teil I Java: Der Einstieg Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Grundlegendes zu Java: Historisches 1990-1991: Entwicklung der Programmiersprache OAK durch James Gosling von Sun Microsystems (zunächst für Toaster, Mikrowellen etc.; unabhängig vom Chip, plattformunabhängig) 1993: Umbenennung in Java 1995: α und β Release 1995: Java wird in den Netscape Navigator integriert von IBM, SGI, Oracle und Microsoft und vielen anderen lizensiert 2002ff: Rechtsstreit zwischen SUN und Microsoft um Plattformunabhängigkeit 2005: bereits über 2,5 Milliarden Geräte mit Java-Unterstützung und 4,5 Millionen Entwickler aktuell (Stand April 2010): JDK 6 Update 20 Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Grundlegendes zu Java: Eigenschaften durch den Bytecode (Zwischensprachencode) unabhängig von der Plattform Syntax an C und C++ angelehnt objektorientiert streng typisiert: alle Typen stehen zur Übersetzungszeit fest unterstützt parallele Abläufe (Nebenläufigkeit / Threads) Graphical User Interface (GUI) netzwerkfähig Speicherverwaltung durch Garbage collection teilweise langsamer als C oder C++. Abhilfe durch Just-in-time-compiler Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Anwendungen Selbstständig laufende Anwendung Robert Giegerich A&D II, Vorlesung 2010 Quellprogramm Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Anwendungen Selbstständig laufende Anwendung Quellprogramm Java-Compiler ? Java-Bytecode Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Anwendungen Selbstständig laufende Anwendung Quellprogramm Java-Compiler ? Java-Bytecode Java-Interpreter ? Ablauf des Programms Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Applets Applet Robert Giegerich A&D II, Vorlesung 2010 Quellprogramm Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Applets Applet Quellprogramm Java-Compiler ? Java-Bytecode auf dem Server Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Applets Applet Quellprogramm Java-Compiler ? Java-Bytecode auf dem Server ?Übertragung per Internet Bytecodes auf dem Rechner des Benutzers (Client) Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Applets Applet Quellprogramm Java-Compiler ? Java-Bytecode auf dem Server ?Übertragung per Internet Bytecodes auf dem Rechner des Benutzers (Client) Java-Interpreter im Browser oder Applet-Viewer ? Ablauf des Programms Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Sicherheit keine Pointerarithmetik wie in C Garbage Collection1 Überprüfungen zur Laufzeit (Datentypen, Indizes, etc.) 1 Ein Garbage Collector entfernt automatisch Objekte, Felder und Variablen, auf die keine Referenz mehr vorhanden ist, aus dem Speicher (siehe Arnold & Gosling [1], S. 12, Kapitel 1.6). Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Erstellen eines Java-Programms 1 Quellprogramm erstellen: Beispiel class Hello { public static void main(String[] args) { System.out.println("Hello World"); } } Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Erstellen eines Java-Programms 1 Quellprogramm erstellen: Beispiel class Hello { public static void main(String[] args) { System.out.println("Hello World"); } } 2 Übersetzen eines Programms: > javac Hello.java Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Erstellen eines Java-Programms 1 Quellprogramm erstellen: Beispiel class Hello { public static void main(String[] args) { System.out.println("Hello World"); } } 2 3 Übersetzen eines Programms: > javac Hello.java Interpretation des Bytecodes: > java Hello Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Grundzüge imperativer Sprachen Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Das Behältermodell der Variablen Imperative Programmierung geht aus vom Modell eines Speichers, aufgegliedert in einzelne Variablen, in denen Werte abgelegt werden können. Der Speicher bzw. die Variablen werden verändert durch Befehle bzw. Anweisungen, die selbst vom aktuellen Speicherinhalt abhängen. Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Das Behältermodell der Variablen Imperative Programmierung geht aus vom Modell eines Speichers, aufgegliedert in einzelne Variablen, in denen Werte abgelegt werden können. Der Speicher bzw. die Variablen werden verändert durch Befehle bzw. Anweisungen, die selbst vom aktuellen Speicherinhalt abhängen. Ein typisches Beispiel ist die Anweisung x = y + z. Sie bedeutet: Addiere die Variableninhalte von y und z und lege die Summe in der Variablen x ab. Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Seiteneffekte nicht nur der Variableninhalt von x kann sich ändern, sondern auch der von y und z sowie aller möglicher anderer Variablen; falls x ≡ y oder y ≡ z, dann ist dies unmittelbar einsichtig. Also ist “x = y + z” keine Gleichheit, die zwischen den Werten (Inhalten) von x, y und z gilt, und mittels der wir über Programme nachdenken und Beweise führen können. Das Prinzip der referential transparency“ (Werttreue), das in der funktionalen ” Programmierung gilt, ist in der imperativen verletzt. Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Konsequenzen 1 Der Nachweis von Programmeigenschaften wird viel schwieriger, ebenso das Verstehen von Programmen. 2 Die Semantik eines Programms hängt von einem strikten Nacheinander der Ausführung der einzelnen Anweisungen ab. 3 Wiederverwendung von Programmteilen in anderem Kontext bedarf besonderer Vorsicht. Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Klassen, Objekte und Methoden Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Klassen, Objekte und Methoden im Überblick Java-Programme werden aus Klassen aufgebaut. Aus einer Klassendefinition lassen sich beliebig viele Objekte erzeugen, die auch Instanzen genannt werden (vgl. Arnold & Gosling [1], Kapitel 1.6 und 1.7). Eine Klasse enthält folgende Bestandteile: Objektvariablen (objektbezogene Datenfelder) objektbezogene Methoden Klassenvariablen (klassenbezogene Datenfelder) klassenbezogene Methoden Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Klassen, Objekte und Methoden im Überblick Java-Programme werden aus Klassen aufgebaut. Aus einer Klassendefinition lassen sich beliebig viele Objekte erzeugen, die auch Instanzen genannt werden (vgl. Arnold & Gosling [1], Kapitel 1.6 und 1.7). Eine Klasse enthält folgende Bestandteile: Objektvariablen (objektbezogene Datenfelder) objektbezogene Methoden Klassenvariablen (klassenbezogene Datenfelder) klassenbezogene Methoden Datenfelder (Synonym: Attribute) enthalten den Zustand des Objektes oder der Klasse. Methoden sind Sammlungen von imperativ formulierten Anweisungen, die auf den Datenfeldern operieren, um deren Zustand zu ändern. Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Klassen Beispiel der Deklaration einer einfachen Klasse: Beispiel (Klassendeklaration) class Point { double x, y; } Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Das Erzeugen von Objekten Objekte werden mit dem Schlüsselwort new erzeugt. Neu geschaffene Objekte bekommen innerhalb eines Bereiches des Speichers (welcher Heap genannt wird) einen Speicherplatz zugewiesen und werden dort abgelegt. Auf alle Objekte in Java wird über Objektreferenzen zugegriffen – jede Variable, die ein Objekt zu enthalten scheint, enthält tatsächlich eine Referenz auf dieses Objekt (bzw. auf deren Speicherplatz). Objektreferenzen haben den Wert null, wenn sie sich auf kein Objekt beziehen. Wir werden im folgenden Objekte und Objektreferenzen synonym verwenden, es sei denn, die Unterscheidung ist wichtig. Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Erzeugung und Initialisierung Beispiel (Erzeugung eines Objekts) Point lowerLeft = new Point(); Point upperRight = new Point(); Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Erzeugung und Initialisierung Beispiel (Erzeugung eines Objekts) Point lowerLeft = new Point(); Point upperRight = new Point(); Beispiel (Wertzuweisung) lowerLeft.x = 0.0; lowerLeft.y = 0.0; upperRight.x = 1280.0; upperRight.y = 1024.0; Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Klassenvariablen Beispiel (Klassenvariable) class Point { double x, y; static Point origin = new Point(); } Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Klassenvariablen Beispiel (Klassenvariable) class Point { double x, y; static Point origin = new Point(); } Beispiel (Klassenvariable als Konstante) static final Point origin = new Point(); Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Methoden Eine Methode ist eine Funktion bzw. Prozedur. Sie kann parameterlos sein oder Parameter haben. Sie kann einen Rückgabewert liefern oder als void deklariert sein, wenn sie keinen Wert zurückliefert. Methoden dürfen nicht geschachtelt werden. Innerhalb von Methoden dürfen lokale Variablen deklariert werden. Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Methoden Eine Methode ist eine Funktion bzw. Prozedur. Sie kann parameterlos sein oder Parameter haben. Sie kann einen Rückgabewert liefern oder als void deklariert sein, wenn sie keinen Wert zurückliefert. Methoden dürfen nicht geschachtelt werden. Innerhalb von Methoden dürfen lokale Variablen deklariert werden. Beispiel (Methoden) class Point { double x, y; void clear() { x = 0.0; y = 0.0; } } Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Um eine Methode aufzurufen, gibt man ein Objekt und den Methodennamen, getrennt durch einen Punkt, an. Beispiel (Methodenaufruf) lowerLeft.clear(); upperRight.clear(); Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Methode distance Beispiel (Definition der Methode distance) double distance(Point p) { double xdiff, ydiff; // lokale Variablen xdiff = x - p.x; ydiff = y - p.y; return Math.sqrt(xdiff*xdiff + ydiff*ydiff); } Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Methode distance Beispiel (Definition der Methode distance) double distance(Point p) { double xdiff, ydiff; // lokale Variablen xdiff = x - p.x; ydiff = y - p.y; return Math.sqrt(xdiff*xdiff + ydiff*ydiff); } Beispiel (Aufruf der Methode distance) double d = lowerLeft.distance(upperRight); Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Klassenbezogene Methoden Klassenbezogene Methoden werden durch das Schlüsselwort static deklariert, z.B. ist Math.sqrt() eine Klassenmethode der vordefinierten Klasse Math. Beispiel (Definition der klassenbezogenen Methode distance) static double distance(Point p1, Point p2) { double xdiff = p1.x - p2.x; double ydiff = p1.y - p2.y; return Math.sqrt(xdiff*xdiff + ydiff*ydiff); } Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Klassenbezogene Methoden Klassenbezogene Methoden werden durch das Schlüsselwort static deklariert, z.B. ist Math.sqrt() eine Klassenmethode der vordefinierten Klasse Math. Beispiel (Definition der klassenbezogenen Methode distance) static double distance(Point p1, Point p2) { double xdiff = p1.x - p2.x; double ydiff = p1.y - p2.y; return Math.sqrt(xdiff*xdiff + ydiff*ydiff); } Beispiel (Aufruf der klassenbezogenen Methode distance) double d = Point.distance(lowerLeft, upperRight); Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Vererbung, Pakete und Gültigkeitsbereiche Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Vererbung Klassen in Java können um zusätzliche Variablen und Methoden erweitert werden. Dies wird durch das Schlüsselwort extends angezeigt. Die entstehende Unterklasse besitzt dann alle Eigenschaften der Oberklasse und zusätzlich die in der jeweiligen Erweiterung angegebenen Eigenschaften. Dieses Konzept wird auch als Vererbung bezeichnet, weil die Unterklasse alle Eigenschaften der Oberklasse erbt. Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Vererbung Klassen in Java können um zusätzliche Variablen und Methoden erweitert werden. Dies wird durch das Schlüsselwort extends angezeigt. Die entstehende Unterklasse besitzt dann alle Eigenschaften der Oberklasse und zusätzlich die in der jeweiligen Erweiterung angegebenen Eigenschaften. Dieses Konzept wird auch als Vererbung bezeichnet, weil die Unterklasse alle Eigenschaften der Oberklasse erbt. Zum Beispiel ist ein farbiger Punkt eine Erweiterung eines Punktes: Beispiel class ColoredPoint extends Point { String color; } Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Pakete Bei größeren Softwareprojekten ist es häufig ratsam, diese in verschiedene, unabhängige Teile aufzuteilen. Solche Teile werden als Module oder Pakete bezeichnet. Java besitzt einige Eigenschaften, die es erlauben, Software modular aufzubauen: Verschiedene (i.d.R. logisch zusammengehörige) Klassen können in einem Paket zusammengefasst werden. Die Klassendefinitionen können in verschiedenen Dateien enthalten sein. Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Der Paketname muss im Header jeder Datei angegeben sein: Beispiel (A.java) package abc; public class A { ... } class B { ... } Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Der Paketname muss im Header jeder Datei angegeben sein: Beispiel (A.java) Beispiel (C.java) package abc; public class A { ... } package abc; class C { ... } class B { ... } Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Der Paketname muss im Header jeder Datei angegeben sein: Beispiel (A.java) Beispiel (C.java) package abc; public class A { ... } package abc; class C { ... } class B { ... } Beispiel (Sichtbarkeit) import abc.A; class test { A a; } Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Gültigkeitsbereiche zugreifbar für Nicht-Unterklassen im selben Paket zugreifbar für Unterklassen im selben Paket zugreifbar für Nicht-Unterklassen in einem anderen Paket zugreifbar für Unterklassen in einem anderen Paket Robert Giegerich A&D II, Vorlesung 2010 public ja default (package) ja protected ja private nein ja ja ja nein ja nein nein nein ja nein ja nein Universität Bielefeld Grundlegendes zu Java Klassen, Objekte und Methoden Vererbung, Pakete Weiterführende Literatur K. Arnold, J. Gosling: JavaTM - Die Programmiersprache. Addison-Wesley, 1996. T.H. Cormen, C.E. Leierson, R.L. Rivest: Introduction to Algorithms. MIT Press, 1990. D. Flanagan: Java in a Nutshell. O’Reilly & Associates Inc., 1996. F. Jobst: Programmieren in Java. Hanser Verlag, 1996. H. Klaeren: Vom Problem zum Programm. 2.Auflage, B.G. Teubner Verlag, 1991. K. Echtle, M. Goedicke: Lehrbuch der Programmierung mit Java. dpunkt-Verlag, 2000. Robert Giegerich A&D II, Vorlesung 2010 Universität Bielefeld