OOP mit Java Oder: Java in 5 Tagen 1. Tag • • • • Klassen und Methoden Hello World in Variationen Von Menschen und Geschlechtern Horden (Schlange stehen) Klassen und Methoden • In Java ist alles eine Klasse • Klassen und Filename müssen identisch sein • Klassen können zu Paketen zusammengefasst werden public class meineKlasse { // hier kommt mehr... } Klassen und Methoden • Klassen können Daten und Methoden beinhalten public class meineKlasse { public int a=0; public void tuWas() { } public void tuNix() { } } Klassen und Methoden • Schreiben Sie die Klasse , kompilieren Sie sie und starten Sie sie. (mit dem ASCII-Editor Ihrer Wahl) public class meineKlasse { public int a=0; public void tuWas() { } public void tuNix() { } } Klassen und Methoden • Es gibt eine spezielle Methode ‚main‘, die als Startpunkt dient. public class test { public static void main(String args[]) { // unser Programm... System.out.println("Hello World!"); } } Klassen und Methoden • Die meisten Typen sind Klassen. public class helloWorld { public static void main (String args[]) { String hw = new String("Hello World."); System.out.println(hw); } } Klassen und Methoden • Eine Schleife kommt hinzu... public class helloWorld { public static void main (String args[]) { String hw = new String("Hello World."); System.out.println(hw); int i; for (i=1; i<hw.length(); i++) { System.out.println(hw.charAt(i)); } } } Klassen und Methoden • Übung... Hello World. ee l l l l o o W o r l d . W o r l d . Von Menschen und Geschlechtern • Eigene Klassen... menschen.java public class menschen { public static void main (String args[]) { mann hans = new mann(); } } mann.java public class mann { } Von Menschen und Geschlechtern menschen.java public class menschen { public static void main (String args[]) { mann hans = new mann(); hans.tuwas(); } } mann.java public class mann { public void tuwas() { System.out.println("Fussball sehen..."); } } Von Menschen und Geschlechtern • Schreiben Sie die Klasse ‚frau‘. menschen.java public class menschen { public static void main (String args[]) { mann hans = new mann(); frau emma = new frau(); hans.tuwas(); emma.tuwas(); } } Von Menschen und Geschlechtern • Führen Sie eine ‚Warteschlange‘ ein. menschen.java public class menschen { public static void main (String args[]) { mann[] schlange = new mann[10]; for (int i=0; i<10; i++) { schlange[i] = new mann(); schlange[i].tuwas(); } } } Von Menschen und Geschlechtern • Jetzt kommt der Trick, wir möchten Männer und Frauen in der Schlange stehen haben... menschen.java public class menschen { public static void main (String args[]) { ???[] schlange = new ???[10]; for (int i=0; i<10; i++) { schlange[i] = waehleGeschlechtZufaellig(); schlange[i].tuwas(); } } } Von Menschen und Geschlechtern • Vererbung & co. mensch.java public class mensch { public void tuwas() { System.out.println("Ich bin nur einm Mensch..."); } } mann.java public class mann extends mensch { public void tuwas() { System.out.println("Fussball sehen..."); } } Von Menschen und Geschlechtern • (Warte-) Schlange... menschen.java public class menschen { public static void main (String args[]) { mensch[] schlange = new mensch[10]; for (int i=0; i<10; i++) { if (i % 2 == 0) schlange[i] = new mann(); else schlange[i] = new frau(); schlange[i].tuwas(); } } } 2. Tag • • • • • • • Parameter lesen ‚echo‘ I/O Exceptions Gehaltsschecks ‚cat‘, ‚wc‘, ‚mailto‘, ... Optional: Quiz Parameter lesen • In args[] werden die Parameter gespeichert, die Sie ihrem Programm übergeben. • Die Anzahl der Elemente eines Arrays erhalten Sie mit array.length • Schreiben Sie ein Programm analog zum ‚echo‘-Programm Parameter lesen • Unser ‚echo‘-Programm... echo.java public class echo { public static void main (String args[]) { System.out.print("Anzahl der Parameter: “); System.out.println(args.length); for (int i=0; i<args.length; i++) { System.out.println(args[i]); } } } I/O - Eigentlich ganz einfach ? • Ein-/Ausgabe durch package java.io • Ausgabe (auf Konsole) mit System.out.println() • Eingabe (von Konsole) mit System.in.readln()? – System.in ist vom Typ java.io.InputStream – Methoden wie read(byte[]) ? – keine Strings,... • Streams lesen und schreiben einzelne Bytes – normalerweise (?) ASCII/Unicode Zeichen • Reader/Writer – ggf. gepuffert BufferedReader/Writer I/O - Streams • Folge von Bytes • können zum Lesen und Schreiben von Bytes verwendet werden • woher/wohin ? • z.B. FileInputStream • Streams als Schnittstelle zwischen Anwendung und Daten • Für Text EA – InputStreamReader/OutputStreamWriter • Pufferung – BufferedReader/BufferedWriter I/O - Beispiele // Einlesen von Tastatur InputStreamReader isr = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(isr); String s = in.readLine(); while (s != null) { System.out.println(s); s = in.readLine(); } Anwendung BufferedReader InputStreamReader InputStream I/O - Einschub Exceptions • Fehlerbehandlung im 'normalen' Code InputStreamReader isr = new InputStreamReader(System.in); if (isr == null) { System.out.println("Fehler beim Oeffnen!"); System.exit(0); } else { BufferedReader in = new BufferedReader(isr); if (in == null) { System.out.println("Fehler beim Lesen!"); System.exit(0); } else { ... } } I/O - Einschub Exceptions • vom Code getrennt InputStreamReader isr = new InputStreamReader(System.in); if (isr == null) { iStatus = ERR_OPEN; goto Error; } BufferedReader in = new BufferedReader(isr); if (in == null) { iStatus = ERR_READER; goto Error; } ... Error: switch (iStatus) ... I/O - Einschub Exceptions • ähnlich goto, aber 'sauberer' try { InputStreamReader isr = new InputStreamReader(System.in); if (isr == null) throw new IOException("Error opening"); BufferedReader in = new BufferedReader(isr); if (in == null) throw new IOException("Error in Reader"); ... } catch (IOException e) { } I/O - Einschub Exceptions • oder gleich 'eingebaut‘ (Vordefiniert) try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(isr); ... } catch (IOException e) { } I/O - Einschub Exceptions • Syntax try { // some code } catch (SomeException e1) { // do something } catch (SomeOtherException e2) { // do something else } finally { // always executed } I/O - Lesen aus Datei // Einlesen aus Datei FileReader f = new FileReader("x.dat"); BufferedReader in = new BufferedReader(f); String s = in.readLine(); // readLine() liefert am Dateiende null while (s != null) { System.out.println(s); s = in.readLine(); } Anwendung BufferedReader FileReader File I/O - Lesen aus einem String // Einlesen aus String StrigReader s = new StringReader("Hallo\nWelt\n"); BufferedReader in = new BufferedReader(s); String s = in.readLine(); while (s != null) { System.out.println(s); s = in.readLine(); } Anwendung BufferedReader StringReader String I/O - Lesen aus dem Netz // Einlesen von URL URL U = new URL("http://www.heise.de"); BufferedReader in = new BufferedReader( new InputStreamReader(U.openStream())); String s = in.readLine(); while (s != null) { System.out.println(s); s = in.readLine(); } Anwendung BufferedReader InputStreamReader URL I/O - Ausgabe in Datei // Ausgabe in Datei try { FileWriter fw = new FileWriter("y.dat")); PrintWriter pw = new PrintWriter(fw); pw.println("Hallo Welt!"); ... pw.close(); } catch (Exception e) { } Anwendung PrintWriter FileWriter File I/O - Ausgabe mal anders try { FileOutputStream os = new FileOutputStream("y.gz"); GZIPOutputStream zos = new GZIPOutputStream(os); PrintWriter pw = new PrintWriter(zos); pw.println("Hallo Welt!"); pw.close(); } catch (Exception e) { } Anwendung PrintWriter GZIPOutputStream FileOutputStream File I/O - Zusammenfassung • I/O in Java ist, verglichen mit anderen Sprachen – – – – – im Sprachumfang enthalten (vgl. C) erheblich komplexer erheblich flexibler genauso effizient nicht nur für 'normale' Dateien, sondern auch etwa für • Netzwerk • Archive • Datenbanken I/O - Übungen • Programm “cat" – gibt Datei auf Konsole aus – Erweiterung: seitenweise • Programm "wc" – Zählt die Zeilen in einer Datei – Erweiterung: auch die Wörter und Buchstaben • Programm "metric" – Bestimmt die maximale/mittlere Schachtelungstiefe in einem Java Programm • Programm "copy" – kopiert Dateien (binär!) • Programm "grep" – durchsucht Dateien nach Muster (Zeichenfolge) I/O - Ein BSP zusammen... import java.io.*; public class cat { public static void main (String args[]) { try { FileReader f = new FileReader(args[0]); BufferedReader in = new BufferedReader(f); String s = in.readLine(); while (s != null) { System.out.println(s); s = in.readLine(); } } catch (Exception e) { System.out.println("Fehler!"); } } } 3. Tag • • • • • Algorithmen Liste Baum ‚grep‘ (Zustandsautomat) Tic/Tak/Toe 4.+5. Tag • Simulation – – – – WaTor (Fischteich) (Christian) Waldpfad Soziale Distanzen (Till) PacMan • RoboWars