Programmieren mit Java Eine Einführung für Anfänger ohne Vorkenntnisse Hubert Partl Download und Copyright • http://www.boku.ac.at/javaeinf/ • Kursunterlagen und Folien • Download, privater Eigengebrauch: frei. • unveränderte Nutzung in Schulen und Universitäten: kostenlos. • Upload, Verbreitung, Bearbeitung, Übersetzung sowie jede kommerzielle Nutzung: nur nach Rücksprache mit dem Autor. • [email protected] Partl: Prog. Java 2 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – Klassen, Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 3 Programmieren • Wie sage ich dem Computer, was er tun soll? Partl: Prog. Java 4 Beispiel: ein Programm Ein Programm soll folgende Kreisberechnungen durchführen: Radius = Umfang = Flaeche = 5.00000 31.41593 78.53982 Wie kann ein solches Programm aussehen? Was muss ich schreiben, damit der Computer das macht? Partl: Prog. Java 5 Beispiel: Quellprogramm (Fortran) 1 program kreis pi = 3.14159265 r = 5.0 umfang = 2 * r * pi flaeche = r * r * pi write (*,1) 'Radius ', r write (*,1) 'Umfang ', umfang write (*,1) 'Flaeche', flaeche format (a7, ' = ', f10.5) end Partl: Prog. Java 6 Programmiersprachen • kommerziell: COBOL, PL/I, SQL • technisch-mathematisch: FORTRAN, Basic • algorithmisch: Algol, Pascal, C • objekt-orientiert: Modula, C++, VisualBasic, Java, C# • andere: Ada, LISP, Perl, PHP, JavaScript, ... Partl: Prog. Java 7 Programm-Elemente • • • Variable = Datenfelder Konstante = Datenwerte Dateien (Files) = Ein- und Ausgabe von Daten Partl: Prog. Java 8 Programm-Elemente • • • Variable = Datenfelder Konstante = Datenwerte Dateien (Files) = Ein- und Ausgabe von Daten • Anweisungen (Statements) = Aktionen – eine nach der anderen ; – Abzweigungen (if, switch) – Schleifen (for, while, do) Partl: Prog. Java 9 Programm-Elemente • • • Variable = Datenfelder Konstante = Datenwerte Dateien (Files) = Ein- und Ausgabe von Daten • Anweisungen (Statements) = Aktionen – eine nach der anderen ; – Abzweigungen (if, switch) – Schleifen (for, while, do) • strukturierte Programmierung: – Blöcke von Statements { } – Unterprogramme (Methoden) – Hauptprogramm (main) Partl: Prog. Java 10 Beispiel: HelloWorld (Java) public class HelloWorld { public static void main (String[] args) { System.out.println("Hello World!"); } } Partl: Prog. Java 11 Java Insel? Kaffee? Programmiersprache! Partl: Prog. Java 12 Eigenschaften von Java • plattformunabhängig • Objekt-orientiert • Syntax ähnlich wie bei C und C++ • umfangreiche Klassenbibliothek • Sicherheit von Internet-Anwendungen Partl: Prog. Java 13 Vorgangsweise 1. Editor notepad "Xxxxx.java" => Source-Programm 2. Compiler, Übersetzer => Binärprogramm, Bytecode javac Xxxxx.java 3. Ausführung java Xxxxx => Ergebnisse Partl: Prog. Java 14 Mit Java arbeiten Start Progr. Zubehör Editor (weißes Notepad-Fenster) Start Progr. Zubehör Eingab. (schwarzes DOS-Fenster, Folder eigenername) ... Programm schreiben ... speichern unter • Folder eigenername • Datei "Classname.java" javac Classname.java ... Programm korrigieren ... speichern javac Classname.java java Classname Partl: Prog. Java 15 Übung: HelloWorld public class HelloWorld { public static void main (String[] args) { System.out.println("Hello World!"); } } Befehle: • notepad • speichern unter: "HelloWorld.java" in Ihrem Directory • javac HelloWorld.java • java HelloWorld Partl: Prog. Java 16 Wiederholung Programmiersprachen Java Vorgangsweise Fragen ? ? ? Partl: Prog. Java 17 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – Klassen, Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 18 Sprachelemente • • • Namen Daten Anweisungen • Übungen • Hinweise für Programmierer: Fehlersuche, Konzepte Partl: Prog. Java 19 Namen Namenskonventionen: • KlassenName (beginnt Groß) • datenFeldName (beginnt klein) • methodenName (beginnt klein) Reservierte Wörter Partl: Prog. Java 20 Daten Partl: Prog. Java 21 Datenfelder (Variable) die wichtigsten Datentypen • int = ganze Zahl (integer) • double = Zahl mit Komma und Exponent • boolean = logischer Wert (ja oder nein) • String = Zeichenkette Werte (Konstante, Literals) int i; i = -1234; double x; x = -123.45; boolean b; b = true; String s; s = "Abc"; x = 1.0E23 b = false; s = null; Partl: Prog. Java 22 Deklarationen und Anfangswerte typ name; name = wert; typ name = wert; Beispiele: int gebJahr; gebJahr = 1972; int anzahl = 0; Partl: Prog. Java 23 Deklaration von Objekten • • Typ ist der Klassenname Das Objekt wird mit einem Konstruktor erzeugt ClassName name; name = new ClassName(); ClassName name = new ClassName(); Beispiele: Date gebDatum; gebDatum = new Date(); Person kursleiter = new Person(); Partl: Prog. Java 24 Ausdrücke und Operatoren Mathematische Operatoren: + - * / % Zuweisungen: = Logische Operatoren: < > <= >= == != ! && || Klammern: ( ) Beispiele: a = ( b + c ) / 2; i = i + 1; if ( ( alter >= 15 ) && ( alter <= 65 ) ) Partl: Prog. Java 25 Ausdrücke (Forts.) Text-Operationen (String) String name = vorName + " " + zuName; Funktionen (Math) x = Math.sqrt(y); Partl: Prog. Java 26 Anweisungen • • Aktionen im Programm Verarbeitung der Daten Partl: Prog. Java 27 Anweisungen (Statements) Statement ; Blöcke von Statements: { Statement ; Statement ; } Kommentare: // Kommentar bis Zeilenende /* Kommentar */ Partl: Prog. Java 28 Beispiel: expressions public class ProgExpr { /* Beispiel fuer eine einfache Berechnung */ public static void main (String[] args) { int guthaben = 1000; System.out.println ("Guthaben = " + guthaben); int einzahlung = 500; System.out.println ("Einzahlung = " + einzahlung); guthaben = guthaben + einzahlung; System.out.println ("Guthaben = " + guthaben); } } Ausgabe: Guthaben = 1000 Einzahlung = 500 Guthaben = 1500 Partl: Prog. Java 29 Übung: einfache Rechnung a=6 b=7 Wie viel ist a mal b? Partl: Prog. Java 30 Beispiel: einfache Rechnung public class EinfRech { public static void main (String[] args) { int a = 6; int b = 7; int c = a * b; System.out.println(c); } } Partl: Prog. Java 31 Ablaufsteuerung • Entscheidungen = Abzweigungen: if, else • Wiederholungen = Schleifen: while, for Partl: Prog. Java 32 if (wenn - dann) if ( logischer Ausdruck ) { Statements; } Beispiel: if ( guthaben >= 1000000 ) { System.out.println ("Du bist Millionaer!"); } Partl: Prog. Java 33 Beispiel: if public class ProgIf { public static void main (String[] args) { int guthaben = 2000000; System.out.println ("Guthaben = " + guthaben); if ( guthaben >= 1000000 ) { System.out.println ("Gratuliere, Du bist Millionaer!"); } } } Ausgabe: Guthaben = 2000000 Gratuliere, Du bist Millionaer! Partl: Prog. Java 34 if - else (wenn - dann - sonst) if ( logischer Ausdruck ) { Statements; } else { Statements; } Partl: Prog. Java 35 Übung: einfacher Vergleich a=6 b=7 Ist a größer als b? Partl: Prog. Java 36 Beispiel: einfacher Vergleich public class EinfVergl { public static void main (String[] args) { int a = 6; int b = 7; if ( a > b ) { System.out.println("ja, a ist größer."); } else { System.out.println("nein, a ist nicht größer."); } } } Partl: Prog. Java 37 while (solange) while ( logischer Ausdruck ) { Statements; } Beispiel: while ( guthaben < sparziel ) { guthaben = guthaben + einzahlung; System.out.println ("neues Guthaben = " + guthaben); } System.out.println( "Sparziel erreicht."); Partl: Prog. Java 38 Beispiel: while public class ProgWhile { public static void main (String[] args) { int guthaben = 1000; int sparziel = 8000; int einzahlung = 600; System.out.println ("Guthaben = " + guthaben); System.out.println ("Sparziel = " + sparziel); while ( guthaben < sparziel ) { guthaben = guthaben + einzahlung; System.out.println ("neues Guthaben = " + guthaben); } System.out.println( "Sparziel erreicht."); } } Partl: Prog. Java 39 Beispiel: while Ausgabe: Guthaben = 1000 Sparziel = 8000 neues Guthaben = 1600 neues Guthaben = 2200 ... neues Guthaben = 7600 neues Guthaben = 8200 Sparziel erreicht. Partl: Prog. Java 40 for (für bestimmte Anzahl) for ( int name=Anfangswert ; logischer Ausdruck ; Wertänderung ) { Statements; } Beispiel: for ( int monat=1; monat<=6; monat=monat+1 ) { guthaben = guthaben + einzahlung; System.out.println (monat + ". Monat:"); System.out.println (" Guthaben = " + guthaben); } Partl: Prog. Java 41 Beispiel: for public class ProgFor { public static void main (String[] args) { int guthaben = 1000; int einzahlung = 500; System.out.println ("Guthaben = " + guthaben); System.out.println ("Einzahlung = " + einzahlung + " pro Monat"); for ( int monat=1; monat<=6; monat=monat+1 ) { guthaben = guthaben + einzahlung; System.out.println (monat + ". Monat:"); System.out.println (" Guthaben = " + guthaben); } } } Partl: Prog. Java 42 Beispiel: for Ausgabe: Guthaben Einzahlung 1. Monat: Guthaben 2. Monat: Guthaben ... 6. Monat: Guthaben = 1000 = 500 pro Monat = 1500 = 2000 = 4000 Partl: Prog. Java 43 Übung: Quadratzahlen Quadratzahlen berechnen und ausgeben: 1*1=1 2*2=4 3*3=9 usw. bis 20 * 20 = 400 Partl: Prog. Java 44 Beispiel: Quadratzahlen public class Quadrat { public static void main (String[] args) { System.out.println(" Quadratzahlen:"); for ( int zahl=1; zahl<=20; zahl=zahl+1 ) { int quad = zahl * zahl; System.out.println (zahl + " * " + zahl + " = " + quad ); } } } Partl: Prog. Java 45 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Hinweise und Konzepte 3. Objektorientierte Programmierung – Klassen, Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 46 Hinweise für Programmierer • • Fehlersuche und Fehlerbehebung Konzepte zur Programmstruktur Partl: Prog. Java 47 Fehlersuche (Debugging) • Computer sind unglaublich dumme Geräte, die unglaublich intelligente Sachen können. Programmierer sind unglaublich intelligente Leute, die unglaublich dumme Sachen produzieren. "Die Presse", 30.8.1999 • Nur wer nichts arbeitet, macht keine Fehler. • Der gute Programmierer ist nicht der, der keine Fehler macht, sondern der, der seine Fehler rasch findet und behebt. Partl: Prog. Java 48 Programm mit Fehler // Anfangswerte eingeben anfangswert = ... // erster Teil der Berechnungen zwischenergebnis = ... // zweiter Teil der Berechungen ergebnis = ... // Ausgabe des Ergebnisses: System.out.println ("Ergebnis = " + ergebnis); • ... und das Ergebnis ist falsch! • Wo liegt der Fehler? Partl: Prog. Java 49 Fehler finden // Anfangswerte eingeben anfangswert = ... System.out.println ("Anfangswert = " + anfangswert); // erster Teil der Berechnungen zwischenergebnis = ... System.out.println ("Zwischenergebnis = " + zwischenergebnis); // zweiter Teil der Berechungen ergebnis = ... // Ausgabe des Ergebnisses: System.out.println ("Ergebnis = " + ergebnis); Partl: Prog. Java 50 Test- und Produktionsversion static final boolean TEST = true; // Anfangswerte eingeben anfangswert = ... if (TEST) { System.out.println ("Anfangswert = " + anfangswert); } // erster Teil der Berechnungen zwischenergebnis = ... if (TEST) { System.out.println ("Zwischenergebnis = " + zwischenergebnis); } // zweiter Teil der Berechungen ergebnis = ... // Ausgabe des Ergebnisses: System.out.println ("Ergebnis = " + ergebnis); Partl: Prog. Java 51 Programmierkonzepte • Wie gehe ich es an? • Wie zerlege ich komplexe Aufgaben in übersichtliche Teile? Partl: Prog. Java 52 Programmierkonzepte • strukturierte Programmierung: möglichst kleine Einheiten = + + Partl: Prog. Java 53 Programmierkonzepte • objekt-orientierte Programmierung (OOP): Daten & Aktionen + = Partl: Prog. Java 54 Programmierkonzepte • top-down: zuerst das Grundgerüst, dann die Details • bottom-up: zuerst die Einzelteile, dann zusammenbauen Partl: Prog. Java 55 Wiederholung Namen Daten, Werte und Ausdrücke Anweisungen Fehlersuche und Konzepte Fragen ? ? ? Partl: Prog. Java 56 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – eine erste kurze Einführung – Klassen, Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 57 Objekte und Klassen • erste kurze Einführung • ein "besseres", erweiterbares Hello-World-Programm als Muster für objekt-orientierte Programme Partl: Prog. Java 58 Beispiel: HelloText-Objekt public class HelloText { public String messageText = "Hello World!"; public void printText() { System.out.println (messageText); } public static void main (String[] args) { HelloText h = new HelloText(); h.printText(); } } Partl: Prog. Java 59 Beispiel: mehrere Objekte public class MultiText { public static void main (String[] args) { HelloText engl = new HelloText(); HelloText germ = new HelloText(); germ.messageText = "Hallo, liebe Leute!"; HelloText cat = new HelloText(); cat.messageText = "Miau!"; engl.printText(); germ.printText(); engl.printText(); cat.printText(); engl.printText(); } } Partl: Prog. Java 60 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – Klassen, Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 61 Objekte und Klassen • OOP = Objekt-orientierte Programmierung Partl: Prog. Java 62 Objekt-orientierte Programmierung • Prozedurale Programmierung: Daten <== ? ? ? ? ? ==> • Aktionen Objekt-orientierte Programmierung (OOP): ( Daten & Aktionen ) <== ==> ! Partl: Prog. Java 63 Klassen und Objekte • Klasse = Menge = Programm = Bauplan des Architekten public class ClassName { .... } • Objekt = Exemplar = Datenfeld in Programm = erzeugt mit Konstruktor (Baumeister) Classname object = new Classname(); ... Partl: Prog. Java 64 Klassen und Objekte • Klasse = Bauplan des Architekten public class ClassName { // Definition von Datenfeldern // Definition von Methoden } • Objekt = erzeugt mit Konstruktor (Baumeister) Classname object = new Classname(); ... object.field ... object.method(); Partl: Prog. Java 65 Beispiel: HelloText-Objekt public class HelloText { public String messageText = "Hello World!"; public void printText() { System.out.println (messageText); } public static void main (String[] args) { HelloText h = new HelloText(); h.printText(); } } Partl: Prog. Java 66 Beispiel: mehrere Objekte public class MultiText { public static void main (String[] args) { HelloText engl = new HelloText(); HelloText germ = new HelloText(); germ.messageText = "Hallo, liebe Leute!"; HelloText cat = new HelloText(); cat.messageText = "Miau!"; engl.printText(); germ.printText(); engl.printText(); cat.printText(); engl.printText(); } } Partl: Prog. Java 67 Datenfelder (Objekteigenschaften) public typ name; public typ name = anfangswert; Verwendung: object.name innerhalb der Klasse: name oder this.name Partl: Prog. Java 68 Methoden (Aktionen) public typ name (typ name, typ name, typ name) { Statements; return wert; } public void name (typ name, typ name, typ name) { Statements; } public void name () { Statements; } Partl: Prog. Java 69 Methoden (Forts.) Verwendung (Aufruf, Ausführung): x = object.name(); object.name(); x = object.name (a, b, c); object.name (a, b, c); innerhalb der Klasse: name() oder this.name() Partl: Prog. Java 70 static • statische Datenfelder und Methoden – nicht einmal pro Objekt (dynamisch), – sondern einmal pro Klasse, von Anfang an – Aufruf über Klassenname statt Objektreferenz • main-Methode (Hauptprogramm): public static void main (String[ ] args) { … } Partl: Prog. Java 71 Konstruktoren • • automatisch erzeugt = Default-Konstruktor oder selbst definiert: ... Verwendung (Objekt erzeugen): ClassName object = new ClassName(); Partl: Prog. Java 72 Wiederholung: Aufbau einer Klasse public class HelloText { public String messageText = "Hello World!"; public void printText() { System.out.println (messageText); } public static void main (String[] args) { HelloText h = new HelloText(); h.printText(); } } Partl: Prog. Java 73 Übung: einfache Person • • Klasse Person: – Eigenschaften: • vorname • zuname – Methode: • public String toString() Klasse PersTest: – main-Methode • Person hans = new Person(); hans.vorname = "Hans"; hans.zuname = "Glück"; System.out.println ( hans.vorname ); System.out.println ( hans ); Partl: Prog. Java 74 Beispiel: einfache Person public class Person { public String vorname; public String zuname; public String toString() { return this.vorname + " " + this.zuname; } } Partl: Prog. Java 75 public class PersTest { public static void main (String[] args) { Person anna; anna = new Person (); anna.vorname = "Anna"; anna.zuname = "Schmidt"; ... System.out.println( anna.vorname ); ... System.out.println( anna ); ... } } Partl: Prog. Java 76 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – Objekte, Klassen, Datenfelder, Methoden, Konstruktoren – Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 77 Vererbung • Allgemeiner Fall = Oberklasse • Spezialfall = Unterklasse "erbt" von der Oberklasse Partl: Prog. Java 78 Vererbung public class Person { public String name; public Date geburtsDatum; ... } public class Beamter extends Person { public int dienstKlasse; public Date eintrittsDatum; ... } Partl: Prog. Java 79 Vererbung (Forts.) • Verwendung der Klassen: Person mutter; Person vater; mutter = new Person(); vater = new Beamter(); • Methoden überschreiben (override, Polymorphismus) – in der Unterklasse eine eigene, spezielle Version – Dann wird diese spezielle Version genommen statt der allgemeinen Version in der Oberklasse Partl: Prog. Java 80 Übung: Person und Student • • • Person: – Eigenschaften: vorname, zuname – Methode: toString() Student: – zusätzliche Eigenschaft: uni – überschriebene Methode: toString() PersTest: – main-Methode: auch Student ... Partl: Prog. Java 81 Beispiel: einfacher Student public class Student extends Person { public String uni; public String toString() { String s; s = vorname + ", studiert an " + uni; return s; } } Partl: Prog. Java 82 public class PersTest { public static void main (String[] args) { ... Student georg = new Student (); georg.vorname = "Georg" ; georg.zuname = "Fischer" ; georg.uni = "BOKU" ; ... System.out.println( georg.vorname ); ... System.out.println( georg ); ... } } Partl: Prog. Java 83 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – Objekte, Klassen, Datenfelder, Methoden, Konstruktoren – Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 84 Analyse und Design • • • OOA = Objekt-orientierte Analyse OOD = Objekt-orientiertes Design OOP = Objekt-orientierte Programmierung • Objektverbindungen Partl: Prog. Java 85 Objektorientierte Analyse & Design komplexes System => einzelne Objekte Objekte: • einfach • abgeschlossen Analyse: • Hauptwort • Eigenschaftswort • Zeitwort • "A hat ein B" • "A ist ein B" => Objekt, Datenfeld => Datenfeld => Methode => Datenfeld => Vererbung Partl: Prog. Java 86 Design-Übung: Konto und Person Analyse (Beziehungen in deutschen Sätzen) und Design (Klassen, Datenfelder, Methoden) • • • • • • • • abheben einzahlen Guthaben Konto Person Student Vorname Zuname Partl: Prog. Java 87 Beispiel: Analyse Konto und Person • Jede Person hat einen Vornamen. • Jede Person hat einen Zunamen. • Manche Personen haben ein oder mehrere Konten, manche haben kein Konto. • Jeder Student ist eine Person. • Jedes Konto gehört einer Person (Inhaber). • Jedes Konto hat einen Kontostand (Guthaben). • Auf ein Konto kann man einen Geldbetrag einzahlen. • Von einem Konto kann man einen Geldbetrag abheben. Partl: Prog. Java 88 Beispiel: Design Konto und Person • Klasse Person – Eigenschaften: Vorname, Zuname, evtl. Liste der Konten • Klasse Student – Unterklasse von Person • Klasse Konto – Eigenschaften: Inhaber (Person), Guthaben – Methoden: einzahlen, abheben Partl: Prog. Java 89 Übung: einfaches Konto Klasse Konto: • Eigenschaften: – inhaber (Typ: Person) – guthaben (Typ: double) • Methoden: – public void einzahlen (double betrag) – public void abheben (double betrag) – public String toString() • main-Methode: – Person p = new Person(); // auch Student? … Konto k = new Konto(); k.inhaber = p k.einzahlen(100.0); System.out.println(k); ... Partl: Prog. Java 90 Beispiel: einfaches Konto public class Konto { public Person inhaber; public double guthaben = 0.0; public void einzahlen (double betrag) { guthaben = guthaben + betrag ; } public void abheben (double betrag) { guthaben = guthaben - betrag ; } public String toString() { return inhaber + ": " + guthaben + " Euro"; } Partl: Prog. Java 91 public static void main (String[] args) { Person hans = new Person(); hans.vorname = "Hans"; hans.zuname = "Reich"; Konto hansKonto = new Konto(); hansKonto.inhaber = hans; System.out.println(hansKonto); hansKonto.einzahlen(1000.0); System.out.println(hansKonto); hansKonto.abheben(200.0); System.out.println(hansKonto); ... } } Partl: Prog. Java 92 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – Objekte, Klassen, Datenfelder, Methoden, Konstruktoren – Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 93 Kapselung • Sichtbarkeit / Data Hiding • • nach außen notwendig = bitte nicht verändern nur intern verwendet = kann verändert werden • Java Beans Partl: Prog. Java 94 Sichtbarkeit • • • public ... private Partl: Prog. Java 95 Java Beans - Konventionen public class ClassName { private typ xxxx = anfangswert; public void setXxxx (typ xxxx) { // Gültigkeit des Wertes kontrollieren this.xxxx = xxxx; } public typ getXxxx() { return this.xxxx; } } Partl: Prog. Java 96 Skizze: HelloBean public class HelloBean { private String messageText = "Hello World!"; public void setMessageText(String newText) { messageText = newText; } public String getMessageText() { return messageText; } public void printText() { System.out.println (messageText); } Partl: Prog. Java 97 public static void main (String[] args) { HelloBean engl = new HelloBean(); HelloBean germ = new HelloBean(); germ.setMessageText("Hallo, liebe Leute!"); HelloBean cat = new HelloBean(); cat.setMessageText("Miau!"); engl.printText(); germ.printText(); engl.printText(); cat.printText(); engl.printText(); } } Partl: Prog. Java 98 Beispiel: schlechte Date-Klasse public class BadDate { // very bad, don't do this! public int year; public int month; public int day; } public class TestDate { public static void main (String[] args) { BadDate date1 = new BadDate(); date1.day = 35; date1.month = 5; date1.year = 97; ... } } Partl: Prog. Java 99 Übung: Person als Java Bean • • Klasse Person: – vorname, getVorname(), setVorname(...) – zuname, getZuname(), setZuname(...) – toString() Klasse PersTest: – main-Methode Person hans = new Person(); hans.setVorname ( "Hans" ); hans.setZuname ( "Glück" ); System.out.println ( hans.getVorname() ); System.out.println ( hans ); Partl: Prog. Java 100 Beispiel: Person als Java Bean public class Person { private String vorname; private String zuname; public void setZuname (String s) { this.zuname = s; } public String getZuname() { return this.zuname; } Partl: Prog. Java 101 public void setVorname (String s) { this.vorname = s; } public String getVorname() { return this.vorname; } public String toString() { return this.vorname + " " + this.zuname; } } Partl: Prog. Java 102 public class PersTest { public static void main (String[] args) { Person anna, willi; anna = new Person (); anna.setVorname( "Anna" ); anna.setZuname( "Schmidt" ); willi = new Person (); willi.setVorname( "Wilhelm" ); willi.setZuname( "Schlosser" ); System.out.println("Vornamen:"); System.out.println( anna.getVorname() ); System.out.println( willi.getVorname() ); System.out.println("Komplette Informationen:"); System.out.println( anna ); System.out.println( willi ); } } Partl: Prog. Java 103 Übung: Person und Student als Java Beans • • • Person: – get/setVorname, get/setZuname, toString() Student: – get/setUni, toString() PersTest: – main-Methode Partl: Prog. Java 104 Beispiel: Student als Java Bean public class Student extends Person { private String uni; public void setUni (String uni) { this.uni = uni; } public String getUni() { return this.uni; } public String toString() { String s; s = getVorname() + ", studiert an " + uni; return s; } } Partl: Prog. Java 105 public class PersTest { public static void main (String[] args) { Person anna = new Person (); anna.setVorname( "Anna" ); anna.setZuname( "Schmidt" ); Student georg = new Student (); georg.setVorname( "Georg" ); georg.setZuname( "Fischer" ); georg.setUni( "BOKU" ); System.out.println( anna.getVorname() ); System.out.println( georg.getVorname() ); System.out.println( anna ); System.out.println( georg ); } } Partl: Prog. Java 106 Übung: Konto und Person als Java Beans Klasse Konto: • • • • inhaber (Typ: Person) getInhaber, setInhaber guthaben (Typ: double) getGuthaben, setGuthaben, einzahlen, abheben toString() main-Methode: – Person und Konto – Student und Konto Partl: Prog. Java 107 Beispiel: Konto als Java Bean public class Konto { private Person inhaber; private double guthaben = 0.0; public void setInhaber (Person inhaber) { this.inhaber = inhaber; } public Person getInhaber() { return this.inhaber; } Partl: Prog. Java 108 private void setGuthaben (double neuerBetrag) if (neuerBetrag >= 0.0) { this.guthaben = neuerBetrag; } } public double getGuthaben() { return this.guthaben; } public void einzahlen (double betrag) { this.setGuthaben( this.guthaben + betrag ); } public void abheben (double betrag) { this.setGuthaben( this.guthaben - betrag ); } } Partl: Prog. Java 109 public String toString() { return this.inhaber + ": " + this.guthaben + " Euro"; } public static void main (String[] args) { Person hubert = new Person (); hubert.setVorname("Hubert"); hubert.setZuname("Partl"); Konto kontoH = new Konto(); kontoH.setInhaber(hubert); System.out.println(kontoH); kontoH.einzahlen(1000.0); System.out.println(kontoH); kontoH.abheben(500.0); System.out.println(kontoH); Partl: Prog. Java 110 Student anna = new Student(); anna.setZuname("Fleißig"); anna.setVorname("Anna"); anna.setUni("BOKU"); Konto kontoA = new Konto(); kontoA.setInhaber(anna); System.out.println(kontoA); kontoA.einzahlen(1000.0); System.out.println(kontoA); kontoA.abheben(500.0); System.out.println(kontoA); } } Partl: Prog. Java 111 Wiederholung Klassen, Objekte, Datenfelder, Methoden Vererbung Objektverbindungen, Analyse und Design Kapselung und Java-Beans Fragen ? ? ? Partl: Prog. Java 112 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – Klassen, Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 113 Klassenbibliothek • mehr als 1.000 nützliche Programme • • • Beispiele: Graphische User-Interfaces Datenbanken Partl: Prog. Java 114 Java-Pakete • java.lang (language) • java.awt und java.awt.event (abstract windowing toolkit) • java.util und java.text (utilities) • java.io (input, output) • java.net (networking) • java.sql (structured query language) Partl: Prog. Java 115 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – Klassen, Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 116 Beispiel: Konto-GUI • Graphisches User-Interface für unser Konto Partl: Prog. Java 117 Konto-GUI - erster Schritt • Datenmodell (model) • Klassen: – Person – Konto – KontoFrame (Fenster) – FensterTest (main-Methode) Partl: Prog. Java 118 Konto-GUI - erster Schritt public class FensterTest { public static void main (String[] args) { Person hans = new Person(); hans.setVorname("Hans"); hans.setZuname("Reich"); Konto hansKonto = new Konto(); hansKonto.setInhaber(hans); KontoFrame fenster = new KontoFrame(); fenster.setKonto(hansKonto); fenster.setVisible(true); } } Partl: Prog. Java 119 import java.awt.*; import java.awt.event.*; import java.text.*; public class KontoFrame extends Frame { private Konto meinKonto = null; public void setKonto (Konto k) { this.meinKonto = k; } public Konto getKonto() { return meinKonto; } } Partl: Prog. Java 120 Konto-GUI erster Schritt • • • leeres Fenster, nichts zu sehen Mausklicks funktionieren nicht Abbruch mit Ctrl-C oder Task-Manager Partl: Prog. Java 121 Konto-GUI - zweiter Schritt • Datenmodell (model) • Ansicht (view) Partl: Prog. Java 122 Konto-GUI - zweiter Schritt import java.awt.*; import java.awt.event.*; import java.text.*; public class KontoFrame extends Frame { private Konto meinKonto = null; Partl: Prog. Java 123 private Label inhaberText = new Label("Inhaber"); private Label inhaberAnzeige = new Label(); private Label guthabenText = new Label("Kontostand"); private Label guthabenAnzeige = new Label(); private Label betragText = new Label("Betrag eingeben"); private TextField betragEingabe = new TextField("100"); private Button einzahlenButton = new Button("einzahlen"); private Button abhebenButton = new Button("abheben"); Partl: Prog. Java 124 private GridLayout fensterLayout = new GridLayout (4, 2); private DecimalFormat geldFormat = new DecimalFormat("#,##0.00"); public void setKonto (Konto k) { this.meinKonto = k; } public Konto getKonto() { return meinKonto; } Partl: Prog. Java 125 public void init () { Person inhaber = meinKonto.getInhaber(); String inhString = inhaber.toString(); inhaberAnzeige.setText(inhString); double guthaben = meinKonto.getGuthaben(); String gutString = geldFormat.format(guthaben); guthabenAnzeige.setText(gutString); Partl: Prog. Java 126 this.setSize(300,150); this.setTitle("Konto-Fenster"); this.setLayout(fensterLayout); this.add(inhaberText); this.add(inhaberAnzeige); this.add(guthabenText); this.add(guthabenAnzeige); this.add(betragText); this.add(einzahlenButton); this.add(betragEingabe); this.add(abhebenButton); } } Partl: Prog. Java 127 public class FensterTest { public static void main (String[] args) { ... KontoFrame fenster = new KontoFrame(); fenster.setKonto(hansKonto); fenster.init(); fenster.setVisible(true); } } Partl: Prog. Java 128 Demo: Konto-GUI zweiter Schritt • • • sieht schön aus Mausklicks funktionieren nicht Abbruch mit Ctrl-C oder Task-Manager Partl: Prog. Java 129 Konto-GUI - dritter Schritt • Datenmodell (model) • Ansicht (view) • Steuerung (event handling, controller) Partl: Prog. Java 130 Konto-GUI - dritter Schritt import ... public class KontoFrame extends Frame implements ActionListener, WindowListener { ... public void init () { ... einzahlenButton.addActionListener(this); abhebenButton.addActionListener(this); this.addWindowListener(this); } Partl: Prog. Java 131 public void actionPerformed (ActionEvent e) { String betragString = betragEingabe.getText().trim(); double betrag = Double.parseDouble( betragString ); Object angeklickt = e.getSource(); if (angeklickt == einzahlenButton ) { meinKonto.einzahlen( betrag ); } if (angeklickt == abhebenButton ) { meinKonto.abheben( betrag ); } double guthaben = meinKonto.getGuthaben(); String gutString = geldFormat.format(guthaben); guthabenAnzeige.setText(gutString); } Partl: Prog. Java 132 public void windowClosing (WindowEvent e) { this.setVisible(false); System.exit(0); } public void windowClosed (WindowEvent e) { } public void windowOpened (WindowEvent e) { } public void windowIconified (WindowEvent e) { } public void windowDeiconified (WindowEvent e) { } public void windowActivated (WindowEvent e) { } public void windowDeactivated (WindowEvent e) { } } Partl: Prog. Java 133 Demo: Konto-GUI dritter Schritt • alles funktioniert! Partl: Prog. Java 134 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – Klassen, Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 135 Datenbanken <===> Java GUI Datenbank Partl: Prog. Java 136 Relationale Datenbanken • • • Tabellen (Relationen) Spalten = Datenfelder Zeilen = Datensätze (Records) Mitarbeiter Vorname Hans Grete Peter Zuname Fleißig Tüchtig Gscheitl Geburtsjahr 1972 1949 1968 Gehalt 2400.00 3200.00 1600.00 Partl: Prog. Java 137 Structured Query Language SQL • Datenbank-Struktur ändern: CREATE, ALTER, DROP • Daten ändern: INSERT, UPDATE, DELETE • Daten abfragen: SELECT Partl: Prog. Java 138 SQL-Befehle zur Datenänderung INSERT INTO Employees (EmployeeNumber, FirstName, LastName, BirthYear, Salary) VALUES (4711, 'Grete', 'Tüchtig', 1949, 3200.0) UPDATE Employees SET Salary = 3600.0 WHERE LastName = 'Tüchtig' DELETE FROM Employees WHERE EmployeeNumber = 4710 Partl: Prog. Java 139 SQL-Befehle zur Datenabfrage SELECT * FROM Employees SELECT LastName, Salary FROM Employees WHERE BirthYear <= 1970 ORDER BY Salary DESC SELECT * FROM Employees WHERE LastName = 'Fleißig' AND FirstName LIKE 'H%' Partl: Prog. Java 140 Datenbankzugriff in Java • • Java Database Connectivity JDBC Open Database Connectivity ODBC (MS-Access) Java Virtual Machine <===> JDBC-Driver <===> Datenbank • Class.forName( "Drivername" ); Partl: Prog. Java 141 JDBC-Klassen (Überblick) • import java.sql.*; • Connection db = DriverManager.getConnection ("dbname", "username", "password"); • Statement stmt = db.createStatement(); • ResultSet rs = stmt.executeQuery ("sql"); oder int anzahl = stmt.executeUpdate ("sql"); Partl: Prog. Java 142 Fehlerbehandlung (Exceptions) • normaler Programmablauf – try = versuchen, ob es richtig abläuft – optimistische Version ohne Fehlerbehandlung • Ausnahmen (Exceptions) – catch = alle Fehlersituationen (ab)fangen – Fehlermeldung ausgeben – Fehler korrigieren oder Programm abbrechen Partl: Prog. Java 143 Fehler abfangen (try, catch) try { Statement1; Statement2; Statement3; ... StatementX; } catch (Exception e) { System.out.println("*** Fehler: " + e); } Partl: Prog. Java 144 Beispiel: Datenbank-Abfrage import java.sql.*; ... try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection ("jdbc:odbc:databasename", "admin", "geheim"); con.setReadOnly(true); Statement stmt = con.createStatement(); Partl: Prog. Java 145 ResultSet rs = stmt.executeQuery ("SELECT LastName, Salary, Age FROM Employees"); System.out.println("List of all employees:"); while (rs.next()) { System.out.print(" name=" + rs.getString(1) ); System.out.print(" salary=" + rs.getDouble(2) ); System.out.print(" age=" + rs.getInt(3) ); System.out.println(); } rs.close(); stmt.close(); con.close(); } catch .. Partl: Prog. Java 146 Beispiel: Datenbank-Update import java.sql.*; ... try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection ("jdbc:odbc:databasename", "admin", "geheim"); Statement stmt = con.createStatement(); Partl: Prog. Java 147 int rowCount = stmt.executeUpdate ("UPDATE Employees " + " SET Salary = 5000.0 WHERE LastName = 'Partl' "); System.out.println( rowCount + "Gehaltserhoehungen durchgefuehrt." ); stmt.close(); con.close(); } catch ... Partl: Prog. Java 148 Vorbereitung DB-Übung • Datenbank ist angelegt ( mit MS-Access) – Tabelle Mitarbeiter – ohne Passwort-Schutz • Datenbank ist im ODBC Manager registriert – Datenquellenname TestDB1 Partl: Prog. Java 149 Datenbank-Übung: Geburtsjahr Liste von Vorname und Geburtsjahr aller Mitarbeiter am Bildschirm anzeigen • sun.jdbc.odbc.JdbcOdbcDriver • jdbc:odbc:TestDB1 • SELECT Vorname, Geburtsjahr FROM Mitarbeiter ORDER BY Vorname Partl: Prog. Java 150 Beispiel: Geburtsjahr import java.sql.*; public class GebJahr { public static void main (String[] args) { try { Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection ("jdbc:odbc:TestDB1"); con.setReadOnly(true); Statement stmt = con.createStatement(); Partl: Prog. Java 151 ResultSet rs = stmt.executeQuery ("SELECT Vorname, Geburtsjahr " + " FROM Mitarbeiter ORDER BY Vorname"); while (rs.next()) { System.out.println ( rs.getString(1) + " " + rs.getInt(2) ); } rs.close(); stmt.close(); con.close(); } catch (Exception e) { System.out.println("*** Fehler: " + e); } } } Partl: Prog. Java 152 Beispiel: GUI zur Datenbank-Suche • • • • Graphisches User-Interface Suche nach Mitarbeitern in der Datenbank Eingabe: – Teilstring von Vor- oder Zuname Ausgabe: – Anzahl der gefundenen Teilnehmer – Vorname, Zuname, Geburtsjahr der Teilnehmer – Fehlermeldungen Partl: Prog. Java 153 Datenbank-GUI Partl: Prog. Java 154 Datenbank-Suche SELECT Vorname, Zuname, Geburtsjahr FROM Mitarbeiter WHERE Vorname LIKE '%xxx%' OR Zuname LIKE '%xxx%' ORDER BY Vorname, Zuname Partl: Prog. Java 155 Beispiel: SuchFrame.java import java.awt.*; import java.awt.event.*; import java.sql.*; public class SuchFrame extends Frame implements ActionListener, WindowListener { Partl: Prog. Java 156 private String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; private String database = "jdbc:odbc:TestDB1"; private Label ueberschrift = new Label ("Teilstring-Suche in Vor- und Zunamen"); private TextField eingabe = new TextField(20); private Button suchButton = new Button ("Suchen"); private Label ergebnis = new Label ("0 Mitarbeiter gefunden"); private TextArea ausgabe = new TextArea(8,40); private FlowLayout layout = new FlowLayout(); Partl: Prog. Java 157 public void init() { try { Class.forName( driver ); } catch (Exception e) { ausgabe.setText("Fehler: " + e); } this.setTitle("Datenbank-Suche"); this.setLayout(layout); this.setSize(360, 300); this.add(ueberschrift); this.add(eingabe); this.add(suchButton); this.add(ergebnis); this.add(ausgabe); eingabe.addActionListener(this); suchButton.addActionListener(this); this.addWindowListener(this); } Partl: Prog. Java 158 public void actionPerformed (ActionEvent event) { // Enter im TextField oder Klick auf den Button String suchString = eingabe.getText().trim(); suchen (suchString); } private void suchen (String x) { int count = 0; // bisher nichts gefunden ausgabe.setText(""); // alte Ausgabe löschen, Platz für neue String sql = "SELECT Vorname, Zuname, Geburtsjahr FROM Mitarbeiter " + " WHERE Vorname LIKE '%" + x + "%' " + " OR Zuname LIKE '%" + x + "%' " + " ORDER BY Vorname, Zuname "; Connection con = null; Statement stmt = null; ResultSet rs = null; Partl: Prog. Java 159 try { con = DriverManager.getConnection ( database ); stmt = con.createStatement(); rs = stmt.executeQuery ( sql ); while (rs.next()) { String zeile = rs.getString(1) + " " + rs.getString(2) + ", geb. " + rs.getInt(3); ausgabe.append( zeile + "\n" ); count = count + 1; } } catch (Exception e) { ausgabe.append( "Fehler: " + e + "\n"); } ergebnis.setText( count + " Mitarbeiter gefunden"); Partl: Prog. Java 160 // alles schließen, was eventuell geöffnet wurde try {rs.close(); } catch (Exception ex) { } try {stmt.close(); } catch (Exception ex) { } try {con.close(); } catch (Exception ex) { } } public void windowClosing (WindowEvent e) { this.setVisible(false); System.exit(0); } public void windowClosed (WindowEvent e) { } public void windowOpened (WindowEvent e) { } public void windowIconified (WindowEvent e) { } public void windowDeiconified (WindowEvent e) { } public void windowActivated (WindowEvent e) { } public void windowDeactivated (WindowEvent e) { } Partl: Prog. Java 161 public static void main (String[] args) { SuchFrame fenster = new SuchFrame(); fenster.init(); fenster.setVisible(true); } } Partl: Prog. Java 162 Wiederholung Klassenbibliothek Graphische User-Interfaces Datenbanken Fragen ? ? ? Partl: Prog. Java 163 Kursablauf 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – Klassen, Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 164 API Online-Dokumentation • API = Application Programming Interface Beschreibung aller Klassen der Java-Klassenbibliothek in HTML-Format • Overview Liste aller Pakete (Packages) • Class Hierarchy (tree) Liste aller Klassen (Ober- und Unterklassen) • Index (fields and methods, all names) alphabetische Liste aller Eigenschaften und Methoden Partl: Prog. Java 165 Übung Online-Dokumentation • • Web-Browser starten http://java.sun.com/j2se/1.5.0/docs/api/ • • Was ist System.out (Objekt)? Was tut println (Methode)? Partl: Prog. Java 166 Programm-Dokumentation (javadoc) /** Beschreibender Text * Formatierung mit HTML-Befehlen */ Aufruf: – javadoc *.java erzeugt: – Classname.html für jede Klasse – index.html – packages.html, tree.html, AllNames.html, ... Lesen mit Web-Browser (Netscape, Internet Explorer) – start index.html Partl: Prog. Java 167 Übung: javadoc • Vorher alle eventuellen fehlerhaften java-Dateien löschen • Online-Doku von allen (fehlerfreien) Java-Programmen erzeugen: javadoc *.java • Online-Doku im Web-Browser ansehen: start index.html Partl: Prog. Java 168 Online-Informationen über Java englisch: • Online-Dokumentation (API) innerhalb des JDK • http://java.sun.com/ und http://www.javasoft.com/ • http://www.gamelan.com/ • http://www.sourceforge.net/ • http://java.sun.com/docs/books/tutorial/index.html • http://sunsite.unc.edu/javafaq/javafaq.html • http://mindprod.com/gloss.html • http://www.BruceEckel.com/ Bruce Eckel Partl: Prog. Java 169 Online-Informationen über Java deutsch: • http://www.dclj.de/ • http://www.boku.ac.at/javaeinf/ • http://www.gkrueger.com/ • http://www.tutego.com/javabuch/ de.comp.lang.java Hubert Partl Guido Krüger Christian Ullenbohm Newsgruppen: • comp.lang.java.* • de.comp.lang.java Partl: Prog. Java 170 Was sollen wir uns merken? 1. Grundlagen – Programmiersprachen, Java 2. Sprachelemente – Namen, Daten, Anweisungen, Konzepte 3. Objektorientierte Programmierung – Klassen, Vererbung, Analyse und Design, Kapselung 4. Klassenbibliothek – Pakete, Graphische User-Interfaces, Datenbanken 5. weitere Informationen Partl: Prog. Java 171 Danke und Auf Wiedersehen!