Grundlagen der Programmierung. Eine Einführung mit Java Jürn Laun VHS Murrhardt März 2009 Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Teil I 6. März 2009 1 Einführung 2 Grundlagen der objektorientierten Programmierung 3 Entwicklungsumgebung Eclipse Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse (De)Motivation Inhalt und Ziele Die Sprache Die Werkzeuge Was fehlt (De)Motivation Programmieren kann man lernen, aber nicht lehren! Warum trotzdem teilnehmen? Einige Konzepte sind doch vermittelbar Kurs beinhaltet viele Übungen und praktische Anwendungen Fehlersuche ist frustrierend Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse (De)Motivation Inhalt und Ziele Die Sprache Die Werkzeuge Was fehlt Nach dem Kurs. . . . . . kennen Sie die wichtigsten Elemente einer objektorientierten Programmiersprache . . . können Sie kleine Programme selbst schreiben . . . sind Sie in der Lage, sich alles Übrige selbst beizubringen Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse (De)Motivation Inhalt und Ziele Die Sprache Die Werkzeuge Was fehlt Die Sprache Java Sun Microsystems 1991 Warum Java (und nicht Pascal,C++,C#,. . . )? Warum nicht? Objektorientierung (relativ) saubere Konzepte Einfache Erlernbarkeit Verfügbarkeit auf allen Systemen und Portierbarkeit Verbreitung Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse (De)Motivation Inhalt und Ziele Die Sprache Die Werkzeuge Was fehlt Die Werkzeuge Der Baukasten Wir arbeiten mit dem Java SE Development Kit (JDK). Verfügbar für nahezu alle Betriebssysteme „normaler” PC. Kann von http://java.sun.com/ heruntergeladen werden. Entwicklung für andere Plattformen: Java EE, Java ME Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse (De)Motivation Inhalt und Ziele Die Sprache Die Werkzeuge Was fehlt Die Werkzeuge Der Compiler: javac Prüft und übersetzt den Quellcode in ein (lauffähiges) Programm. Der Interpreter: java Führt das Programm aus. Die Entwicklungsumgebung: Eclipse Vereint alle Funktionalität unter einer Oberfläche: Editieren, Kompilieren, Debuggen, . . . Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse (De)Motivation Inhalt und Ziele Die Sprache Die Werkzeuge Was fehlt Dieser Kurs deckt nicht ab: konzeptuell unwichtige Details der Java-Syntax völlig abgedrehte Konzepte objektorientierter Programmiersprachen wie Templates und Mehrfachvererbung Feinheiten der GUI-Programmierung Java EE und ME Webapplikationen Weitere Java-eigene und -nahe Technologien wie Applets (ansatzweise, wenn die Zeit reicht), Beans, Servlets, Javadoc, ... Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse (De)Motivation Inhalt und Ziele Die Sprache Die Werkzeuge Was fehlt Und Sie? Vorkenntnisse? Erwartungen? Wünsche? ... Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse (De)Motivation Inhalt und Ziele Die Sprache Die Werkzeuge Was fehlt Inhalt 1 Einführung 2 Grundlagen der objektorientierten Programmierung 3 Entwicklungsumgebung Eclipse 4 Strukturierte Programmierung in Java 5 Objektorientierte Programmierung in Java (Teil I) 6 Objektorientierte Programmierung in Java (Teil II) 7 Projekt (Teil I) 8 Weitere Techniken und Features von Java 9 Projekt (Teil II) 10 Ausblick Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Hallo, Welt! Hallo.java public class Hallo { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { System . o u t . p r i n t l n ( " H a l l o , ␣ Welt ! " ) ; } } Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Klassen und Objekte Objekte Objekte sind Repräsentationen von realen oder abstrakten Dingen im Speicher. Objekte besitzen Daten („Eigenschaften”) und Aktionen („Methoden”). Klassen Klassen beschreiben den Typ eines Objekts. Jedes Objekt ist Instanz einer Klasse. Eine Klasse kann keine, eine oder viele Instanzen haben. Wir fassen Objekte nie direkt an, sondern benutzen Referenzen. Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Beispiel: In Bildern... drucken( ) void ) void em ai lS Jürn Laun n( tri n(S de en Murrhardt” !strasse=“Obere Schulgasse 7” !plz=71540 !ort=”Murrhardt” !email=”[email protected]” boolean plz Pru ef e ng text) !name=“VHS Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Klassen und Objekte Objekte Objekte sind Repräsentationen von realen oder abstrakten Dingen im Speicher. Objekte besitzen Daten („Eigenschaften”) und Aktionen („Methoden”). Klassen Klassen beschreiben den Typ eines Objekts. Jedes Objekt ist Instanz einer Klasse. Eine Klasse kann keine, eine oder viele Instanzen haben. Wir fassen Objekte nie direkt an, sondern benutzen Referenzen. Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Beispiel: In Bildern... Adresse drucken( ) void meineAdresse Eigenschaften !String name !String strasse !Integer plz !String ort !String email tri n(S de en n( ng text) tri n(S void em ai lS de en ) ) void em ai lS Jürn Laun boolean plz Pru ef e Murrhardt” !strasse=“Obere Schulgasse 7” !plz=71540 !ort=”Murrhardt” !email=”[email protected]” n( !name=“VHS boolean plz Pru ef e drucken() void Methoden !void drucken() !boolean plzPruefen() !void emailSenden(String text) Mittel” !strasse=“Mittelgasse 5” !plz=12321 !ort=”Mittelbach” !email=”[email protected]” ng text) !name=“Max maxensAdresse maxensVHS Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Beispiel: In Java... A d r e s s e m e i n e A d r e s s e , m a x e n s A d r e s s e , maxensVHS ; meineAdresse meineAdresse meineAdresse meineAdresse meineAdresse meineAdresse = new A d r e s s e ( ) ; . name = "VHS␣ M u r r h a r d t " ; . s t r a s s e = " Obere ␣ S c h u l g a s s e ␣ 7 " ; . p l z = 71540; . or t = " Murrhardt" ; . e m a i l = " i n f o @ v h s −m u r r h a r d t . de " ; meineAdresse . drucken ( ) ; m e i n e A d r e s s e . e m a i l S e n d e n ( " H a l l o , ␣VHS ! " ) ; m a x e n s A d r e s s e = new A d r e s s e ( ) ; // . . . maxensVHS = m e i n e A d r e s s e ; Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Der Umgang mit Objekten Objekte anlegen (Objekt ist Instanz einer Klasse!) Klasse referenz ; r e f e r e n z = new K l a s s e (< e v t l . Parameter >); Oder auf einmal: K l a s s e r e f e r e n z = new K l a s s e (< e v t l . Parameter >); null Referenzen, die (noch) auf keine Instanz zeigen (z.B. direkt nach der ersten Zeile im obigen Beispiel), haben den speziellen Wert null . Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Der Umgang mit Objekten Objekte verwenden („dot notation”) // Z u g r i f f a u f E i g e n s c h a f t e n referenz . eigenschaft = . . . ; System . o u t . p r i n t l n ( r e f e r e n z . e i g e n s c h a f t ) ; // Z u g r i f f a u f Methoden r e f e r e n z . methode(< Parameter >); . . . = r e f e r e n z . methode2 (< Parameter >); Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Der Umgang mit Objekten Objekte löschen? Nicht nötig! Java hat Garbage Collection - Objekt wird gelöscht, sobald es keine Referenzen mehr darauf gibt. Klasse ref1 , ref2 ; r e f 1 = new K l a s s e ( ) ; ref2 = ref1 ; // r e f 1 a u f n u l l s e t z e n ref1 = null ; // noch e x i s t i e r t d a s O b j e k t ! ref2 = null ; // e r s t j e t z t w i r d e s ( i r g e n d w a n n ) g e l ö s c h t . Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Beispiel mit echten Java-Klassen Beispiel // R e f e r e n z f ü r O b j e k t e vom Typ I n t e g e r I n t e g e r meineZahl ; // E r z e u g e n e i n e s I n t e g e r −O b j e k t e s ( i n i t i a l i s i e r t m i t 5 ) m e i n e Z a h l = new I n t e g e r ( 5 ) ; // A u f r u f e n d e r Methode t o S t r i n g S t r i n g meinString = meineZahl . t o S t r i n g ( ) ; // E r z e u g e n e i n e s z w e i t e n I n t e g e r −O b j e k t e s I n t e g e r a n d e r e Z a h l = new I n t e g e r ( 1 7 ) ; // Methode compareTo a u f r u f e n und E r g e b n i s a u s g e b e n System . o u t . p r i n t l n ( m e i n e Z a h l . compareTo ( a n d e r e Z a h l ) ) ; Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Einige Java-eigene Klassen und Methoden Genaue Beschreibungen aller Klassen und deren Eigenschaften und Methoden in der API-Referenz [2] Klasse Methode Beschreibung String boolean startsWith ( String ) String replace ( char s , char r ) String toUpperCase() String concat( String ) Zeichenketten vergleicht Strings ohne Beachtung von Groß-/Kleinschreibung prüft, ob der String mit einem anderen beginnt ersetzt alle Zeichen s durch r wandelt den String in Großbuchstaben um hängt einen String an einen anderen void print ( String ) void println ( String ) Ausgabestrom - etwas, in das man „hineinschreiben” kann, z.B. Konsole, Dateien, . . . System.out ist Instanz von PrintStream schreibt einen String in den Ausgabestrom schreibt einen String und geht in die nächste Zeile String readLine () Repräsentiert die Konsole („Eingabeaufforderung”) System.console() gibt eine Instanz zurück liest einen String von der Konsole boolean equalsIgnoreCase ( String ) PrintStream Console Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Die hat doch jeder... Einige Methoden existieren in jeder Klasse: // v e r g l e i c h t d a s O b j e k t m i t einem a n d e r e n d e r s e l b e n K l a s s e b o o l e a n e q u a l s (K) // e r s t e l l t K clone () e i n e Kopie des O b je k t s // B e i s p i e l : K r e f 1 = new K ( ) , r e f 2 ; ref2 = ref1 ; // i s t e t w a s a n d e r e s a l s K r e f 1 = new K ( ) , r e f 2 ; ref2 = ref1 . clone ( ) ; // g e n e r i e r t e i n e Z e i c h e n k e t t e , d i e d a s O b j e k t b e s c h r e i b t String toString () Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Hallo, Welt! Klassen, Objekte und Referenzen Üben und Vertiefen 1 2 3 Erweitern Sie Hallo.java zu einem Programm Hallo2.java, das den Benutzer zunächst nach seinem Namen fragt und ihn dann mit „Hallo, <Name>!” begrüßt. Kompilieren Sie das Programm, indem Sie in der Konsole in das Verzeichnis von Hallo2.java wechseln und javac Hallo2.java eingeben. Beseitigen Sie eventuell auftretende Fehler. Führen Sie das Programm mit java Hallo2 aus. Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Entwicklungsumgebung Eclipse Das Arbeiten mit Editor und Konsole ist mühsam. Deshalb verwenden wir die Entwicklungsumgebung (IDE - Integrated Development Environment) Eclipse: (Halb-)Automatisches Erzeugen von Klassen(-rümpfen) Hilfe beim Editieren (z.B. Einblenden von Methoden und Eigenschaften gerade verwendeter Klassen und Objekte) Automatisches Kompilieren im Hintergrund und Anzeigen der Fehler im Quellcode Debugging Jürn Laun Grundlagen der Programmierung Einführung Grundlagen der objektorientierten Programmierung Entwicklungsumgebung Eclipse Üben und Vertiefen 1 2 3 Erstellen Sie mit Eclipse ein Projekt Hallo, legen Sie eine Klasse desselben Namens und mit einer main-Methode an und implementieren Sie ein Programm, das „Hallo, Eclipse!” ausgibt. Öffnen Sie das vorbereitete Projekt Eclipse und führen Sie das Programm aus. Was passiert? Gehen Sie mit Hilfe des Debuggers schrittweise durch das Programm und versuchen Sie seine Arbeitsweise zu verstehen. Schreiben Sie ein Programm Datum, das das aktuelle Datum und die Uhrzeit ausgibt. Tipp: Die Klasse Date und die API-Referenz könnten hilfreich sein. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Teil II 7. März 2009 4 Strukturierte Programmierung in Java 5 Objektorientierte Programmierung in Java (Teil I) Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Grundlegende Syntax Jeder Befehl wird mit Semikolon (;) abgeschlossen Geschweifte Klammern {. . . } gruppieren Befehle zu Blöcken Kommentare werden vom Compiler ignoriert (sind aber für den Menschen umso wichtiger!) Einzeilig: von // bis zum Zeilenende Mehrzeilig: zwischen /* und */ JavaDoc: zwischen /** und */ Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Grundlegende Syntax Selbstgewählte Bezeichner (also Namen von Klassen, Objekten, . . . ) nur Buchstaben und Ziffern (keine Sonderzeichen außer _) beginnen immer mit einem Buchstaben keine reservierten Schlüsselwörter ( class , new,. . . ) auf Groß-/Kleinschreibung achten Üblich: Referenzen und Methoden klein, Klassen beginnen mit Großbuchstaben, mehrere Wörter mit gemischter Schreibweise (z.B. MeineKlasse, meinObjekt), Konstanten vollständig in Großbuchstaben (z.B. PI) Java-Sprachreferenz [1] Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Primitive Datentypen Spezielle Klassen, die besonders häufig gebraucht werden. Vor allem für numerische Daten: byte, short , int , long, float , double, boolean, char Aus Effizienzgründen keine echten Klassen: Keine Referenzen (= (Zuweisung) wirkt wie clone()) Keine Methoden Operatoren (z.B. +, -, *, /, %, !, ++, ==, < usw.) Sprechweise: „Typ” statt „Klasse”, „Variable” statt „Objekt” Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Beispiel: Kasse Ideale objektorientierte Sprache F l o a t p r e i s 1 , p r e i s 2 = new F l o a t ( 1 9 . 9 5 ) ; p r e i s 1 = new F l o a t ( 7 . 9 9 ) ; Float netto = p re is1 . addiere ( p re is2 ) ; F l o a t b r u t t o = n e t t o . m u l t i p l i z i e r e ( new F l o a t ( 1 . 1 9 ) ) ; System . o u t . p r i n t l n ( b r u t t o ) ; Java f l o a t p reis1 , p r e i s 2 = 19.95 f ; p r e i s 1 = 7.99 f ; f l o a t netto = p re is1 + pre i s2 ; f l o a t brutto = netto ∗ 1.19 f ; System . o u t . p r i n t l n ( b r u t t o ) ; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Umgang mit Variablen 1 Deklaration: Dem Compiler mitteilen, dass Speicherplatz reserviert werden soll. Optional Initialisierung. int i ; i n t j = 15; 2 Zuweisung: Einen Wert in einer Variable ablegen. i = 27; i = j; 3 Operationen: mit Werten (von Variablen) rechnen. i = ( j + 1) ∗ 3 ; j = 17 / 2 ; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Primitive Datentypen im Einzelnen: Ganze Zahlen Typ Werte Operatoren Varianten int −231 , . . . , 231 − 1 +, −, ∗ /, % (Division und Rest) ++, −− (In−/Dekrement) ==, !=, <, >, <=, >= (Vergleich) − (unär) byte (−128, . . . , 127) short (−215 , . . . , 215 − 1) long (−263 , . . . , 263 − 1) Jürn Laun int i = j + 3; int zeit = 92 % 24; i ++; boolean b = (a >= 7); int neg = −i; Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Primitive Datentypen im Einzelnen: Gleitkommazahlen Typ Werte Operatoren Varianten float ±1.4e − 45, . . . , ±3.4e38 +, −, ∗, / ==, !=, <, >, <=, >= (Vergleich) − (unär) double (±4.9e −324, . . . , ±1.8e308) Jürn Laun float x = y + 2.8f; boolean b = (a >= 7.0f); float neg = −x; Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Primitive Datentypen im Einzelnen: Zeichen Typ Werte Operatoren Besonderheiten char . . . ,’A’,’B’,. . . ,’a’,’b’,. . . ==, !=, <, >, <=, >= (Vergleich) ’n’ Zeilenumbruch ’\t ’ Tabulator ’\"’ Anführungszeichen ’ \’ ’ Apostroph ’\\’ Backslash ’\u0065’ Unicode-Zeichen Jürn Laun boolean b = (c == ’g’); Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Primitive Datentypen im Einzelnen: Wahrheitswerte Typ Werte Operatoren boolean true , false ! (Negation) && (logisches Und) || ( logisches Oder) Besonderheiten Rückgabewert der Vergleichsoperatoren Jürn Laun boolean erfolg = ! fehler ; boolean gueltig = (i > 0) && (i < 10); boolean antwort = (c==’j’) || (c==’n’); Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Typumwandlungen Wir können Variablen eines Typs in solche eines anderen Typs umwandeln: Typecasts int i = 5 , j = 7; f l o a t f = 2.4 f , g = 2.14 f , h = 3.8 f ; f = ( float ) i ; // J e t z t h a t f den Wert 5 . 0 f f = ( f l o a t ) ( i + j ) ; // Nun i s t f g l e i c h 1 2 . 0 f i = ( int )g; j = ( int )(h − g ); // i bekommt den Wert 2 // J e t z t h a t j den Wert 1 Bei Typumwandlungen können Daten verloren gehen! Nicht alle Typen lassen sich sinnvoll ineinander umwandeln. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Konstanten Variablen, deren Wert nicht geändert werden kann. Beispiel final f l o a t PI = 3 . 1 4 1 5 9 f ; f l o a t radius = 3.5 f ; f l o a t umfang = 2 . 0 f ∗ PI ∗ r a d i u s ; PI = 3 . 1 f ; // C o m p i l e r m e l d e t F e h l e r ! Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Eingabe Einlesen von Zeichenketten BufferedReader br = new B u f f e r e d R e a d e r ( new I n p u t S t r e a m R e a d e r ( System . i n ) ) ; S t rin g s = br . readLine ( ) ; Einlesen primitiver Datentypen BufferedReader br = new B u f f e r e d R e a d e r ( new I n p u t S t r e a m R e a d e r ( System . i n ) ) ; i n t i = I n t e g er . p a rs e I n t ( br . readLine ( ) ) ; f l o a t f = Float . p arseFloat ( br . readLine ( ) ) ; char c = ( char ) br . read ( ) ; In der ersten Zeile: import java . io .∗; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Ausgabe Ausgeben von primitiven Datentypen und Zeichenketten System . o u t . p r i n t ( 2 5 ) ; System . o u t . p r i n t l n ( 3 . 7 5 f ) ; System . o u t . p r i n t ( " H a l l o , ␣ Welt ! " ) ; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Üben und Vertiefen 1 2 Schreiben Sie ein Programm AddSub, das den Benutzer zwei Gleitkommazahlen eingeben lässt und deren Summe und Differenz berechnet. Schreiben Sie ein Programm DM2EUR, das einen vom Benutzer eingegebenen DM-Betrag in Euro umrechnet. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Felder Felder Felder sind Sammlungen mehrerer Variablen (oder Objekte) des gleichen Typs (oder der gleichen Klasse). Sie werden – wie Objekte – immer mit Referenzen verwendet und mit new angelegt. Auch dann, wenn sie primitive Typen enthalten! Beispiel int [] feld ; f e l d = new i n t [ 1 0 0 ] ; f e l d [ 0 ] = 17; int i = feld [29]; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Felder length Jedes Feld-Objekt hat eine Eigenschaft length vom Typ int , welche die Anzahl der Feldelemente angibt. Die Elemente eines Feldes sind von 0 bis feld . length−1 indiziert. Felder von Objekten Enthält das Feld Objekte, dann erzeugt Klasse [ ] fe ld ; f e l d = new K l a s s e [ 1 0 0 ] ; nur die Referenzen, nicht die hundert Objekte selbst! Das muss in einem zweiten Schritt getan werden: f e l d [ 0 ] = new K l a s s e ( ) ; f e l d [ 1 ] = new K l a s s e ( ) ; // . . . Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Mehrdimensionale Felder Es gibt auch Felder mit Elementen vom Typ int [] (analog für andere Typen oder Klassen als int ), also Felder von Feldern: int [ ] [ ] feldfeld ; f e l d f e l d = new i n t [ 3 ] [ ] ; ist nun ein Feld von (Referenzen auf) int -Felder, welches im Moment aber nur null-Referenzen enthält. feldfeld feldfeld feldfeld feldfeld feldfeld [ 0 ] = new i n t [ 4 ] ; [ 1 ] = new i n t [ 7 ] ; [ 2 ] = new i n t [ 2 ] ; [ 1 ] [ 5 ] = 13; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Mehrdimensionale Felder feldfeld 13 Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Mehrdimensionale Felder Es geht auch kürzer: Sollen alle Einzelfelder gleich groß sein, so können wir anstelle von int [ ] [ ] feldfeld feldfeld feldfeld feldfeld feldfeld ; = new i n t [ 0 ] = new [ 1 ] = new [ 2 ] = new [3][]; int [4] ; int [4] ; int [4] ; auch schreiben: int [ ] [ ] feldfeld ; f e l d f e l d = new i n t [ 3 ] [ 4 ] ; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Wie wird ein Programm ausgeführt? Zunächst immer eine Anweisung nach der anderen. Das reicht nicht! Wir wollen bestimmte Anweisungen wiederholt ausführen (Schleifen) manche Anweisungen nur unter bestimmten Bedingungen ausführen (Verzweigung) Im Debugger von eclipse kann der Kontrollfluss (in welcher Reihenfolge werden welche Anweisungen ausgeführt) nachvollzogen werden. Kontrollstrukturen steuern den Kontrollfluss Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Verzweigung ( if ) Syntax i f ( h Wert vom Typ b o o l e a n i ) hAnweisung o d e r B l o c k i [ else hAnweisung o d e r B l o c k i ] Wenn die if-Bedingung den Wert true hat, wird die erste Anweisung ausgeführt, sonst (falls vorhanden) die zweite. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Verzweigung ( if ) Beispiel i f ( d != 0 . 0 f ) { float q = a / d; System . o u t . p r i n t l n ( q ) ; } else System . o u t . p r i n t l n ( " U n g ü l t i g e r ␣ T e i l e r " ) ; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Mehrfachverzweigung (switch) Syntax s w i t c h ( h Wert vom Typ i n t , s h o r t , b y t e o d e r c h a r i ) { c a s e h Wert vom e n t s p r e c h e n d e n Typ i : [ h Anweisungen i ] [ break ; ] .. . [ default : [ h Anweisungen i ] [ break ; ] ] } Die Anweisungen des Falles, der dem gegebenen Wert entspricht, werden ausgeführt. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Mehrfachverzweigung (switch) Beispiel switch ( stunde ) { case 7: System . o u t . p r i n t l n ( " Guten ␣ Morgen ! " ) ; break ; case 17: case 18: System . o u t . p r i n t l n ( " Guten ␣ Abend ! " ) ; break ; default : System . o u t . p r i n t l n ( " Guten ␣Tag ! " ) ; break ; } Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Mehrfachverzweigung (switch) switch kann immer durch eine Kette von if ... else if ... else ... ersetzt werden: Beispiel i f ( s t u n d e == 7 ) System . o u t . p r i n t l n ( " Guten ␣ Morgen ! " ) ; e l s e i f ( s t u n d e == 17 | | s t u n d e == 1 8 ) System . o u t . p r i n t l n ( " Guten ␣ Abend ! " ) ; else System . o u t . p r i n t l n ( " Guten ␣Tag ! " ) ; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Schleifen (while) Syntax w h i l e ( h Wert vom Typ b o o l e a n i ) hAnweisung o d e r B l o c k i Solange die Bedingung den Wert true hat, wird die Anweisung wiederholt ausgeführt. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Schleifen (do ... while) Syntax do hAnweisung o d e r B l o c k i w h i l e ( h Wert vom Typ b o o l e a n i ) ; Bei dieser Variante wird die Anweisung mindestens einmal durchgeführt, da die Bedingung erst nach dem Durchlauf der Schleife geprüft wird. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Schleifen (do ... while) Beispiel BufferedReader br = new B u f f e r e d R e a d e r ( new I n p u t S t r e a m R e a d e r ( System . i n ) ) ; S t r i n g pswd ; do { System . o u t . p r i n t ( " P a s s w o r t ␣ e i n g e b e n : " ) ; pswd = b r . r e a d L i n e ( ) ; } w h i l e ( pswd . e q u a l s ( " geheim " ) ) ; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Zählschleife ( for ) Syntax f o r (h I n i t i a l i s i e r u n g i ; h B e d i n g u n g i ; h I n k r e m e n t i ) hAnweisung o d e r B l o c k i Zunächst wird die Initialisierungsanweisung durchgeführt, dann der Schleifenrumpf, solang die Bedingung wahr ist. Nach jedem Durchlauf wird die Inkrementierungsanweisung durchgeführt. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Zählschleife ( for ) Beispiel: Berechnen der ersten 10 Quadratzahlen f o r ( i n t i = 0 ; i < 1 0 ; i ++) System . o u t . p r i n t l n ( i ∗ i ) ; Beispiel: Ausgeben eines Feldes f l o a t [ ] f e l d = new f l o a t [ 1 4 ] ; // . . . f o r ( i n t i = 0 ; i < f e l d . l e n g t h ; i ++) System . o u t . p r i n t l n ( f e l d [ i ] ) ; // o d e r k ü r z e r : for ( float f : feld ) System . o u t . p r i n t l n ( f ) ; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Üben und Vertiefen I 1 2 Schreiben Sie ein Programm Schaltjahr, das den Benutzer nach einer Jahreszahl fragt und dann ermittelt, ob dieses Jahr ein Schaltjahr ist. (Tipp: Der Operator % berechnet den Rest beim Teilen einer Zahl durch eine andere. Zweiter Tipp: Jedes vierte Jahr ist ein Schaltjahr, außer die hundertsten, es sei denn, sie sind durch 400 teilbar.) Öffnen Sie das vorbereitete Projekt Debug. Dieses Programm soll den Benutzer nach einer Zahl fragen und die Summe 0 + 1 + . . . bis zu der eingegebenen Zahl berechnen. Leider hat sich ein Fehler eingeschlichen. Finden Sie ihn mit Hilfe des Eclipse-Debuggers! Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Grundlegende Syntax Typen, Variablen & Konstanten Ein- und Ausgabe Felder Kontrollstrukturen Üben und Vertiefen II 3 4 Schreiben Sie ein Programm Mittel, das Folgendes tut: Zunächst wird der Benutzer gefragt, wieviele Zahlen er eingeben möchte. Dann werden diese in ein Feld eingelesen. Anschließend wird deren Mittelwert berechnet und ausgegeben. Innerhalb von Schleifen sind die Anweisungen break und continue erlaubt. Finden Sie experimentell oder durch Nachschlagen in der Sprachreferenz [1] heraus, was diese Anweisung bewirkt. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Klassen definieren Adresse.java [ public ] c l as s Adresse { // E i g e n s c h a f t e n und Methoden } A d r e s s e m e i n e A d r e s s e = new A d r e s s e ( ) ; Jede .java-Datei sollte eine Klasse gleichen Namens enthalten, welche public deklariert ist. Alle anderen Klassen sind Hilfsklassen und nach außen nur eingeschränkt sichtbar. Am besten jede Klasse in eine eigene Datei stecken! Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Eigenschaften definieren Adresse.java public c l a s s Adresse { p u b l i c S t r i n g name , s t r a s s e ; } // v e r w e n d e n d e r K l a s s e und i h r e r E i g e n s c h a f t : A d r e s s e m e i n e A d r e s s e = new A d r e s s e ( ) ; m e i n A d r e s s e . name = new S t r i n g ( "VHS␣ M u r r h a r d t " ) ; Eigenschaften einer Klasse können Variablen oder Objekte sein. Was der Zusatz public bedeutet werden wir später sehen. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Methoden definieren Adresse.java public cl ass Adresse { p u b l i c S t r i n g name , s t r a s s e ; public void drucke () { System . o ut . p r i n t l n ( name . append ( " ␣ " ) . append ( s t r a s s e ) ) ; } } // A u f r u f d e r Methode : A d r e s s e m e i n e A d r e s s e = new A d r e s s e ( ) ; m e i n e A d r e s s e . name = new S t r i n g ( "VHS␣ M u r r h a r d t " ) ; m e i n e A d r e s s e . s t r a s s e = new S t r i n g ( " Obere ␣ S c h u l g a s s e " ) ; meineAdresse . drucke ( ) ; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Zugriff auf Eigenschaften und Methoden Innerhalb einer Methode einer Klasse erhält man eine Referenz auf das eigene Objekt mit this . Der Zugriff auf Eigenschaften und Methoden des eigenen Objekts kann aber auch ohne Referenz . erfolgen: MeineKlasse.java p u b l i c c l a s s MeineKlasse { p u b lic in t meineEigenschaft ; p u b l i c v o i d mei neM ethode1 ( ) { /∗ . . . ∗/ } p u b l i c v o i d mei neM ethode2 ( ) { t h i s . meineEigenschaft = 7; t h i s . mei neM ethode1 ( ) ; meineEigenschaft = 5; mei neM ethode1 ( ) ; } } Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Methoden: Parameter Parameter p u b l i c void drucke ( S t r i n g t e x t ) { System . o u t . p r i n t l n ( m e i n S t r i n g . append ( t e x t ) ) ; } // A u f r u f d e r Methode : m e i n O b j e k t . d r u c k e ( " i r g e n d e i n ␣ Text " ) ; Der Wert " irgendein ␣Text" wird beim Aufruf in die nur innerhalb der Methode gültige Variable text kopiert. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Methoden: Rückgabewert Parameter p u b l i c i n t summe ( i n t wert1 , i n t w e r t 2 ) { i n t s = wert1 + wert2 ; return s ; } // A u f r u f d e r Methode : i n t meineSumme = m e i n O b j e k t . summe ( 2 , 3 ) ; Wird kein Rückgabewert benötigt, so verwendet man den speziellen Typ void. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Methoden: Überladen Überladene Methode p u b l i c void drucke ( S t r i n g t e x t ) { System . o u t . p r i n t l n ( m e i n S t r i n g . append ( t e x t ) ) ; } p u b l i c v o i d d r u c k e ( P r i n t S t r e a m ps , S t r i n g t e x t ) { p s . p r i n t l n ( m e i n S t r i n g . append ( t e x t ) ) ; } // A u f r u f d e r Methoden : m e i n O b j e k t . d r u c k e ( " i r g e n d e i n ␣ Text " ) ; m e i n O b j e k t . d r u c k e ( System . out , " noch ␣ e i n ␣ Text " ) ; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Konstruktoren Wozu sind die Klammern beim Erstellen eines Objektes gut? M e i n e K l a s s e m e i n O b j e k t = new M e i n e K l a s s e ( ) ; Antwort: Beim Anlegen des Objektes wird eine spezielle Methode – der Konstruktor – aufgerufen. Er kann genutzt werden, um das Objekt zu initialisieren – z.B. den Eigenschaften Standardwerte zuzuweisen. Der Konstruktor heißt immer so wie die Klasse. Er kann überladen werden und Parameter bekommen. Der parameterlose Konstruktor heißt „Standardkonstruktor”. Konstruktoren haben keinen Rückgabewert, auch nicht void . Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Konstruktoren Konstruktoren c l ass MeineKlasse { public int meineEigenschaft ; public MeineKlasse () { meineEigenschaft = 11; } p u b l i c M e i n e K l a s s e ( i n t param ) { m e i n e E i g e n s c h a f t = param ; } } // A n l e g e n von O b j e k t e n : M e i n e K l a s s e m e i n O b j e k t 1 = new M e i n e K l a s s e ( ) ; M e i n e K l a s s e m e i n O b j e k t 2 = new M e i n e K l a s s e ( 1 3 ) ; Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Destruktoren Destruktoren werden beim Löschen eines Objekts aufgerufen. Sie können Aufräumarbeiten vornehmen. Dank Garbage Collection braucht man Destruktoren nur selten – das meiste räumt sich von selbst auf. Destruktor c l a s s MeineKlasse { public int meineEigenschaft ; protected void f i n a l i z e () { meineEigenschaft = 0; } } Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Üben und Vertiefen 1 Schreiben Sie eine Klasse Buch, die in einer Bibliotheksverwaltung verwendet werden könnte. Ihre Klasse sollte geeignete Eigenschaften (Titel, Autor, ist das Buch ausgeliehen und an wen?, . . . ) und Methoden ausleihen und zurueckgeben besitzen. Welche Konstruktoren sollte die Klasse Buch sinnvollerweise bekommen? Schreiben Sie ein Testprogramm, das einige Buch-Instanzen anlegt, deren Eigenschaften ändert und Methoden aufruft. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Parameter Der Wert einer als Parameter übergebenen Variablen ändert nach außen nicht, wenn er innerhalb der Methode verändert wird („call by value”): Primitive Datentypen als Parameter p u b l i c v o i d meineMethode ( i n t param ) { param = 3 ; System . o u t . p r i n t l n ( param ) ; // Ausgabe : 3 } // A u f r u f d e r Methode : int i = 5; m e i n O b j e k t . meineMethode ( i ) ; System . o u t . p r i n t l n ( i ) ; // Ausgabe : 5 Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Parameter Objekte als Parameter p u b l i c c l a s s AndereKlasse { p u b l i c i n t a n de r e Eig e n s c ha ft ;} p u b l i c i n t MeineKlasse { p u b l i c v o i d mei neM ethode1 ( A n d e r e K l a s s e param ) { param = new A n d e r e K l a s s e ( ) ; param . a n d e r e E i g e n s c h a f t = 3 ; } p u b l i c v o i d mei neM ethode2 ( A n d e r e K l a s s e param ) { param . a n d e r e E i g e n s c h a f t = 3 ; } } // A u f r u f d e r Methoden : M e i n e K l a s s e m e i n O b j e k t = new M e i n e K l a s s e ( ) ; A n d e r e K l a s s e a n d e r e s O b j e k t = new A n d e r e K l a s s e ( ) ; anderesObjekt . andereEigenschaft = 2; m e i n e K l a s s e . mei neM ethode1 ( a n d e r e s O b j e k t ) ; Sy stem . o u t . p r i n t l n ( a n d e r e s O b j e k t . a n d e r e E i g e n s c h a f t ) ; // Ausgabe : 2 Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Parameter Objekte als Parameter p u b l i c c l a s s AndereKlasse { p u b l i c i n t a n de r e Eig e n s c ha ft ;} p u b l i c i n t MeineKlasse { p u b l i c v o i d mei neM ethode1 ( A n d e r e K l a s s e param ) { param = new A n d e r e K l a s s e ( ) ; param . a n d e r e E i g e n s c h a f t = 3 ; } p u b l i c v o i d mei neM ethode2 ( A n d e r e K l a s s e param ) { param . a n d e r e E i g e n s c h a f t = 3 ; } } // A u f r u f d e r Methoden : M e i n e K l a s s e m e i n O b j e k t = new M e i n e K l a s s e ( ) ; A n d e r e K l a s s e a n d e r e s O b j e k t = new A n d e r e K l a s s e ( ) ; anderesObjekt . andereEigenschaft = 2; m e i n e K l a s s e . mei neM ethode2 ( a n d e r e s O b j e k t ) ; Sy stem . o u t . p r i n t l n ( a n d e r e s O b j e k t . a n d e r e E i g e n s c h a f t ) ; // Ausgabe : 3 Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Gültigkeit und Sichtbarkeit Der Umgang mit Variablen wird ein bisschen komplizierter, wenn Methoden im Spiel sind. Während des Ablaufs eines Programmes heißt eine Variable gültig, solange sie im Speicher vorhanden ist. Eine Variable nennt man zu einem Zeitpunkt eines Programmablaufs sichtbar, wenn sie mit ihrem Namen angesprochen werden kann. Dassebe gilt für Referenzen anstelle von Variablen. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Gültigkeit und Sichtbarkeit Beispiel 1 1 2 3 4 5 6 int { i = 0; Variable i j int j = 5; i = 7; } j = 0; Jürn Laun gültig 1-6 3-4 Grundlagen der Programmierung sichtbar 1-6 3-4 Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Gültigkeit und Sichtbarkeit Beispiel 2 1 2 3 4 5 6 7 8 9 10 11 12 13 p u b l i c v o i d methode1 ( ) { int i = 13; methode2 ( ) ; i = 7; } p u b l i c v o i d methode2 ( ) { int j = 11; System . o ut . p r i n t l n ( j ) ; } Variable i j gültig 3,4,9,10,5 9,10 // methode1 w i r d a u f g e r u f e n Jürn Laun Grundlagen der Programmierung sichtbar 3,4,5 9,10 Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Gültigkeit und Sichtbarkeit Beispiel 3 1 2 3 4 5 6 7 8 9 public int i ; public { i = int int i = } v o i d methode ( ) 13; i = 17; j = 2; 7; Jürn Laun Variable i i j gültig 4-7 5-7 6-7 Grundlagen der Programmierung sichtbar 4 5-7 6-7 Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Üben und Vertiefen 1 Ermitteln Sie den Ablauf des Programmes auf der rechten Seite, wenn methode1 aufgerufen wird. Wann sind die einzelnen Variablen gültig, wann sichtbar? Welche Werte haben sie? Jürn Laun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public int i ; p u b l i c v o i d methode1 ( ) { i = 13; int i = 17; int j = 2; methode2 ( ) ; i = 7; } p u b l i c v o i d methode2 ( ) { int j = 0; i = 5; int i ; int k = 2; i = 11; } Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Rekursion Methoden können andere Methoden aufrufen, aber auch sich selbst. Eine solche Rekursion kann ein effizienter Weg zur Lösung mancher Probleme sein. Aber Achtung vor versteckten Endlos„schleifen”! Beispiel public int fakultaet ( int n) { i f ( n = 0) return 1; else return n ∗ fakul taet (n − 1); } Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Kapselung Die zuvor betrachtete Klasse Adresse ist nicht sicher gegenüber unsinnigen Aktionen. Zum Beispiel können wir eine Instanz mit negativer Hausnummer oder nichtexistenter Postleitzahl anlegen und verwenden. Idee: Klassen sollten gekapselt sein, d.h. ihre Eigenschaften sollten von außen nicht direkt zugänglich sein, sondern nur über Methoden der Klasse. Diese können Tests durchführen und verhindern, dass eine Instanz in einen unsinnigen Zustand kommt. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Kapselung !name=“VHS Murrhardt” !strasse=“Obere Schulgasse 7” !plz=71540 !ort=”Murrhardt” !email=”[email protected]” g n) String getNam e( ) e void s tName( St rin ... drucken() void Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Kapselung Beispielsweise können wir für die Eigenschaft plz zwei Methoden void setPlz ( int ) und int getPlz () anlegen. Wir brauchen also einen Weg, den Zugriff auf Eigenschaften für jeden außer den eigenen Methoden der Klasse zu unterbinden. Dasselbe für Methoden (z.B. Hilfsmethoden, die von außen nicht aufrufbar sein sollen) Lösung: public und private Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) public und Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden private Beispiel c l ass MeineKlasse { public int eigenschaft1 ; private int eigenschaft2 ; p u b l i c v o i d methode1 ( ) { eigenschaft1 = 5; eigenschaft2 = 7; methode2 ( ) ; } p r i v a t e v o i d methode2 ( ) { eigenschaft1 = 2; eigenschaft2 = 3; } } Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) public und Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden private Beispiel (Fortsetzung) M e i n e K l a s s e m e i n O b j e k t = new M e i n e K l a s s e ( ) ; meinObjekt . e i g e n s c h a f t 1 = 17; m e i n O b j e k t . methode1 ( ) ; i n t i = m e i n O b j e k t . e i g e n s c h a f t 2 ; // C o m p i l e r f e h l e r ! m e i n O b j e k t . methode2 ( ) ; // C o m p i l e r f e h l e r ! Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Richtlinien Eigenschaften von Klassen sind (fast) immer gekapselt. Die Methoden stellen sicher, dass sich Instanzen immer in einem konsistenten Zustand befinden. Klassen vertrauen niemandem außer ihren eigenen Methoden. Z.B. werden Parameter, die von außen kommen, immer als kontaminiert betrachtet und erst nach eingehender Prüfung in das Objekt übernommen. Jede Klasse ist eine in sich funktionsfähige Einheit und kann wiederverwendet werden (und wir wissen nicht in welchem Kontext). Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Üben und Vertiefen 1 Überarbeiten Sie die Klasse Adresse, so dass sie diesen Anforderungen genügt. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Statische Eigenschaften und Methoden Gelegentlich gehören Eigenschaften eher zur Klasse als zu ihren Instanzen. Gründe können sein: Der Wert muss für alle Instanzen der Klasse derselbe sein. Es darf aus gewissen Gründen nur eine einzige Instanz der Klasse geben (z.B. die Klasse System im Java-API). Konstanten müssen nicht in jeder einzelnen Instanz gespeichert werden (können es aber). Datenaustausch zwischen verschiedenen Instanzen einer Klasse. Solche Eigenschaften heißen statisch. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Statische Eigenschaften und Methoden Adresse Eigenschaften !String name, strasse !int hnr !static boolean strasseVorHnr= true Methoden !static void formatSetzen(boolean) !void drucken() meineAdresse drucken( ) void !name=“VHS Murrhardt” !strasse=“Obere Schulgasse 7” Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Statische Eigenschaften und Methoden Beispiel c l ass Adresse { p r i v a t e S t r i n g name , s t r a s s e ; pr iva t e i n t hnr ; p r i v a t e s t a t i c bo o le a n s t r a s s e V o r H n r ; p u b l i c s t a t i c v o i d f o r m a t S e t z e n ( bo o le a n s t r V o r H ) { s tr a s s eV or H nr = strVorH ; } public void drucken () { i f ( strasseVorHnr ) System . o ut . p r i n t l n ( name + s t r a s s e + h n r ) ; e l s e System . o ut . p r i n t l n ( name + h n r + s t r a s s e ) ; } } Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Regeln Beim Verwenden statischer Eigenschaften und Methoden ist zu beachten: Nichtstatische Methoden können auf statische Eigenschaften und Methoden zugreifen. Statische Methoden können auf statische Eigenschaften und Methoden zugreifen. Statische Methoden können nicht auf nichtstatische Eigenschaften und Methoden zugreifen. Warum? this ist in statischen Methoden nicht definiert. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Beispiele im Java-API Wir haben statische Eigenschaften und Methoden schon häufiger verwendet: und out sind statische Eigenschaften der Klasse System. (System hat überhaupt nur statische Eigenschaften und Methoden.) in Die Methode parseInt der Klasse Integer ist statisch. Die main-Methode in unseren Programmen ist statisch. Jürn Laun Grundlagen der Programmierung Strukturierte Programmierung in Java Objektorientierte Programmierung in Java (Teil I) Klassen, Eigenschaften und Methoden definieren Konstruktoren und Destruktoren Mehr über Methoden Kapselung Statische Eigenschaften und Methoden Üben und Vertiefen 1 2 Ergänzen Sie die Klasse Buch um eine statische Methode int anzahlAusgeliehen () , die sie Anzahl der ausgeliehenen Bücher zurückgibt. Man kann Konstruktoren auch private definieren. Wenn alle Konstruktoren einer Klasse private sind, können dann noch Instanzen der Klasse erstellt werden? Welchen Sinn könnte diese Vorgehensweise haben? Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Teil III 13. März 2009 6 Objektorientierte Programmierung in Java (Teil II) 7 Projekt (Teil I) Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Einführendes Beispiel Angenommen, wir wollen eine große Adresskartei mit Hilfe einer Klasse Adresse verwalten. Allerdings tauchen in unserem Datenbestand sowohl normale Adressen, als auch Postfachadressen auf. Wir benötigen also zwei verschiedene Adressklassen. Hausadresse Postfachadresse Eigenschaften !String name !String strasse !int hnr, plz !String ort Eigenschaften !String name !int postfach !int plz !String ort Methoden !void drucken() !boolean plzPruefen() Methoden !void drucken() !boolean plzPruefen() Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Einführendes Beispiel Diese Vorgehensweise hat einige Nachteile: Methoden, die bei beiden Klassen gleich sind (wie z.B. plzPruefen müssen doppelt implementiert (und schlimmer: gewartet) werden. Wir können unsere Adresssammlung nicht mehr in einem großen Feld vom Typ Adresse [] halten, da die Elemente Instanzen zweier verschiedener Klassen sind. Die Trennung in zwei Felder ist logisch nicht sinnvoll. Jede Methode, die auf Adressen zugreift, muss eine Fallunterscheidung durchführen, auch wenn die durchgeführte Operation gar nicht von der genauen Art der Adresse abhängt. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Einführendes Beispiel Lösung: Wir fassen die Gemeinsamkeiten beider Klassen in einer Oberklasse Adresse zusammen: Adresse Eigenschaften !String name !int plz !String ort Methoden !void drucken() !boolean plzPruefen() Hausadresse Postfachadresse Eigenschaften !String strasse !int hnr Eigenschaften !int postfach Methoden !void drucken() !boolean plzPruefen() Jürn Laun Methoden !void drucken() !boolean plzPruefen() Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Ableiten von Klassen Dies nennt man „Ableiten einer Klasse von einer Basisklasse” (englisch „derivation”). In Java: c l a s s BasisKlasse { public int eigenschaft1 ; p u b l i c v o i d methode1 ( ) { /∗ . . . ∗/ } } c l a s s Abgelei teteKl asse extends BasisKlasse { public int eigenschaft2 ; p u b l i c v o i d methode2 ( ) { /∗ . . . ∗/ } } Die abgeleitete Klasse erbt alle Eigenschaften und Methoden der Basisklasse. Sie hat also zwei Eigenschaften und zwei Methoden: A b g e l e i t e t e K l a s s e m e i n O b j e k t = new A b g e l e i t e t e K l a s s e ( ) ; meinObjekt . e i g e n s c h a f t 2 = 5 ; meinObjekt . e i g e n s c h a f t 1 = 7 ; m e i n O b j e k t . methode1 ( ) ; Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Überschreiben Eine abgeleitete Klasse kann Methoden, die sie von der Basisklasse erbt, neu definieren. Dies nennt man „Überschreiben” (eine falsche Übersetzung von „Overriding”). Überschreiben ist notwendig, um das Verhalten einer Klasse zu ändern. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Beispiel Adressverwaltung c l a s s Adresse { p u b l i c S t r i n g name , o r t ; pub lic in t plz ; p u b l i c v o i d d r u c k e n ( ) { /∗ . . . ∗/ } p u b l i c b o o l e a n p l z P r u e f e n ( ) { /∗ . . . ∗/ } } c l a s s Hausadresse extends Adresse { public String strasse ; p u b l i c i n t hnr ; p u b l i c v o i d d r u c k e n ( ) { /∗ . . . ∗/ } } c l a s s P os tf a ch a d re s s e extends Adresse { pub lic in t postfach ; p u b l i c v o i d d r u c k e n ( ) { /∗ . . . ∗/ } } Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Vererbung Zwischen einer abgeleiteten Klasse und ihrer Basisklasse besteht die „ist ein(e)”-Beziehung: Eine Hausadresse ist eine Adresse. Eine Postfachadresse ist eine Adresse. Deshalb dürfen wir schreiben: A d r e s s e m e i n e A d r e s s e = new H a u s A d r e s s e ( ) ; A d r e s s e v h s A d r e s s e = new P o s t f a c h A d r e s s e ( ) ; Referenzen vom Typ der Basisklasse dürfen auch Instanzen abgeleiteter Klassen enthalten! Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Vererbung In unserem Adressbeispiel zeigt sich, dass dies sehr praktisch ist: Adressverwaltung A d r e s s e [ ] m e i n e K a r t e i = new A d r e s s e [ 5 0 0 ] ; // . . . m e i n e K a r t e i [ 3 7 5 ] = new H a u s A d r e s s e ( ) ; m e i n e K a r t e i [ 3 7 5 ] . s t r a s s e = " Obere ␣ S c h u l g a s s e " ; // . . . f o r ( i n t i = 0 ; i < m e i n e K a r t e i . l e n g t h ; i ++) meineKartei [ i ] . drucken ( ) ; Wir müssen uns in der Schleife überhaupt nicht darum kümmern, von welcher Klasse das Objekt meineKartei[ i ] genau ist. Java ruft automatisch die richtige drucken-Methode auf! Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Üben und Vertiefen 1 2 3 Entwerfen Sie neue Klassen für unsere Bibliotheksverwaltung: Es sollen nun verschiende Medien verwaltet werden: Bücher, Zeitschriften und DVDs. Alle Medien besitzen einen Titel und den Status „ausgeliehen” oder „nicht ausgeliehen”. Bücher haben außerdem einen Autor und eine ISBN-Nummer, Zeitschriften eine Nummer und DVDs einen Regisseur. Wie ändern Sie die Ihre eben entworfenen Klassen am besten, wenn Printmedien (also Bücher und Zeitschriften) eine Eigenschaft „Verlag” bekommen sollen, DVDs aber nicht? Erklären Sie den Unterschied zwischen Überladen und Überschreiben! Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Klassenhierarchien Die Struktur, die entsteht, wenn man Klassen mit ihren Ableitungsbeziehungen darstellt, heißt Klassenhierarchie. Zum Beispiel bilden die Klassen des Java-API eine solche Hierarchie. −→ Klassenhierarchie des Java-API Die Mutter aller Klassen ist Object. Jede Klasse, die nicht explizit mit extends von einer anderen Klasse abgeleitet wurde, erhält vom Java-Compiler automatisch die Basisklasse Object. Object enthält z.B. die Methoden toString () und clone () , deshalb hat – via Vererbung – jede Klasse diese Methoden. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Zugriff auf die Elternklasse: super Oft wollen wir in einer abgeleiteten Klasse das Verhalten einer Methode der Basisklasse nicht komplett verändern, sondern nur ergänzen. Java bietet deshalb die Möglichkeit, auf Methoden der Basisklasse zuzugreifen, auch wenn diese überschrieben wurde: c l a s s AuslandsAdresse extends Hausadresse { public String land ; p u b l i c void drucken () { super . drucken ( ) ; System . o u t . p r i n t l n ( l a n d ) ; } } Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Zugriffsbeschränkungen in abgeleiteten Klassen Erinnerung: Auf private -Eigenschaften und -Methoden können nur Methoden der Klasse selbst zugreifen. Also auch keine Methoden abgeleiteter Klassen! Wir möchten aber nicht alles public machen, nur damit Ableiten noch Sinn macht. Die neue Zugriffsbeschränkung protected ist ein Kompromiss: Methoden der Klasse selbst haben Zugriff. Methoden abgeleiteter Klassen haben Zugriff. Alle anderen haben keinen Zugriff (wie bei private ). Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Zugriffsbeschränkungen in abgeleiteten Klassen Beispiel c l a s s BasisKlasse { private int priEig ; p rot e ct ed i n t proEig ; p u b l i c i n t pubEig ; p u b l i c v o i d methode1 ( ) { p r i E i g = 2 ; p r o E i g = 3 ; p u b E i g = 5 ; // } Ist alles } c l a s s Abgelei teteKl asse extends BasisKlasse { p u b l i c v o i d methode2 ( ) { p r o E i g = 7 ; p u b E i g = 1 1 ; // Ok . priE ig = 13; // F e h l e r ! methode1 ( ) ; // I n d i r e k t e r Z u g r i f f // ü b e r Methoden d e r // B a s i s k l a s s e b l e i b t } } Jürn Laun erlaubt . erlaubt . Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Üben und Vertiefen 1 Ergänzen Sie Ihre Bibliotheksklassen aus den vorangegangenen Aufgaben durch geeignete Zugriffsbeschränkungen. Beachten Sie das Prinzip der Kapselung, d.h. verwenden Sie so wenig public wie möglich. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Abstrakte Klassen und Polymorphie Wir betrachten noch einmal die Klassen unseres Beispiels Adressverwaltung. Wie sollen wir die Methode Adresse.drucken() implementieren? Am besten wäre, wir könnten die Implementierung dieser Methode weglassen, denn wir wollen ohnehin keine Instanzen von Adresse erstellen. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Beispiel Adressverwaltung c l a s s Adresse { p u b l i c S t r i n g name , o r t ; pub lic in t plz ; p u b l i c v o i d d r u c k e n ( ) { /∗ . . . ∗/ } p u b l i c b o o l e a n p l z P r u e f e n ( ) { /∗ . . . ∗/ } } c l a s s Hausadresse extends Adresse { public String strasse ; p u b l i c i n t hnr ; p u b l i c v o i d d r u c k e n ( ) { /∗ . . . ∗/ } } c l a s s P os tf a ch a d re s s e extends Adresse { pub lic in t postfach ; p u b l i c v o i d d r u c k e n ( ) { /∗ . . . ∗/ } } Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Abstrakte Klassen und Polymorphie Wir betrachten noch einmal die Klassen unseres Beispiels Adressverwaltung. Wie sollen wir die Methode Adresse.drucken() implementieren? Am besten wäre, wir könnten die Implementierung dieser Methode weglassen, denn wir wollen ohnehin keine Instanzen von Adresse erstellen. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Beispiel Adressverwaltung mit abstrakter Basisklasse a b s t r a c t c l a s s Adresse { p u b l i c S t r i n g name , o r t ; pub lic in t plz ; p u b l i c a b s t r a c t vo id drucken ( ) ; p u b l i c b o o l e a n p l z P r u e f e n ( ) { /∗ . . . ∗/ } } c l a s s Hausadresse extends Adresse { public String strasse ; p u b l i c i n t hnr ; p u b l i c v o i d d r u c k e n ( ) { /∗ . . . ∗/ } } c l a s s P os tf a ch a d re s s e extends Adresse { pub lic in t postfach ; p u b l i c v o i d d r u c k e n ( ) { /∗ . . . ∗/ } } Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Abstrakte Klassen und Polymorphie Abstrakte Klassen können nicht instanziiert werden. Sie legen eine Schnittstelle für ihre abgeleiteten Klassen fest (z.B. muss jede nicht-abstrakte von Adresse abgeleitete Klasse die Methode drucken implementieren. Abgeleitete Klassen können einheitlich behandelt werden, denn Basisklassenreferenzen können Instanzen abgeleiteter Klassen enthalten. Java sucht für solche Referenzen zur Laufzeit die richtigen Methoden, auch wenn zum Zeitpunkt des Kompilierens noch gar nicht feststand, von welchem Typ das entsprechende Objekt sein würde. Dies nennt man Polymorphie (Ein Hausadresse-Objekt kann verschiedene Gestalten haben: Hausadresse, Adresse oder Object). Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Üben und Vertiefen 1 Welche Klassen aus unserem Bibliotheksbeispiel sollten wir sinnvollerweise abstrakt definieren? Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Interfaces (Schnittstellen) Wir treiben das Konzept der abstrakten Klassen auf die Spitze: Eine abstrakte Klasse, die nur abstrakte Methoden besitzt, legt lediglich die Schnittstelle ihrer abgeleiteten Klassen fest, stellt aber keinerlei Funktionalität zur Verfügung. Solche Klassen heißen in Java Interfaces. Die Namen der meisten Interfaces endet auf -able (also -bar), z.B. Runnable (hat eine Methode run), Serializable Cloneable (kann sich auf der Festplatte speichern), (implementiert die clone -Methode) oder (implementiert die Methode compareTo und kann deshalb z.B. sortiert werden). Comparable Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Interfaces (Schnittstellen) Beispiele i n t e r f a c e Druckbar { p u b l i c vo i d drucken ( PrintStream ) ; } c l a s s M eineK lasse implements Druckbar { // . . . p u b l i c v o i d d r u c k e n ( P r i n S t r e a m p s ) { p s . p r i n t l n ( t i t e l ) ; /∗ . . . ∗/ } } c l a s s BildschirmDrucker { p u b l i c s t a t i c v o i d druckeE twas ( Druckbar etwas ) { e t w a s . d r u c k e n ( Sy stem . o u t ) ; } } // . . . M e i n e K l a s s e m e i n O b j e k t = new M e i n e K l a s s e ( ) ; B i l d s c h i r m D r u c k e r . druckeE twas ( meinObjekt ) ; Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Vererbung und Polymorphie Interfaces Interfaces vs. abstrakte Klassen Abstrakte Klasse kann implementierte Methoden enthalten Interface alle Methoden sind abstrakt Klassen können nur eine Basisklasse haben Klassen können viele Interfaces implementieren kann Konstruktoren haben hat keine Konstruktoren Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Projekt: Vier Gewinnt Im Laufe des Kurses wollen wir ein kleines Projekt durchführen: Eine Java-Implementierung des Spiels „Vier Gewinnt”. Wir beginnen heute mit den Klassen für das Spielfeld und die Spieler. Später werden wir (wenn die Zeit reicht) ein grafisches Interface dafür schreiben. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Vier Gewinnt: Das Spielbrett • • • • • • • Das Spielfeld besteht aus 7 Spalten und 6 Zeilen. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Vier Gewinnt: Die Spielregeln • • • • • • • • • • Die beiden Spieler werfen abwechselnd eine Kugel mit ihrer Farbe in eine der Spalten. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Vier Gewinnt: Die Spielregeln • • • • • • • • • • • • • • • • • • • • Wer zuerst 4 Kugeln in einer Reihe (waagerecht, senkrecht oder diagonal) hat, gewinnt. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Klassen und Interfaces Klasse Spielbrett Eigenschaften: Konstanten HOEHE=6, BREITE=7 Ein zweidimensionales Array brett , welches die Kugeln auf dem Spielbrett speichert. (0: keine Kugel, 1 bzw. 2: Kugel von Spieler 1 bzw. 2) Methoden: void steinSetzen ( int spieler , int spalte ) boolean hatGewonnen(int spieler ) , boolean remis() boolean spielBeendet () void anzeigen(PrintStream ps) Jürn Laun gibt das Spielbrett nach ps aus. Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Klassen und Interfaces Die Ausgabe des Spielbretts auf der Konsole könnte z.B. so aussehen: | | | | | | | | | | | | | | | | | | | |2| | | | | | |2|1| | | | | | |1|2|1| | | | |2|1|1|2| | | --------------Tipp: for -Schleifen können hier hilfreich sein! Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Klassen und Interfaces Abstrakte Klasse Spieler Eigenschaften: meineNummer speichert die Nummer des Spielers, d.h. 1 oder 2. Methoden: nummerZuweisen(int nummer) setzt die Spielernummer auf nummer Abstrakte Methode int ziehen( Spielstand ) , welche die Nummer der Zeile zurückgibt, in die der Spieler seine Kugel werfen will. Im Prinzip könnten wir der Methode ziehen das Spielbrett als Parameter übergeben. Der Spieler benötigt diese Information, um zu entscheiden wie er spielt. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Klassen und Interfaces Allerdings könnte er dann auch schummeln (z.B. das Spielbrett verändern oder mehrfach ziehen). Deshalb definieren wir ein Interface Spielstand , welches nur lesenden Zugriff auf das Spielbrett zulässt. Die Klasse Spielbrett soll dieses Interface implementieren. Interface Spielstand Methoden: int breite (), int hoehe() sollen die Breite und Höhe des Spielbretts zurückgeben. int wessenStein( int spalte , int zeile ) soll die Nummer des Spielers zurückgeben, dem der Stein in der gegebenen Spalte und Zeile gehört (oder 0, wenn dort kein Stein liegt). Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Klassen und Interfaces Klasse MenschlicherSpieler (abgeleitet von Spieler ) Methoden: Implementiert die abstrakte Methode ziehen von Spieler . Darin soll er den Benutzer via Konsole nach der gewünschten Spalte fragen. Klasse ComputerSpieler (abgeleitet von Spieler ) Diese Klasse wird vom Dozent bereitgestellt. Methoden: Implementiert die abstrakte Methode ziehen von Spieler . Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Klassen und Interfaces Klasse VierGewinnt Methoden: Legt ein Array vom Typ Spieler [] an, füllt dies mit zwei Intanzen von MenschlicherSpieler oder ComputerSpieler und geht anschließend in eine Schleifen, in der das Spielfeld angezeigt und die Spieler abwechselnd nach ihrem Zug gefragt werden und dieser ausgeführt wird. main Tipp: Es wird sich später als praktisch erweisen, wenn Sie eine Variable amZug verwenden, die die Nummer des Spielers speichert, der am Zug ist. Jürn Laun Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Klassendiagramm <<interface>> Spieler Spielstand Eigenschaften !int meineNummer Methoden !int breite() !int hoehe() !int wessenStein(int, int) Methoden !void nummerZuweisen(int) !int ziehen(Spielstand) VierGewinnt Methoden !static void main(String[]) Spielbrett ComputerSpieler MenschlicherSpieler Eigenschaften ??? Methoden !int ziehen(Spielstand) ??? Methoden !int ziehen(Spielstand) Jürn Laun Eigenschaften !final int BREITE, HOEHE !int[][] brett Methoden !void steinSetzen(int, int) !boolean hatGewonnen(int) !boolean remis() !boolean spielBeendet() !void anzeigen(PrintStream) Grundlagen der Programmierung Objektorientierte Programmierung in Java (Teil II) Projekt (Teil I) Das Spiel Klassen und Interfaces Ein Test Wenn Sie sauber programmiert haben, können Sie dank Polymorphie durch Abändern von maximal zwei Code-Zeilen zwischen den vier Spielvarianten „Mensch vs. Mensch”, „Mensch vs. Computer”, „Computer vs. Mensch” und „Computer vs. Computer” wechseln. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Teil IV 14. März 2009 8 Weitere Techniken und Features von Java 9 Projekt (Teil II) 10 Ausblick Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Fehlerbehandlung mit Rückgabewerten Was tun, wenn in einer Methode ein Fehler auftritt? (z.B. eine zu ladende Datei lässt sich nicht öffnen, eine Netzwerkverbindung bricht zusammen, . . . ) Wir können die Methode mit return verlassen und anhand des Rückgabewertes mitteilen, dass ein Fehler aufgetreten ist. Dies ist aber mühsam bei verschaltelten Methodenaufrufen: Angenommen methode1 ruft methode2 und diese methode3 auf und in letzterer tritt ein Fehler auf. methode2 muss dann extra eine Abfrage durchführen und den Fehler an methode1 „weiterleiten”. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Fehlerbehandlung mit Ausnahmen Java stellt das Konzept der Exceptions zur Verfügung. Diese können geworfen und gefangen werden: FIXME: Bild Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Beispiel Exceptions in Java p u b l i c v o i d methode1 ( ) throws E x c e p t i o n { // . . . throw new E x c e p t i o n ( " F e h l e r b e s c h r e i b u n g " ) ; // . . . } p u b l i c v o i d methode2 ( ) { try { methode1 ( ) ; } catch ( Ex cepti on e ) { System . o ut . p r i n t l n ( " F e h l e r : " + e . t o S t r i n g ( ) ) ; } } Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Regeln für Verwendung von Exceptions Wenn in einer Methode eine Exception geworfen werden kann, so muss dieser Bereich von einem try -Block umschlossen oder die Methode mit throws gekennzeichnet werden. Innerhalb eines catch(Exception e)-Blocks kann eine gefangene Exception mit throw e; weitergeworfen werden (z.B. wenn man feststellt, dass man diesen speziellen Fehler doch nicht an dieser Stelle behandeln kann). Wird eine Exception gar nicht gefangen, so stoppt der Interpreter die Ausführung des Programmes mit einer Fehlermeldung. Selbstdefinierte Exceptions können durch Ableiten von der Klasse Exception erzeugt werden. Sie müssen das Interface Throwable implementieren. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Multithreading Den Ablauf eines Programmes stellen wir uns wie einen Zeiger vor, der von Befehl zu Befehl wandert bzw. springt. Manchmal ist es sinnvoll, zwei dieser „Zeiger”, d.h. zwei parallele Kontrollflüsse zu haben: Beispiel Ein Programm führt eine länger andauernde Operation durch (z.B. Kopieren einer großen Datei, Warten auf Netzwerkantwort) und soll währenddessen auf Benutzereingaben (z.B. „Abbrechen”) reagieren können. Solche Abläufe oder „Zeiger” heißen Threads und die Verwendung von mehreren „Multithreading”. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Multithreading: Technisches Jedes Programm hat von Haus aus genau einen Thread. Dieser besteht aus dem Abarbeiten der main-Methode. Ein Thread kann mit Hilfe der statischen Methode sleep ( int millisec ) der Klasse Thread für die angegebene Zeit pausieren, z.B. wenn er auf ein Ereignis wartet. Ein Programm startet einen zweiten Thread, indem es eine Instanz der Klasse Thread erstellt und deren Konstruktor ein Runnable-Objekt übergibt. Der Thread ruft dann die Methode void run() dieses Objekts auf. Ein Thread-Objekt wird mit der Methode void start () der Klasse Thread gestartet. Ein Thread kann mit der Methode interrupt () unterbrochen werden, er selbst kann dies mit interrupted () abfragen. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Beispiel Multithreading p u b l i c c l a s s L a n g e O p e r a t i o n implements R unna bl e { public void run () { w h i l e ( ! Thread . i n t e r r u p t e d ( ) ) /∗ f ü h r e e i n e O p e r a t i o n d u r c h ∗/ ; } } Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Beispiel Multithreading p u b l i c c l a s s Hauptprogramm { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { L a n g e O p e r a t i o n m e i n e O p e r a t i o n = new L a n g e O p e r a t i o n ( ) ; Thread m e i nT hr e a d = new Thread ( m e i n e O p e r a t i o n ) ; m e i nT hr e a d . s t a r t ( ) ; System . o ut . p r i n t l n ( "Zum␣ A bbr e c he n ␣ Z e i c h e n ␣ e i n g e b e n ! " ) ; System . i n . r e a d ( ) ; m e i nT hr e a d . i n t e r r u p t ( ) ; } } Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Synchronisation Wenn zwei Threads auf dieselbe Variable zugreifen kann dies zu unerwarteten Ergebnissen führen: 1. Thread 2. Thread v o i d methode1 ( ) { i f ( i > 0 ) i ++; } v o i d methode2 ( ) { i −−; } Wir können verhindern, dass eine Methode während ihrer Ausführung einen anderen Thread zum Zuge kommen lässt, indem wir sie mit synchronized kennzeichnen. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Applets Java ist durch Applets erst richtig bekannt geworden. Applets sind eine spezielle Art von Java-Programmen, die in Webseiten eingebunden werden können. Java ist hierfür besonders gut geeignet, da es plattformunabhängig funktioniert. −→ Beispiel Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Applets: Technisches Applets werden von der Klasse Applet abgeleitet. Es gibt keine main-Methode, sondern Applets arbeiten (wie die meisten Programme mit grafischer Oberfläche) ereignis- oder nachrichtenorientiert. Solche Programme bestehen aus Sammlungen von Reaktionen (in Form von Methoden) auf Ereignisse wie Mausklicks, Tastatureingaben etc. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Beispiel HalloApplet.java impo r t j a v a . a p p l e t . A p p l e t ; impo r t j a v a . awt . ∗ ; p u b l i c c l a s s H a l l o A p p l e t e x t e nds A p p l e t { public void pa i nt ( G r a phi cs g ) { g . d r a w S t r i n g ( " H a l l o , ␣Web ! " , 2 0 , 2 0 ) ; } } Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Beispiel HalloApplet.html <!DOCTYPE HTML PUBLIC "−//W3C//DTD␣HTML␣ 4 . 0 1 ␣ T r a n s i t i o n a l //EN" " h t t p : / /www . w3 . o r g /TR/ htm l 4 / l o o s e . dtd "> <html> <head> < t i t l e>H a l l o A p p l e t</ t i t l e> </ head> <body b g c o l o r="LIME"> <h1>V i e r G e w i nnt</ h1> <a p p l e t code=" H a l l o A p p l e t . c l a s s " width=" 400 " h e i g h t=" 300 "> </ a p p l e t> </ body> </ html> Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Applets Das Verhalten eines Applets steuern wir, indem wir Methoden überladen. void init () wird beim Laden des Applets aufgerufen. wird beim Beenden des Applets aufgerufen (z.B. beim Schließen des Browsers). void destroy () void paint(Graphics) wird aufgerufen, wenn das Applet neu gezeichnet werden soll (z.B. weil es verdeckt und nun wieder sichtbar wurde). Das Graphics-Objekt repräsentiert die grafische Oberfläche des Applets und kann genutzt werden, um darauf zu zeichnen oder Text auszugeben. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Ausnahmebehandlung Multithreading Applets Verarbeiten von Mauseingaben Klassen, die das Interface MouseListener implementieren, können vom Applet mit der Methode addMouseListener als Verarbeiter von Mausereignissen registriert werden. Wenn das Applet selbst dieses Interface implementiert, kann es sich selbst registrieren. beinhaltet Methoden wie void mouseClicked(MouseEvent), welche aufgerufen wird, wenn ein Mausklick im Applet stattgefunden hat. Der Parameter vom Typ MouseEvent liefert zusätzliche Informationen, wie z.B. die Position, auf die geklickt wurde. MouseListener Genauso funktionieren die Interfaces MouseMotionListener (Mausbewegungen), MouseWheelListener (Drehen des Mausrades) und KeyListener (Tastatureingaben). Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Neue Klassen und Methoden Vier Gewinnt: Die grafische Variante Nun wollen wir unser Vier-Gewinnt-Spiel mit einer grafischen Benutzerschnittstelle versehen und als Applet implementieren. Um die Sache zu vereinfachen, lassen wir diesmal nur die Variante „Mensch gegen Computer” zu. Dank Objektorientierung können wir viele Klassen der textbasierten Version wiederverwenden. Da wir nicht das Applet blockieren dürfen, während wir auf Mauseingaben warten, lassen wir den eigentlichen Spielablauf in einem zweiten Thread stattfinden. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Neue Klassen und Methoden Neue Klassen und Methoden Die Klasse Spielbrett bekommt eine weitere (überladene) Methode void anzeigen(Graphics g), welche das Spielfeld in einer Größe von 700×600 Punkten zeichnet. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Neue Klassen und Methoden Neue Klassen und Methoden Die grafische Ausgabe könnte z.B. so aussehen: Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Neue Klassen und Methoden Neue Klassen und Methoden Klasse MenschlicherSpielerGUI (abgeleitet von MenschlicherSpieler , implementiert MouseListener) Eigenschaften: int spalte speichert die Spalte, auf die der Spieler geklickt hat bzw. -1, wenn noch kein Klick bemerkt wurde. Methoden: void mouseClicked(MouseEvent) berechnet bei Mausklicks aus den Koordinaten die Spalte. Überschreibt die Methode ziehen von Spieler . Diese soll mit Thread.sleep so lange warten, bis spalte nicht mehr -1 ist. Dann soll der Wert von spalte zurückgegeben und diese Variable wieder auf -1 gesetzt werden. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Neue Klassen und Methoden Neue Klassen und Methoden Klasse VierGewinntGUI (abgeleitet von Applet, implementiert Runnable) Eigenschaften: Wie VierGewinnt: Spieler [] , Spielbrett amZug speichert die Nummer des Spielers, der am Zug ist. Ein Thread-Objekt ... Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Neue Klassen und Methoden Neue Klassen und Methoden Klasse VierGewinntGUI (abgeleitet von Applet, implementiert Runnable) ... Methoden: void init () void paint(Graphics) Die Methode void run() aus dem Interface Runnable. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Neue Klassen und Methoden Neue Klassen und Methoden Die Methode VierGewinntGUI.init Spielbrett und Spieler anlegen amZug initialisieren Mit Hilfe der Methode addMouseListener die Mauseingaben des Applets an den menschlichen Spieler weiterleiten. Thread initialisieren und starten Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Neue Klassen und Methoden Neue Klassen und Methoden Die Methode VierGewinntGUI.paint Aufrufen der Methode anzeigen(Graphics) von Spielbrett Außerdem soll unterhalb des Spielfeldes ein Text angezeigt werden, welcher den Benutzer informiert, wer am Zug ist oder – falls das Spiel beendet ist – wer gewonnen hat. Die Methode VierGewinntGUI.run Hier findet das statt, was in der ersten Vier-Gewinnt-Variante in der Methode main getan wurde: Die Spieler werden abwechselnd nach ihren Zügen gefragt und diese auf dem Spielbrett ausgeführt. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Neue Klassen und Methoden Klassendiagramm Spieler Eigenschaften !int meineNummer Methoden !void nummerZuweisen(int) !int ziehen(Spielstand) <<interface>> <<interface>> Spielstand Runnable Methoden !int breite() !int hoehe() !int wessenStein(int, int) Methoden !void run() Applet Methoden !void init() !void paint(Graphics) ... Spielbrett ComputerSpieler MenschlicherSpieler Eigenschaften ??? Methoden !int ziehen(Spielstand) ??? Methoden !int ziehen(Spielstand) Eigenschaften !final int BREITE, HOEHE !int[][] brett Methoden !void steinSetzen(int, int) !boolean hatGewonnen(int) !boolean remis() !boolean spielBeendet() !void anzeigen(PrintStream) !void anzeigen(Graphics) <<interface>> MouseListener MenschlicherSpielerGUI Methoden !void mouseClicked(MouseEvent) Methoden !int ziehen(Spielstand) Jürn Laun VierGewinntGUI Eigenschaften !Spieler[] spieler !Spielbrett brett !int amZug !Thread spielThread Methoden !void init() !void paint(Graphics) !void run() Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Was nun? Üben Sie! Programmieren lernen dauert (oft Jahre). Probieren Sie aus, spielen Sie und trauen Sie sich nach und nach an größere Projekte. Diese Phase eigentlichen Lernens kann kein Kurs ersetzen. Wer eine kann, kann alle: Wenn Sie die Konzepte der objektorientierten Programmierung mit Java verstanden haben, sollten Ihnen andere objektorientierte Sprachen keine großen Schwierigkeiten bereiten. Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Weiter mit Java Aber auch in Java (und dessen Dunstkreis) gibt es eine Fülle von interessanten Technologien, die wir im Kurs nicht oder nur am Rande behandelt haben. Schauen Sie sich zum Beispiel Packages, Generizität, grafische Benutzeroberflächen (Kontrollelemente, Fenster, AWT, Swing), Dateiein- und ausgabe, Netzwerk- und Internetklassen, JavaDoc, Anwendungen auf mobilen Geräten (Java ME) oder UML (nicht nur Java, sondern OOP allgemein) an! Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Danke für’s Teilnehmen, Zuhören und Mitmachen! Jürn Laun Grundlagen der Programmierung Weitere Techniken und Features von Java Projekt (Teil II) Ausblick Quellen Quellen Sun Microsystems. The Java Language Specification. http://java.sun.com/docs/books/jls/index.html , 2005. [Webseite; zuletzt abgerufen 01.03.2009]. Sun Microsystems. Java SE 6 API Specification. http://java.sun.com/javase/6/docs/api/ , 2008. [Webseite; zuletzt abgerufen 01.03.2009]. Jürn Laun Grundlagen der Programmierung