Michael Bader 8. 12. April 2002
Java Blockkurs Übersicht Montag: Erste Schritte in Java; Variablen, Operatoren, Anweisungen Dienstag: Objektvariablen und Objektmethoden; Felder und Objekte anlegen Mittwoch: Eigene Klassen definieren; Vererbung und Schnittstellen Donnerstag: Java-Applications; Objektorientiertes Design Freitag: Exceptions, evtl. Threads, Swing, evtl. Java Beans, etc.
Montag Inhaltsübersicht Was ist Java? Was ist Objekt-Orientierte Programmierung? Ein erstes Objekt: das Hello World! -Applet Variablen in Java: Datentypen, Deklaration und Zuweisung Operatoren in Java Anweisungen in Java
Was ist Java? Definition: (aus The Java Language: A Whitepaper /SUN) Java: A simple, object-oriented, distributed, interpreted, robust, secure, architecture neutral, portable, high-performance, multi-threaded, and dynamic language. einfach objekt-orientiert interpretiert ( Java Virtual Machine ) robust, sicher verteilt, multithread-fähig, dynamisch architekturunabhängig, portabel
Merkmale objekt-orientierter Programmierung Abstraktion Kapselung Modularität Vererbung Polymorphismus
Was ist Abstraktion? Abstraktion: Konzentration auf die wesentlichen Eigenschaften ignoriere Details Programmdesign mittels Objekten und Klassen (anstelle von Variablen/Speicherzellen) Was tut ein Objekt? anstelle von wie wird es das tun? top-down Ansatz lege erst Schnittstellen (Interaktion der Objekte) fest, implementiere später Abstraktion ist Teil objektorientierten Designs (Programmentwurf).
Was ist ein Objekt? Definition: An object is a software bundle of variables and related methods. Ein Objekt ist charakterisiert durch seine Identität, seinen Zustand und sein Verhalten: die Identität unterscheidet es von allen anderen Objekten; der Zustand ist durch seine Variablen gegeben; das Verhalten eines Objekts ist durch seine Methoden (Funktionen, Prozeduren) gegeben Objekte können real existierende Komponenten wiedergeben, die Teil der Problemstellung sind.
Was ist eine Klasse? Definition: A class is a blueprint that defines the variables and the methods common to all objects of a certain kind. Objekte vs. Klassen: Klassen werden vom Programmierer definiert ( Konstruktionsplan ) Objekte werden während des Programmablaufs erzeugt Objekte sind Instanzen einer Klasse alle Objekte einer Klasse besitzen die gleichen Methoden, zeigen daher gleiches Verhalten alle Objekte einer Klasse haben die gleichen Variablen ( Member ), aber mit unterschiedlichem Inhalt (Zustand)
Was ist Kapselung bzw. Information Hiding? Kapselung: Objekte enthalten alle benötigten Variablen sowie die darauf arbeitenden Funktion ( Methoden ) Ziel: Wissen über Implementierung einer Klasse für andere Klassen nicht nötig Information hiding: Implementierung einer Klasse wird vor anderen Klassen verborgen Zugriff auf private Variablen oder Methoden wird verboten Modifikation eines Objekts nur über öffentliche Methoden (und Variablen) möglich Ziel: Implementierung einer Klasse für andere Klassen nicht sichtbar
Was ist Vererbung? Vererbung: eine Klasse kann Eigenschaften einer Oberklasse übernehmen. Ziele: Wiederverwendung existierender (funktionierender, fehlerfreier) Klassen definiere generisches Verhalten in einer Oberklasse, das dann von verschiedenen (verwandten) Klassen geerbt werden kann Beispiel: Fahrzeug (= Oberklasse) mögliche Unterklassen: Auto, Motorrad, Pferdekutsche,... Unterklassen von Auto: Cabrio, Kombi, Limousine,...
Ein erstes Objekt: ein Java Applet Ein Java Applet ist typischerweise Teil einer Webseite der Programmierer entwirft eine Klasse der Webbrowser erzeugt (und startet ) ein Objekt dieser Klasse Beispiel: import java.awt.*; import java.applet.applet; public class HelloApplet extends Applet { public void paint(graphics g) { g.drawstring("hello World!",50,50); } }
HelloApplet (1) import java.awt.*; import java.applet.applet; public class HelloApplet extends Applet { public void paint(graphics g) { g.drawstring("hello World!",50,50); } } import java.awt.*; import java.applet.applet; importiere Klassen von bestimmten Java-Bibliotheken (awt = abstract windowing toolkit) analog zu with(...) in Maple
HelloApplet (2) import java.awt.*; import java.applet.applet; public class HelloApplet extends Applet { public void paint(graphics g) { g.drawstring("hello World!",50,50); } } public class HelloApplet extends Applet definiere Klasse HelloApplet als Erweiterung eines Applets Applet ist java.applet.applet Vererbung : HelloApplet erbt Eigenschaften von der Klasse Applet
HelloApplet (3) import java.awt.*; import java.applet.applet; public class HelloApplet extends Applet { public void paint(graphics g) { g.drawstring("hello World!",50,50); } } public void paint(graphics g) definiere (zusätzliche) Methode paint Parameter g: Objekt vom Typ Graphics (in java.awt definiert, modelliert ein grafisches Ausgabegerät) paint wird aufgerufen, wenn das Applet neu gezeichnet wird.
HelloApplet (4) import java.awt.*; import java.applet.applet; public class HelloApplet extends Applet { public void paint(graphics g) { g.drawstring("hello World!",50,50); } } g.drawstring("hello World!",50,50); rufe die Methode drawstring für das Objekt g (grafisches Ausgabegerät) auf. zeichne den Text "Hello World!" bei Koordinate (50, 50)
Programme ausführen: Maple vs. Java Maples Programmiersprache: benötigt Maple als Laufzeitumgebung ist interaktiv: Benutzer gibt Ausdrücke ein, Maple berechnet Ergebnis ist deklarativ: Prozeduren jederzeit neu definierbar, die letzte Definition gilt. Java: Compiler übersetzt Quelltext in Java Bytecode Java Virtual Machine führt Bytecode aus nicht interaktiv: Änderung des Quelltexts erfordert erneutes Compilieren. imperativ: Ein-/Ausgabe explizit programmiert; Abarbeitung der Instruktionen vom Programm vorgegeben.
Maple und Java Übersetzungsvorgang Maple Prozedure in Maple-worksheet eingeben return Maple prüft Syntax Maple erzeugt interne Darstellung der Prozedur Benutzer ruft Prozedur auf: Maple berechnet Ergebnis (und gibt es aus) Java Programm in Texteditor eingeben Java-Compiler aufrufen Compiler prüft Syntax Compiler erzeugt Java Bytecode Bytecode in Java Virtual Machine starten: Programm wird ausgeführt
Erste Schritte in Java I. Programm in Texteditor eingeben und speichern Regel: Programmdatei trägt immer den Namen der Klasse plus.java II. Compiler aufrufen: javac HelloApplet.java überprüft Programm auf (syntaktische) Korrektheit erzeugt Java Bytecode HelloApplet.class III. Programm starten: Applet im Appletviewer oder Browser Application in Java Runtime Environment
Applets und HTML Ein Applet ist typischerweise Teil einer Webseite (in HTML ). Minimalbeispiel: HelloApplet.html <html> <head><title>webseite mit Applet</title></head> <body> <applet code="helloapplet.class" width=300 height=200></applet> </body> </html> Aufruf im Browser: z.b. netscape HelloApplet.html Aufruf im Appletviewer: appletviewer HelloApplet.html
Maple vs. Java Variablen Maple: Variablen enthalten Ausdrücke mathematische Ausdrücke verschiedene Arten von Ausdrücken wechselnde Arten von Ausdrücken logische Datenstrukturen: Listen, Mengen, Tabellen Java: Variablen sind einfache Datentypen oder Objekte enthalten bestimmten Variablentyp (ganze Zahl, Graphics-Objekt,... ) Variablentyp wird im Voraus festgelegt Objekte bündeln einfache Datentypen bzw. andere Objekte Fundamental unterschiedliches Konzept bzgl. Variablen!
Variablen in Java Variablen müssen stets deklariert werden (Typ festlegen) bevor sie verwendet werden darf es gibt verschiedene Variablentypen eine Variable eines bestimmten Typs kann nur Information dieses Typs enthalten. einfache Variablen enthalten Werte (Zahlen, Zeichen, true/false), keine Terme oder Ausdrücke Variablen für komplexe, logische Datenstrukturen (Listen, Mengen, etc.) sind vom Programmierer zu implementieren (Klassen). Felder können aus einfachen Variablen und aus Objekten gebildet werden
Einfache Datentypen in Java Typ Inhalt Platz boolean true oder false 1 bit char Unicode Zeichen 16 bit byte Integer { 128,..., 127} 8 bit short Integer { 32768,..., 32767} 16 bit int Integer { 2147483648,..., 2147483647} 32 bit long 64-bit Integer 64 bit float IEEE 754 Gleitkommazahl 32 bit double IEEE 754 Gleitkommazahl 64 bit Mit final lassen sich Konstanten definieren, z.b. final int, final double, etc.
Variablen Deklarieren und Initialisieren Beispiele: int i; int j=0; float e=2.7182f, pi=3.14159f; final double PI=3.14159265; char c= A ; falls nicht explizit initialisiert wird, erfolgt implizite Initialisierung (i.d.r. zu 0) Variablen dürfen (beinahe) überall deklariert werden beachte Typkorrektheit!
Variablen Zuweisungen und Operatoren Zuweisungen und Operatoren ( rechnen ) funktioniert in Java fast genauso wie in Maple: int i; float e; double pi = 3.14159265; i = 3; e = (2.7182f * i) - 1.5f; pi *= 2.0; beachte das = ( := gibt es in Java nicht!) das Semicolon schließt die Zuweisung ab alle Operationen müssen typ-korrekt sein (float double) (beachte implizite Typumwandlungen beim Rechnen!)
Arithmetische Operatoren + Addition - Subtraktion * Multiplikation / Division; für int (etc.) ist die Division ganzzahlig % modulo-rechnung ( Rest bei der Division) Vorrangrelationen: Punkt vor Strich : *,/,% vor +,- Plus/Minus als Vorzeichen vor *,/,% Klammern heben Vorrang auf
Typumwandlungen bei Zahlentypen Implizite Umwandlungen: Regel: niedrigerer Typ wird in höheren Typ umgewandelt Hierarchie: byte short int long float double Beispiel: 3.0 / 5 Explizite Umwandlungen: (<type>) <expression> auch entgegen der Hierarchie Genauigkeitsverlust möglich ggf. Fehler wegen anderem Wertebereich Beispiel: (float) 3 / 5
Anweisungen in Java Zusammenfassung: Zuweisungen und Methodenaufrufe sind Anweisungen Blockanweisungen: {... } bedingte Anweisungen: if... else, switch... case Schleifen: while, do... while, for; innerhalb Schleifen: break, continue Anweisungen zur Ausnahmenbehandlung: try... catch... finally ( Freitag)
Zuweisungen sind Anweisungen Beispiele: i = j = 0 ; e += 3.71 ; i--; --i; i++; ++i; Zuweisungsoperatoren: = Zuweisung +=, -=, *=, /=, %= i+=3 Abkürzung für i=i+3, etc. ++ inkrementieren -- dekrementieren i++, i-- ++i, --i i nach Auswertung erhöhen/erniedrigen i vor Auswertung erhöhen/erniedrigen
Anweisungen zusammenfassen die Blockanweisung Syntax: { <statement> <statement> <statement>...} Beispiel: { int a=2,b=3; { g.drawstring("a = "+a, 50,50); g.drawstring("b = "+b, 50,100); } g.drawstring("a + b = "+(a+b), 50,150); } Beachte: der Strichpunkt trennt nicht Anweisungen, er ist Bestandteil bestimmter Anweisungen! Wozu sind Blockanweisungen sinnvoll? if, for, while,...
Bedingte Anweisungen Syntax: if ( <expression> ) <statement> if ( <expression> ) <statement> else <statement> Beispiele: if ( a!= 0 ) b /= a; if ( x > -1 && x < 1 ) { if ( x < 0 ) erg = 1+x; else erg = 1-x; } else erg = 0;
Boolsche Operatoren Zusammenfassung ==,!= gleich/ungleich <, <= kleiner (oder gleich) >, >= größer (oder gleich) && logisches UND logisches ODER! logisches NICHT (einsteliger Operator) Vorrangrelationen: && vor!= und == vor && und! vor!=, ==, &&, und Klammern heben Vorrangrelationen auf klug einsetzen!
Bedingte Anweisungen Beispiele Bedingungen in bedingten Ausdrücken müssen vom Typ boolean sein! entweder Ausdruck mit boolschen Operatoren: if ( a!= 0 ) b /= a; if ( x >= 0 ) abs = x; else abs = -x; if ( x < -1 x > 1 ) erg = 0; oder Variable vom Typ boolean: boolean c = ( a!= 0); if ( c ) b /= a;
While Anweisung Syntax: while (<expression>) <statement> Beispiele: while (a >= b) a -= b; i = 1; while (a >= 1) { a /= 2; i++; } führe <statement> solange aus bis <expression> falsch ist <statement> wird u.u. nie ausgeführt
Do-While Anweisung Syntax: do <statement> while (<expression>); Beispiel: a = 1.0; do { a *= 2.0; i--; } while(i>0); führe <statement> solange aus bis <expression> falsch ist <statement> wird mindestens einmal ausgeführt!
For Anweisung Syntax: for(<expression>; <expression>; <expression>) <statement> Beispiele: for(i=1;i<=10;i++) a *= 2.0; a = 17; for(int i=1;a>=1;i++) a /= 2.0; 1. Ausdruck: Initialisierung 2. Ausdruck: Fortsetzungsbedingung 3. Ausdruck: Schleifenzähler
For vs. While for(<expression1>; <expression2>; <expression3>) <statement> ist äquivalent zu <expression1>; while(<expression2>) { <statement> <expression3>; } Beachte: ein Ausdruck wird zu einer Anweisung, wenn ein Semicolon folgt umgekehrt ist eine Zuweisung zugleich ein Ausdruck (Zuweisungsoperator!)
For-Schleifen Beispiele Binomialkoeffizienten: koeff = 1; for(i=n;i>=n-k+1;i--) koeff *= i; for(i=1;i<=k;i++) koeff /= i; oder, zusammengefasst: zaehler = nenner = 1; for(i=1;i<=k;i++) { zaehler *= (n+1-i); nenner *= i; } koeff = zaehler/nenner;
Verschachtelte Anweisungen Beispiel: Primzahlen for(i=3;i<1000;i+=2) if ( i%3!=0 && i%5!=0 && i%7!= 0) System.out.println(i+" ist vielleicht Primzahl"); for(i=2;i<1000;i++) { int dividers=0; for (j=2;j<i;j++) if (i%j == 0) { System.out.println(i+" ist Vielfaches von "+j); dividers++; break; }; if (dividers==0) System.out.println(i+" ist Primzahl"); };