Pro Informatik 2009: Objektorientierte Programmierung Tag 11 Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik 31.08.2009 Agenda Tag 11 – Berechenbarkeit Programmiersprachen, Algorithmus, Berechenbarkeit, Registermaschinen, Turingmaschine, Halteproblem, Laufzeitanalyse, O-Notation Java-Dokumentation, Einführung in Eclipse Tag 12 – Objektorientierung II Wiederholung OOP, Innere Klassen, Anonyme Klassen, Vererbung, Typverträglichkeit, Verdecken, Ersetzen, Identifizieren, Überladen, Die Klasse Object Generizität Tag 13 – Spezifikation und Verifikation Formale Verfahren zur Spezifikation und Verifikation imperativer Programme, Assertions, partielle und totale Korrektheit, Hoare-Kalkül, Umwandlung von Rekursion zu Iteration Verschiedene Übungen zum Hoare-Kalkül Tag 14 – Software-Engineering Iterative Softwareentwicklung, UML, Softwareentwicklung im Team Entwicklungswerkzeuge, Entwurfsmuster Tag 15 – Programmiertechniken Top-Down, Bottom-Up, Rekursion, Brute Force, Greedy, Teile und Herrsche, Dynamisches Programmieren, Memoisation Klausurvorbereitung Pro Informatik 2009: Objektorientierte Programmierung 2 Agenda Tag 16 – Datenstrukturen Abstrakte Datentypen, ADT Folge: Stack, Queue, Liste, ADT Menge: Bäume: Binärbäume, Suchbäume, AVL-Bäume, Prioritätswarteschlangen, Heap, Graphen ADTs in Java Tag 17 – Sortieralgorithmen InsertionSort, BubbleSort, SelectionSort, ShellSort, MergeSort, QuickSort, Binary Tree Sort, HeapSort Untere Schranke für vergleichsbasierte Sortierverfahren, BucketSort, CountingSort, RadixSort Tag 18 – Suchalgorithmen Binärsuche, Breitensuche, Tiefensuche, Backtracking Klausurvorbereitung Tag 19 – Klausur Tag 20 – Letzter Tag Weitere Projekte am Fachbereich, Klausurnachbesprechung, Grillen? Pro Informatik 2009: Objektorientierte Programmierung 3 Organisatorisches Kontakt: Miao Wang Email: [email protected] Büro: R 136 Tutorien: SR 005, 006, 049 (Laptops) RR K38, K44, K46 (Pool-Rechner) Achtung: Am 04.09 ist SR 005 besetzt Übungen: Übungszettel mit Abgabe Programmierprojekt in Gruppen (2er, 3er) Klausur: Vorletzter Vorlesungstag: Do, 10.09.2009 Voraussetzung: Bearbeitung der Übungen, 20 € Kursgebühr Scheinnote entspricht Klausurnote Pro Informatik 2009: Objektorientierte Programmierung 4 BERECHENBARKEIT Pro Informatik 2009: Objektorientierte Programmierung 5 Programmiersprachen Pro Informatik 2009: Objektorientierte Programmierung 6 Programmiersprachen Pro Informatik 2009: Objektorientierte Programmierung 7 Programmiersprachen Programmierparadigma deklarativ imperativ (beschreibend, logisch) (befehls-, problemorientiert, prozedural) funktional relational prozedural objektorientiert (z.B. Haskell) (z.B. Prolog) (z.B. Pascal) (z.B. Java) f 0 = 1 f x = x*f(x-1) member(X,L):concat(L1,[X|L2],L) Keine Zuweisungen, keine Kontrollstrukturen, oftmals Rekursion. „ausführbare Spezifikation“ Pro Informatik 2009: Objektorientierte Programmierung y = 1; while (x>1) { y = x * y; x = x – 1; } Person p = new Person(“Hans”, 41); Zur Lösung eines Problems müssen die verfügbaren Operationen des Rechners durch geschickte Kombinationen verbunden werden. „rechnernahe Implementierung“ 8 Relevante Programmiersprachen im Studium an der FU 1959 Lisp relational 1965 Basic prozedural 1971 Pascal prozedural 1972 C prozedural 1975 Prolog relational 1985 C++ objektorientiert 1987 Perl objektorientiert 1990 Haskell funktional 1995 Delphi objektorientiert 1995 Java objektorientiert 2000 C# objektorientiert Pro Informatik 2009: Objektorientierte Programmierung Hohe Relevanz für Studium am Fachbereich Mathematik/Informatik an der FU-Berlin 9 Funktionale vs. Imperative Programmierung Funktionale Programme: Definition von Ausdrücken (expressions) Berechnung: Auswertung von Ausdrücken (liefern Wert) Variablen: Namen für Ausdrücke oder Werte f 0 = 1 f x = x*f(x-1) Pro Informatik 2009: Objektorientierte Programmierung Imperative Programme: Anweisungsfolgen (Befehle, statements) a1, a2, a3, … imperare (lat.) = befehlen Berechnung/Programmausführung: Ausführung der Anweisungen, bewirkt Effekte durch Änderung von Zuständen von Variablen (u.a.) Variablen: Namen von Behältern für Werte (d.h. Speicherzellen), enthalten einen Wert, der durch einen anderen Wert ersetzt werden kann. y = 1; while (x>1) { y = x * y; x = x – 1; } 10 Funktionale vs. Imperative Programmierung f 0 = 1 f x = x*f(x-1) y = 1; while (x>1) { y = x * y; x = x – 1; } x=3 f (x-1) x=2 f (x-1) x=1 f (x-1) x=3; x=0 f (0)=1 1*1 y = 1; while (x>1) { y = x * y; x = x – 1; } X 1 Y 6 2*1 3*2 f 3 hat den Wert 6 (und f 2 = 2 ) vier unterschiedliche Werte mit dem Namen x, es wird kein y benötigt Pro Informatik 2009: Objektorientierte Programmierung systematische Veränderung von zwei Speicherzellen 11 Haskell Oft sehen Programme in Haskell sehr elegant aus und dienen der Spezifikation von höheren Programmiersprachen. In Haskell wird die Unterscheidung von Datentypen geschult. Als Beispiel sehen wir die member-Funktion member :: Int -> [Int] -> Bool member b [] = False member b (a:x) = (a==b) || member b x und die Fakultäts-Funktion fac :: Int -> Int fac 0 = 1 fac n = n * fac (n-1) Der QuickSort-Algorithmus läßt sich sehr kurz formulieren: qSort [] = [] qSort (a:x) = qSort[y|y<-x,y<=a] ++ [a] ++ qSort[y|y<-x,y>a] Literaturhinweis: Haskell – The Craft of Functional Programming, 2. Auflage, Simon Thompson, Addison-Wesley, 1999 Pro Informatik 2009: Objektorientierte Programmierung 12 Haskell Spezifikation einer Funktion Mathematik: Spezifikation einer Funktion { f(x) = 1 x * f(x-1) , für x=0 , für x>0 undefiniert für x<0 Informatik: funktionales Programm f 0 = 1 f x = x*f(x-1) Informatik: imperativer Algorithmus und imperatives Programm setze y=1; solange x>1, wiederhole: setze y auf x*y und x auf x-1 Pro Informatik 2009: Objektorientierte Programmierung y = 1; while (x>1) { y = x * y; x = x – 1; } 13 Prolog Logische Programmierung mit Prolog Prolog ist die „Sprache der KI“. Wir können Regeln definieren und automatisch schlussfolgern. Prolog ist eine sehr mächtige Sprache, da eine automatische, optimierte Suche hinter den Kulissen arbeitet. Es folgen ein paar Beispiele. Ist X Element einer Liste L? ?member (c, [a,b,c]). yes ?member (X, [a,b]). X=a; X=b; Definition des member-Prädikats: member(X, [X|T]). member(X, [Y|T]) :- member (X, T). Literaturhinweis: PROLOG - Programming for Artificial Intelligence", 3.Auflage, Pearson Verlag, 2001 Pro Informatik 2009: Objektorientierte Programmierung 14 Prolog Logische Programmierung mit Prolog Die Konkatenation von Listen lässt sich elegant formulieren concat ([], L, L). concat ([X|L1], L2, [X|L3]) :- concat(L1, L2, L3). Mit Hilfe des concat-Prädikats, können wir member ausdrücken member(X, L) :- concat(_, [X|_], L). Wir können Elemente von Listen entfernen und neue Listen beschreiben del(X, [X|Tail], Tail). del(X, [Y|Tail], [Y|Tail2]) :- del(X, Tail, Tail2). Mit del können wir sogar insert ausdrücken insert(X, List, List_with_X) :- del(X, List_with_X, List). Oder kurz mal alle Permutationen perm([],[]). perm([X|L],P) :- perm(L, L1), insert(X,L1,P). Mehr dazu in Vorlesung: „Künstliche Intelligenz“ Pro Informatik 2009: Objektorientierte Programmierung 15 C/C++ C als Implementierungsprache für UNIX entwickelt (Kernighan, Ritchie, ATT Labs, 1970) ursprünglich reine Systemimplementierungssprache, Bedeutung erst durch Verbreitung UNIX Heute noch oft benutzt für Betriebssyteme, Echtzeitsysteme, hardwarenahe Systeme #include <stdio.h> int main(void) { printf("Hallo Welt!\n"); return 0; } Später (Bjarne Stroustrup, 1979) weiterentwickelt zu C++ mit Objektorientierung #include <iostream> #include <ostream> int main() { std::cout << "Hallo Welt!" << std::endl; } Liste von Hello-World Programmen: http://de.wikipedia.org/wiki/Liste_von_Hallo-Welt-Programmen/Programmiersprachen Pro Informatik 2009: Objektorientierte Programmierung 16 Skriptsprachen Skriptsprachen sind Programmiersprachen, die vor allem für kleine, überschaubare Programmieraufgaben gedacht sind. Sie sind meist wenig restriktiv, was die Sprachelemente angeht. Eigenschaften • oft interpretiert • liberale Typen, oft kein Zwang zur Deklaration von Variablen • implizite Typwandlung • automatische Speicherverwaltung Anwendungen • einfache Aufgaben • Prototyp erstellen (rapid prototyping) • Betriebssystemkommandosprache Beispiele • Python, PHP, Perl, Ruby, Javascript ( ≠ Java !), Tcl, Bash, C-Shell, Basic, …, Lisp (?) Pro Informatik 2009: Objektorientierte Programmierung 17 Traditioneller Algorithmusbegriff Algorithmus (algorithm) benannt nach AlKhwarizmi (arab. Mathematiker, 9.Jhd.) Ein Algorithmus abstrahiert von Rechnerhardware und konkreter Programmiersprache und ist imperativ (!). Ein Algorithmus ist ein schrittweises Verfahren zur Lösung einer Klasse gleichartiger Problemen mit folgenden Eigenschaften: 1. 2. 3. 4. 5. 6. Jeder Einzelschritt ist für ausführenden Instanz eindeutig verständlich und ausführbar Das Verfahren ist endlich beschreibbar Optional: Der nächste auszuführende Schritt ist eindeutig bestimmt Optional: Das Verfahren terminiert Optional: Das Verfahren ist determiniert Optional: Das Verfahren ist deterministisch Gilt Punkt 3, so ist der Algorithmus sequentiell, ansonsten nichtsequentiell (concurrent). Gilt Punkt 4, so ist der Algorithmus terminierend, ansonsten nichtterminierend. Gilt Punkt 5, so ist der Algorithmus determiniert, ansonsten nicht determiniert. Gilt Punkt 6, so ist der Algorithmus deterministisch, ansonsten nichtdeterministisch. Pro Informatik 2009: Objektorientierte Programmierung 18 Traditioneller Algorithmusbegriff Sequentiell? y=11; x=3; m=0; while (y>=x) { y=y-x || m=m+1; } Reihenfolge beliebig Termination? y=0; x=3; while (x>1) { y=y*x } Determiniert? Der Algorithmus liefert stets das gleiche Ergebnis bei gleichen Startbedingungen und Eingaben Deterministisch? Während des Algorithmus ist der nächste Handlungsschritt eindeutig definiert. Pro Informatik 2009: Objektorientierte Programmierung 19 Vom Algorithmus zum ausführbaren Programm Compiler (z.B. C, C++) Idee/Algorithmus Programmieren (Coding) Programm als Quellcode in höherer Programmiersprache Übersetzung (Compiler) Ausführbares Programm Binden mit anderen (Hilfs-)Programmen (Linker) Pro Informatik 2009: Objektorientierte Programmierung Programm in Maschinensprache 20 Vom Algorithmus zum ausführbaren Programm Interpreter (z.B. Prolog, C#, Java) Idee/Algorithmus Programmieren (Coding) Programm als Quellcode in höherer Programmiersprache Interpretation Interpretierer Heute: Keine klare Trennung mehr zwischen Übersetzung und Interpretation, meist erst Übersetzung in Byte-Code / Intermediate Language Pro Informatik 2009: Objektorientierte Programmierung 21 Vom Algorithmus zum ausführbaren Programm Java: Übersetzung (Compiler) Java-Quellcode class xyz { … } javac Java Bytecode bnc 0xE.. sto 0xF.. Interpretation plattformunabhängiger Maschinencode plattformabhängiger Maschinencode JVM Intel, Sun, Sparc Win / Mac / Solaris / Linux Pro Informatik 2009: Objektorientierte Programmierung 22 Berechenbarkeit Definition: „Eine Funktion ist berechenbar, wenn es einen Algorithmus gibt, der die Funktion berechnet“ Eingabe n Funktion f Ausgabe f(n) Algorithmus A Sei T der Definitionsbereich von f A berechnet f, wenn Eingabe n in T liegt und A nach einer endlichen Zahl von Schritten f(n) liefert Liegt n nicht in T, so terminiert A nicht f ist somit eine partielle Funktion Frage: Welche Funktionen sind berechenbar? Gibt es Funktionen, die überhaupt nicht berechenbar sind? Literaturhinweis: Theoretische Informatik – kurzgefaßt, 3. Auflage, Uwe Schöning, Spektrum Akademischer Verlag, 2001 Pro Informatik 2009: Objektorientierte Programmierung 23 Entscheidbarkeit Definition: „Eine Funktion ist entscheidbar, wenn sie eine charakteristische Funktion repräsentiert und diese entscheidbar ist“ Eingabe n Funktion f ja wenn n in T nein sonst Algorithmus A Entscheidbar: f gibt ja aus, wenn n in T - ansonsten nein Semi-entscheidbar: f gibt ja aus, wenn n in T – ansonsten undefiniert Unentscheidbar Pro Informatik 2009: Objektorientierte Programmierung 24 Turingmaschine Die Turingmaschine dient als einfaches Rechnermodell: • Ein unendlich langes Speicherband mit Feldern, auf dem jeweils ein Zeichen gespeichert werden kann • Ein programmierbaren Schreib-Lesekopf, der sich auf dem Band feldweise bewegen kann und die Zeichen lesen oder ändern kann Pro Informatik 2009: Objektorientierte Programmierung 25 Nicht entscheidbare Probleme: Halteproblem Das Halteproblem von Turingmaschinen ist ein Standardbeispiel für ein nicht entscheidbares Problem [Alan Turing, 1936]: Kann man ein Programm A entwickeln, das als Eingabe ein anderes Programm B und einen Eingabewert n erhält und entscheiden kann, ob das andere Programm B terminiert? Antwort: Nein Pro Informatik 2009: Objektorientierte Programmierung 26 Nicht entscheidbare Probleme: Halteproblem Beweis Angenommen es gibt ein Programm A, welches folgendes tut: A(Programm B, Eingabe n): if A(n) terminiert return Ja else return Nein Und ein Programm T: T(Programm X): while A(X,X) == Ja continue else return Ja Was passiert, wenn eine Turingmaschine T(T) aufruft? Dann liefert T(T) entweder Ja oder bleibt in einer Endlosschleife Terminiert T(T) und liefert Ja, dann lieferte A(T,T) Nein. Das bedeutet wiederum, dass T(T) nicht terminiert. Widerspruch! Terminiert T(T) nicht, dann lieferte A(T,T) Ja. Das bedeutet wiederum, das T(T) terminiert. Widerspruch! Es gibt keine Turingmaschine, die das Halteproblem entscheiden kann! Pro Informatik 2009: Objektorientierte Programmierung 27 Registermaschine Die Registermaschine (RAM-Modell) ist ein weiteres Rechnermodell, das etwas ähnlicher ist zu heutigen Rechnern als die Turingmaschinen: • Ein Befehlszeiger p • Eine Eingabe n • Eine Ausgabe o • Ein unendlich großer, durchnummerierter Registerspeicher: r1, r2, r3, etc.. Operationen werden durch den Befehlssatz einer Programmiersprache festgelegt. Pro Informatik 2009: Objektorientierte Programmierung 28 LOOP-Registermaschine Befehlssatz einer LOOP-Registermaschine xi = xj + c xi = xj – c LOOP xi {<Befehlsfolge>} c: konstante natürliche Zahl Addition wie üblich Subtraktion: xi erhält den Wert xj – c, wenn xj – c ≥ 0 sonst 0 Beispiel: Multiplikation xi = xj * xk LOOP xi {xi = xi - 1} LOOP xj {xi = xi + xk} Mit LOOP-Programmen kann man genau die primitiv rekursiven Funktionen fk :: Nk → N berechnen. Aber das sind bekanntlich nicht alle berechenbaren Funktionen. Pro Informatik 2009: Objektorientierte Programmierung 29 Primitiv Rekursive Funktionen 1. Die k-stellige Nullfunktion, die immer 0 ausgibt: 2. Die Nachfolgerfunktion 3. Die k-stellige Projektionen 4. Die Komposition m-stellige Funktion g m n-stellige Funktionen h 5. Die primitive Rekursion zweier Funktionen Alle primitiv-rekursiven Funktionen sind im intuitiven Sinn berechenbar. Sie schöpfen aber nicht alle intuitiv berechenbaren Funktionen aus. Beispiel: Die Ackermannfunktion. Pro Informatik 2009: Objektorientierte Programmierung 30 Ackermannfunktion Die Ackermannfunktion (Ackermann 1926) ist eine extrem schnell wachsende mathematische Funktion, die berechenbar ist, aber nicht primitiv rekursiv: Literaturhinweis: Theoretische Informatik – kurzgefaßt, 3. Auflage, Uwe Schöning, Spektrum Akademischer Verlag, 2001 Pro Informatik 2009: Objektorientierte Programmierung 31 WHILE-Registermaschine Damit die Registermaschine, alle intuitiv berechenbaren Funktionen realisieren kann, ist eine Spracherweiterung nötig. xi = xj + c xi = xj – c WHILE (xi ≠ 0) {<Befehlsfolge>} Führe <Befehlsfolge> solange aus bis xi den Wert 0 hat Die WHILE-Registermaschine kann alle berechenbaren Funktionen realisieren und somit auch alle LOOP-Programme. Pro Informatik 2009: Objektorientierte Programmierung 32 GOTO-Registermaschine Alternativ gibt es den GOTO-Befehlssatz. xi = xj + c xi = xj – c if xi=c then GOTO Mj GOTO Mj HALT Die Klasse der GOTO-Programme ist gleich der Klasse der WHILE-Programme Literaturhinweis: Go To Statement Considered Harmful, E. W. Dijkstra, Communications of the ACM, Vol.11, No.3, 1968, pp. 147–148 Pro Informatik 2009: Objektorientierte Programmierung 33 LAUFZEITANALYSE Pro Informatik 2009: Objektorientierte Programmierung 35 Laufzeitanalyse Die Laufzeit T(n) eines Algorithmus ist die maximale Anzahl der Schritte bei einer Eingabegröße n. Wie man die Größe einer Eingabe misst, muss konkret festgelegt werden, z.B. für Sortieralgorithmen wählt man sinnvollerweise die Anzahl der zu sortierenden Objekte. Welche Schritte dabei gezählt werden (z.B. arithmetische Operationen, Vergleiche, Speicherzugriffe, Wertzuweisungen) hängt sehr stark von dem verwendeten Modell oder der verwendeten Programmiersprache ab. Sogar ein Compiler kann Einfluss auf die Anzahl der Schritte haben. Oft unterscheiden sich die Laufzeiten des gleichen Algorithmus’ unter Zugrundelegung verschiedener Modelle um konstante Faktoren. Das Ziel der Laufzeitanalyse besteht darin, den Einfluss solcher modell- und implementierungsabhängiger Faktoren auszublenden und damit einen davon unabhängigen Vergleich von Laufzeiten zu ermöglichen. Literaturhinweis: Algorithmen – kurz gefasst, Uwe Schöning, Spektrum Akademischer Verlag, 1997 Pro Informatik 2009: Objektorientierte Programmierung 36 Konstante Laufzeit Einfaches Beispiel: int constFunction (int[] n) { int i = 2*12+2; // 2 Schritte return i; } Die Funktion constFunction benötigt in Bezug auf die Eingabegröße n 2 Arbeitsschritte. Unabhängig von der Eingabe benötigt die Funktion konstant viele Arbeitsschritte. Wir sprechen dann von konstanter Laufzeit. int constFunction2 (int[] n) { int i = 0; // 1 Schritt while(i < 10) { // 10 mal i++; // 1 Schritt } return i; } Auch constFunction2 benötigt eine konstante Anzahl an Arbeitsschritten. Von der asymptotischen Laufzeit her unterscheiden sich die beiden Funktionen nicht. Pro Informatik 2009: Objektorientierte Programmierung 37 Lineare Laufzeit Einfaches Beispiel: int sumFunction (int[] n) { int sum = 0; for (int i=0; i<n.length; i++) sum = sum + n[i]; // 1 Schritt // n-mal // 1 Schritt return sum; } Die Funktion sumFunction benötigt in Bezug auf die Eingabegröße n folgende Arbeitsschritte: sumFunction(n) = 1 + n * 1 = n+1 Für diese Fälle wollen wir konstante Werte, die keinen signifikanten Einfluss haben, weglassen. Für dieses Beispiel ergebe sich sumFunction(n) = n, dann sprechen wir von linearer Laufzeit. Pro Informatik 2009: Objektorientierte Programmierung 38 Asymptotische Betrachtung Vergleich von Laufzeiten bezieht sich auf das langfristige Verhalten. Konstanten können daher ignoriert werden. Bei der asymptotischen Betrachtung interessieren wir uns für den höchsten Term, z.B. O(n4 + 7000n3 + 900n2 + 10000n + 1000000) = O(n4) Pro Informatik 2009: Objektorientierte Programmierung 39 O-Notation Die Landau-Symbole werden verwendet, um Laufzeiten für Algorithmen anzugeben und vergleichen zu können: Asymptotische Schranken in O-Notation: Pro Informatik 2009: Objektorientierte Programmierung 40 O-Notation Pro Informatik 2009: Objektorientierte Programmierung 41 Asymptotische Laufzeitklassen int constFunction (int[] n) { int i = 2*12+2; return i; } // 2 Schritte Unsere constFunction liegt also in O(2) = O(1) int sumFunction (int[] n) { int sum = 0; for (int i=0; i<n.length; i++) sum = sum + n[i]; // 1 Schritt // n-mal // 1 Schritt return sum; } Unsere sumFunction liegt in O(n+2) = O(n) Welche Laufzeiten haben folgende Funktionen? • Finden des Maximums aus einem Array mit n natürlichen Zahlen • Finden des Minimums aus einem Array mit n reellen Zahlen • Multiplikation einer mxn Matrix mit einer nxk Matrix Pro Informatik 2009: Objektorientierte Programmierung 42 Asymptotische Laufzeitklassen Übliche Laufzeiten: Kannst du diese Laufzeiten der Größe nach sortieren? Pro Informatik 2009: Objektorientierte Programmierung 43 Speicherbedarfanalyse Genauso wie über die Laufzeit eine asymptotische Analyse geführt werden kann, so geht das auch mit dem Speicherbedarf. int sumFunction (int[] n) { int sum = 0; for (int i=0; i<n.length; i++) sum = sum + n[i]; // 1 Schritt // n-mal // 1 Schritt return sum; } Die Summe eines Zahlenarrays: Laufzeit liegt in O(n), Speicherbedarf in O(n). int potenz (int b, int n) { int p = 1; for (int i=0; i<n; i++) p *= b; // 1 Schritt // n-mal // 1 Schritt return p; } Berechnung der n-ten Potenz (naiv): Laufzeit liegt in O(n), Speicherbedarf bei O(1) Pro Informatik 2009: Objektorientierte Programmierung 44 PAUSE Pro Informatik 2009: Objektorientierte Programmierung 45 Java Dokumentation Die wichtigsten Anlaufstellen: • Java 2 Platform, Standard Edition, v 1.4.2 API Specification http://java.sun.com/j2se/1.4.2/docs/api/ • Java 2 Platform Standard Edition 5.0 API Specification http://java.sun.com/j2se/1.5.0/docs/api/ • Java™ Platform, Standard Edition 6 API Specification http://java.sun.com/javase/6/docs/api/ • Galileo Computing Openbook: Java ist auch eine Insel (8. Auflage) http://openbook.galileocomputing.de/javainsel8/ • B. Eckel: Thinking in Java , Prentice Hall, 2006 http://www.codeguru.com/java/tij/ • Java-Tutorial von Sun http://java.sun.com/docs/books/tutorial/ Bei Fragen: • unser Forum: http://www.java-uni.de/forum/ Pro Informatik 2009: Objektorientierte Programmierung 46 Eclipse Eclipse ist eine integrierte Entwicklungsumgebung (IDE) für Java www.eclipse.org Pro Informatik 2009: Objektorientierte Programmierung 47 Eclipse Roadmap: • • • • • • • • • • • • • Eclipse installieren Eclipse starten und kennenlernen Einstellungen Workspace und Projekte Views und Perspektiven Klasse erstellen Interface erstellen In Eclipse Methodendokumentation anschauen Auto-Generator Refactoring Shortcuts Jar erstellen Debuggen Pro Informatik 2009: Objektorientierte Programmierung 48