Johann Wolfgang GoetheUniversitt Professur fr Graphische Datenverarbeitung Fachbereich
Johann Wolfgang Goethe-Universität Professur für Graphische Datenverarbeitung Fachbereich Informatik und Mathematik Prof. Dr. Detlef Krömker Ashraf Abu Baker baker@gdv. cs. uni-frankfurt. de Java-Intensivkurs WS 07/08 Folie 1
Organisatorisches Intensivkurs vom 01. 10. 07 bis zum 12. 10. 07 – 9: 00 -10: 30 Vorlesung – 10: 30 -12: 15 Bearbeitung von theoretischen Multiple. Choice-Aufgaben – 12: 15 -13: 00 Tutorium (Lösung der MC-Aufgaben) – 13: 00 -14: 00 Pause – 14: 00 -18: 00 Programmierung an den RBI-Rechnern Java-Intensivkurs WS 07/08 Folie 2
Organisatorisches Teilnahmeschein (kein Leistungsschein, keine Kreditpunkte) Voraussetzung: Erfolgreiche und regelmäßige Teilnahme Mindestens 50% der Übungspunkte Bei 7 der Übungsblätter müssen für den theoretischen und praktischen Teil jeweils mindestens 20% der Mindestpunktzahl erreicht werden Programmieraufgaben zählen doppelt so viel wie MC-Aufgaben Java-Intensivkurs WS 07/08 Folie 3
Aktuelle Information http: //www. gdv. informatik. uni-frankfurt. de/ Java-Intensivkurs WS 07/08 Folie 4
Einleitung Java ist eine Technologie: Plattform Programmiersprache Plattform (im Allgemeinen): Hardware- oder Softwareumgebung Betriebssystem + Hardware Java ist nur eine Software-Plattform API (Java Application Programming Interface) JVM (Java Virtual Machine) Java-Intensivkurs WS 07/08 Folie 5
Einleitung Java-API: Sammlung aus Java-Programmen, die in Pakete (packages) aufgeteilt sind Pakete: Bibliotheken aus Klassen und Interfaces Java-Intensivkurs WS 07/08 Folie 6
Einführung JVM: Plattformunabhängige Softwareumgebung, die Java-Bytecode in Maschinensprache übersetzt, interpretiert und ausführt Kann als Bytecode Interpretier- und Ausführungsumgebung verstanden werden Bytecode: Datei mit der Erweiterung „. class“ Entsteht, wenn ein Java-Compiler ein Java-Programm kompiliert und übersetzt Das einzige Codeformat, das die JVM verstehen kann Java-Intensivkurs WS 07/08 Folie 7
Einführung Plattformunabhängig? Da Java-Programme von der JVM und nicht direkt von der Hardware ausgeführt werden, sind sie plattformunabhängig. Java-Intensivkurs WS 07/08 Folie 8
Entwicklungsgeschichte Java ist 12 Jahre alt Jahr Version Pakete Klassen Neue Features 1996 1. 0 7 210 Applets, AWT, I/O, Net 1997 1. 1 22 ca. 600 RMI, JDBC, … 1998 1. 2 59 1524 Swing, Collections, … 2000 1. 3 76 1840 CORBA ORB, Sound, Servlets… 2002 1. 4 135 2723 XML Processing, JNI, … 2004 1. 5 165 3279 Generics, Enhanced for Loop, Autoboxing, Enums, Annotations… 2006 1. 6 202 3777 Scripting, Compiler Access, Desktop Deployment… Java-Intensivkurs WS 07/08 Folie 9
Entwicklung von Java-Programmen Vorbereitung: Java Development Kit (JDK) Entwicklungsumgebung Eclipse Java-Intensivkurs WS 07/08 Folie 10
Entwicklung von Java-Programmen Java-Programm Höchstens eine public-Klassendefinition (public top level class definition) Eine unbeschränkte Anzahl von nicht public-Klassendefinitionen (non public top level class definitions) Java-Quelldateien Unicode-Dateien, die mit der Erweiterung „. java“ gespeichert werden Java-Intensivkurs WS 07/08 Folie 11
Programmbeispiel Enthält ein Java-Programm eine top-level. Klassendefinition z. B. namens My. Java. Program, so muss seine Quelldatei My. Java. Program. java heißen /** * A java program containing 1 public- and 2 non public class * definitions. */ public class Hello. World {// public class definition} class My. First. Class {// non public class definition} class My. Second. Class {// non public class definition} Java-Intensivkurs WS 07/08 Folie 12
Bestandteile eines Java-Programms Ein Programm kann drei sog. top-level. Kompiliereinheiten beinhalten Paket-Deklaration (package declaration) Import-Anweisungen (import statements) Klassen- oder Interface-Definitionen (class/interface definitions) Alle genannten Kompiliereinheiten sind optional Wenn sie jedoch in einer Java-Quelledatei vorkommen, dann müssen sie in der obigen Reihenfolge erscheinen Java-Intensivkurs WS 07/08 Folie 13
Pakete Imports & Klassen package mypackage; // package declaration import javax. swing. JButton; // import statement import javax. swing. JPanel; // import statement /* * A top-level class definition */ public class My. Class{ //class body (Klassenrupf) } // interface definition interface My. Interface{} Java-Intensivkurs WS 07/08 Folie 14
Pakete & Imports Pakete: Dienen der logischen Gruppierung und Organisation von Klassen und Interfaces Entsprechen Programmierbibliotheken in anderen Programmiersprachen Import-Anweisungen: Dienen der Verfügbarkeitsmachung von Klassen aus anderen Paketen Java-Intensivkurs WS 07/08 Folie 15
Kommentare Drei Arten von Kommentaren: // line comment Zeilenkommentare: Ein Zeilenkommentar ist genau eine Zeile lang Blockkommentare: Können sich über mehrere Zeilen strecken Dokumentationskommentare: - Werden vom Javadoc-Tool verwendet - Für die automatische Generierung von Klassen- und Interface-Dokumentationen - Beginnen mit “/**“ und enden mit “*/“ Java-Intensivkurs WS 07/08 Folie 16 /* * block comment */ /** * java-doc comment */
Applikationen und Applets Zwei Arten von Java-Programmen: Applikationen und Applets Eine Applikation ist ein Java-Programm, das als eigenständige Anwendung (stand alone application) von einer auf einem Rechner installierten JVM, ausgeführt werden kann Applets sind Java-Programme, die in HTML-Seiten eingebettet werden und von einem Javafähigen Web-Browser als Web. Anwendungen gestartet werden Ein Javafähiger Browser ist ein Browser, für den die JVM als Plug-In installiert ist Java-Intensivkurs WS 07/08 Folie 17
Applikationen Es ist die Aufgabe des Programmierers festzulegen, ob sein Programm als Applikation, als Applet oder auch als beides funktionieren soll Ein Programm, das als eigenständige Applikation ausgeführt werden soll, muss eine sog. main-Methode enthalten //Signatur der main-Methode Dient als Startpunkt der Applikation public static void main(String[] input){ } //bzw. (seit JDK 5) public static void main(String. . . input) {} Java-Intensivkurs WS 07/08 Folie 18
Applikationen Warum muss jede Applikation eine main-Methode enthalten? Was passiert, wenn eine Applikation gestartet werden soll? Die Applikation repräsentiert durch ihre Klasse, wird in die JVM geladen Die JVM durchsucht dann die Klasse nach der main-Methode Java-Intensivkurs WS 07/08 Folie 19
Applikationen Wird die main-Methode gefunden, übergibt ihr die JVM ein Parameterarray und fängt anschließend mit der sequenziellen Ausführung der in ihr enthaltenen Anweisungen an Das Parameterarray enthält ggf. die Eingabeparameter, die an das Programm übergeben werden sollen Enthält die Klasse keine solche Methode, so wird eine Fehlermeldung ausgegeben Java-Intensivkurs WS 07/08 Folie 20
Bezeichner (Identifier) Java-Bezeichner: Werden zur Benennung von Variablen, Methoden, Klassen, Interfaces, Paketen. . . verwendet Beliebig lange Folge aus Buchstaben, Ziffern und den Unicode. Zeichen $ und _ Müssen mit einem Buchstaben, einem $-Zeichen oder einem Unterstrich „_“ beginnen int min. Value; //legal int $; //legal int _3; //legal int 3 a; //illegal int min-Value; //illegal int $min. Value; //legal int _min. Value; //legal int $_; //legal int a 3; //legal int !max. Value; //illegal int -max. Value; //illegal int min!Value; //illegal int _int; //legal Java-Intensivkurs WS 07/08 Folie 21
Bezeichner Dürfen keine Java-Schlüsselwörter sein Sind case-sensitive abstract assert continue default for goto new package switch synchronized boolean break byte case catch char class const do double else enum extends finally float if implements import instanceof interface long native private protected public return short static strictfp super this throws transient try void volatile while int int Java-Intensivkurs WS 07/08 Folie 22 _int; //legal int new. Variable; //legal if. Constant; //legal int If; //legal New; //legal int Private; //legal $boolean; //legal
Variablen Variable: Symbol für einen Speicherbereich Speichert Daten eines bestimmten Datentyps Java ist eine stark typisierte Programmiersprache Jede Variable und jeder Ausdruck muss zur Kompilierzeit an einen bestimmten Datentypen gebunden sein Java-Intensivkurs WS 07/08 Folie 23
Datentypen Primitive Datentypen (primative data types) Referenzdatentypen (reference data types) Java-Intensivkurs WS 07/08 Folie 24
Primitive Datentypen 8 Datentypen Datentyp - Logischer Datentyp - 1 Byte lang - false oder true Java-Intensivkurs WS 07/08 Folie 25 Wertebereich 1 true , false char 2 16 -Bit-Unicode-Zeichen (0 x 0000 … 0 xffff) byte 1 – 27 bis 27– 1 short 2 – 215 bis 215– 1 int 4 – 231 bis 231– 1 long 8 – 263 bis 263– 1 float 4 1, 4 E-45 f … 3, 4 E+38 f double 8 4, 9 E-324 … 1, 7 E+308 boolean Boolean Länge (Bytes)
Char char: Unicode-Zeichen bzw. Ganzzahlen aus dem Intervall [0, 216 -1] char ist der einzige numerische Datentyp, der nicht vorzeichenbehaftet ist Mit char-Variablen können ganzzahlige Berechnungen durchgeführt werden char a='a'; //entspricht der Zahl 97 char b='b'; //entspricht der Zahl 98 int a. Plusb=a+b; char c=99; int a. Plusbplus. C=a. Plusb+c; System. out. println("a+b="+a. Plusb+", a+b+c="+a. Plusbplus. C); Ausgabe: a+b=195, a+b+c=294 Java-Intensivkurs WS 07/08 Folie 26
Ganzzahlentypen byte, short, int, long Numerische vorzeichenbehaftete Integraltypen Stellen Ganzzahlen dar Können in 3 Formaten dargestellt werden - Dezimalformat : z. B. 281 - Oktalzahlen (Zahlen zur Basis 8 ): beginnen mit „ 0“ z. B. 0431 - Hexadezimal (Zahlen zur Basis 16 ): beginnen mit „ 0 x“ z. B. 0 x 119 int _281_as_decimal=281; int _281_as_oktal=0431; int _281_as_hexadecimal=0 x 119; System. out. println(_281_as_decimal+" "+_281_as_oktal+" "+_281_as_hexadecimal); Ausgabe: 281 281 Java-Intensivkurs WS 07/08 Folie 27
Fließkommatypen float, double numerische vorzeichenbehaftet Fleißkommatypen Stellen Fließkommazahlen dar Double-Zahlen sind doppelt so lang und doppelt so genau wie Float-Zahlen float _22_divided_by_7_as_float=22/7. f; double _22_divided_by_7_as_double =22/7. d; System. out. println("_22_divided_by_7_as_float: "+_22_divided_by_7_as_float); System. out. println("_22_divided_by_7_as_double: "+ _22_divided_by_7_as_double); Ausgabe: _22_divided_by_7_as_float: 3. 142857 _22_divided_by_7_as_double: 3. 142857143 Java-Intensivkurs WS 07/08 Folie 28
Fließkommatypen Float-Zahlen müssen mit dem Suffix „f“ bzw. groß „F“ enden - Beispiel: 2. 4 f oder 2. 4 F Double-Zahlen können mit dem Suffix „d“ bzw. groß „D“ enden - Beispiel: 2. 4 d oder 2. 4 D Eine suffixlose Kommazahl wird vom Compiler automatisch als Double-Zahl interpretiert - 2. 4 ist eine Double-Zahl Um eine Fließkommazahl von einer Ganzzahl unterscheiden zu können, muss mindestens der Dezimalpunkt, der Exponent oder Suffix vorhanden sein - Beispiele: 1. , . 1, 2 E 4, 2 e 4, 2 f, 5 D Java-Intensivkurs WS 07/08 Folie 29
Wrapper-Klassen Zu jedem primitiven Datentypen in Java gibt es eine korrespondierende Wrapper-Klasse Kapselt die Variable in einer objektorientierten Hülle Wrapper-Klassen verfügen über Zahlreiche Methoden Wrapper-Klasse Konstanten und Kostanten Typ boolean Boolean FALASE, TRUE char Character MIN_VALUE, MAX_VALUE, SIZE byte Byte MIN_VALUE, MAX_VALUE, SIZE, Na. N short Short MIN_VALUE, MAX_VALUE, SIZE, Na. N int Integer MIN_VALUE, MAX_VALUE, SIZE, Na. N long Long MIN_VALUE, MAX_VALUE, SIZE, Na. N float Float MAX_EXPONENT, MIN_VALUE, MAX_VALUE, SIZE , Na. N double Double MIN_EXPONENT, MIN_VALUE, MAX_VALUE, SIZE, MAX_EXPONENT, Na. N Java-Intensivkurs WS 07/08 Folie 30
Arithmetik- & Fließkommaprobleme Arithmetische Operationen können ungültige Werte produzieren bzw. Rundungsfehler verursachen Fehlerart Beispiel Ergebnis Overflow Infinity Rundungsfehler true Rundungsfehler 0. 0/0. 0 Na. N Rundungsfehler 1. 0/0. 0 Infinity Rundungsfehler Java-Intensivkurs WS 07/08 Folie 31 true
Typkonvertierung & Casting Jede Variable in Java ist an einen Typ gebunden Java erlaubt den Datentyp einer Variable in einen anderen Datentyp zu konvertieren Zwei Arten von Typkonvertierungen: Implizite (automatische ) Typkonvertierung - Wird vom Compiler automatisch durchgeführt Explizite Typumwandlung (casting) - Kann bzw. muss vom Programmierer durchgeführt werden Java-Intensivkurs WS 07/08 Folie 32
Typkonvertierung & Casting /* * Package: default * Class: Samples * Method: type. Conversion() */ //Beispiele für implizite Typkonvertierungen System. out. println(710); //implizite Typumwandlung von //integer in String System. out. println(3. 5); //implizite Typumwandlung von //double in String int k=5/2; //ganzzahlige Division. k hat den Wert 2 System. out. println("5/2="+k); Ausgabe: 710 3. 5 5/2=2 Java-Intensivkurs WS 07/08 Folie 33
Typkonvertierung & Casting //Beispiele für implizite Typkonvertierungen System. out. println("5/2. 0="+5/2. 0+" Das Ergebnis ist vom Type double!"); System. out. println("5/2. 0 f="+5/2. 0 f+" Das Ergebnis ist vom Type float!"); int x='u'; //implizite Typumwandlung von char zu integer System. out. println(x); //liefert 117 zurück Ausgabe: 5/2. 0=2. 5 Das Ergebnis ist vom Type double! 5/2. 0 f=2. 5 Das Ergebnis ist vom Type float! 117 Java-Intensivkurs WS 07/08 Folie 34
Typkonvertierung & Casting Ob explizit oder implizit hängt vom Zieltyp ab Jede Typkonvertierung entgegen der Pfeilrichtung muss explizit durchgeführt werden - Explizite Typkonvertierung wird als Casting bezeichnet - Einschränkende Typkonvertierungen Konvertierungen in Pfeilrichtung werden automatisch durchgeführt - Erweiternde Typkonvertierungen Java-Intensivkurs WS 07/08 Folie 35
Typkonvertierung & Casting //Method: Samples. type. Conversion() int i=32; short s=4; char c='g'; double d=i; //erweiternde Typumwandlung float ff=(float)d; //einschränkende Typumwandlung byte b=(byte)c; //einschränkende c=(char)s; //einschränkende c=(char)b; //einschränkende Java-Intensivkurs WS 07/08 Folie 36
Erweiternde Typkonvertierungen: byte zu short, int, long, float, oder double short zu int, long, float, oder double char zu int, long, float, oder double int zu long, float, oder double long zu float oder double float zu double Java-Intensivkurs WS 07/08 Folie 37
Einschränkende Typkonvertierungen (erfordern Casting): short zu byte oder char zu byte oder short int zu byte, short, oder char long zu byte, short, char, oder int float zu byte, short, char, int, oder long double zu byte, short, char, int, long, oder float Java-Intensivkurs WS 07/08 Folie 38
Autoboxing (boxing/unboxing) Autoboxing gibt es erst seit Version 5 Vor Version 5 waren die primitiven Datentypen und ihre korrespondierenden Wrapper-Klassen nicht zuweisungskompatible So war es z. B. nicht möglich eine primitive Integer. Variable einem Integer-Objekt oder umgekehrt zuzuweisen: Integer x=2; int y=new Integer(3); Java-Intensivkurs WS 07/08 Folie 39
Autoboxing Unter Boxing versteht man die automatische Umwandlung eines primitiven Wertes in ein Wrapper. Klassenobjekt Unboxing ist die Umkehrung von Boxing, sprich die automatische Umwandlung eines Wrapper. Klassenobjektes in einen primitiven Wert //boxing/unboxing Boolean b=false; //boxing float f=new Float(3. 4. f); //unboxing Java-Intensivkurs WS 07/08 Folie 40
Autoboxing Da die Umwandlung automatisch vom Compiler erfolgt, spricht man von Autoboxing Primitive Datentypen und ihre korrespondierenden Wrapper-Klassen sind zuweisungskompatibel Vor Version 5 hätte man die Umwandlung manuelle durchführen müssen //Vor Version 5 manuelle Umwandlung Boolean b=new Boolean(false); Float f 1=new Float(3. 4. f); float f=f 1. float. Value(); Java-Intensivkurs WS 07/08 Folie 41
Arrays Geordnete Folge von Elementen des gleichen Datentyps Felder können enthalten: Elemente eines primitiven Datentyps Referenzen auf andere Arrays bzw. auf Objekte Definition eines Arrays erfolgt in 3 Schritten: Deklaration Konstruktion Initialisierung Java-Intensivkurs WS 07/08 Folie 42
Array-Deklaration Die Deklaration teilt dem Compiler den Namen des Arrays und den Typ seiner Elemente mit Bei Deklarationen ist es erlaubt den Arraynamen vor, nach oder zwischen den eckigen Klammerpaaren zu positionieren int [] list 1; // Arraydeklaration int list 2 []; //Arraydeklaration float [][] two. Dim. Array; // array of arrays of float []two. Dim. Array 2[]; // array of arrays of float int [] list 3, list 4 ; //Deklaration mehrerer Arrays int [] list 7, list 8, list 9[], list 10[] ; // Deklaration mehrerer Arrays. list 9 und list 10 sind zweidimensionale Arrays Java-Intensivkurs WS 07/08 Folie 43
Array-Konstruktion Bei der Konstruktion eines Arrays wird ein Arrayobjekt mit dem new-Operator instanziiert und die Länge des Arrays festgelegt: list 1= new int[10]; // Arraykonstruktion Java-Intensivkurs WS 07/08 Folie 44
Intialisierung Immer, wenn ein Array definiert wird, werden seine Felder automatisch mit den Standardwerten ihres Datentyps initialisiert Standardwerte: - 0 für numerische Datentypen - false für boolean - null für Referenztypen Will man während der Definition das Array mit anderen Werten initialisieren, so muss die Deklaration, Konstruktion und Initialisierung zu einem einzelnen Schritt kombiniert werden: Java-Intensivkurs WS 07/08 Folie 45
Initialisierung /* * Package: * Class: * Method: */ //Explizite default Samples 2. java arrays() Array-Intialisierung int[]factorial = { 1, 1, 2, 6, 24, 120, 720, 5040 }; char ac[] = { 'n', 'o', 't', 'a', 'S', 't', 'r', 'i', 'n', 'g' }; float [][] _3 X 2 Matrix={{1. 0 f, 2. 1 f}, {. 5 f, 2. 1 f}, {3. 1 f, . 72 f}}; Java-Intensivkurs WS 07/08 Folie 46
Irreguläre Arrays Ein zweidimensionales Array: Array, dessen Felder Referenzen auf andere eindimensionale Arrays enthalten Es ist irreführend sich derartigen Arrays als eine Matrix vorzustellen In Java ist es nämlich erlaubt irreguläre mehrdimensionale zu definieren: Arrays, deren Zeilen unterschiedliche Längen aufweisen Java-Intensivkurs WS 07/08 Folie 47
Irreguläre Arrays int [][] irregular. Array =new int[][]{{3, 1}, {-1}, {5, 2, 0}}; irregular. Array[0] // entspricht {3, 1} (erste Zeile) irregular. Array[1] // entspricht {-1} (zweite Zeile) irregular. Array[1][0] // entspricht -1 (erstes Element in der zweiten Zeile) irregular. Array[2] // entspricht {5, 2, 0} (dritte Zeile) Java-Intensivkurs WS 07/08 Folie 48
Zugriff auf Arrays Jedes Arrayelement hat einen numerischen Index Nummerierung fängt mit 0 an Der Versuch auf ein Element mit einem falschen Index zuzugreifen wirft eine sog. Array. Index. Out. Of. Bounds. Exception public static void wrong. Index(){ int [][] int. Array =new int[3][3]; int. Array=new int[][]{{3, 1, 3}, {-1, 0, 1}, {5, 2}}; for(int i=0; i<3; i++) for (int j=0; j<3; j++) System. out. print(int. Array[i][j]+" "); } Ausgabe: 3 1 3 -1 0 1 5 2 Exception in thread "main" java. lang. Array. Index. Out. Of. Bounds. Exception: 2 at Samples. wrong. Index(Hello. World. App. java: 218) at Samples. Application. main(Hello. World. App. java: 19) Java-Intensivkurs WS 07/08 Folie 49
Kontrollstrukturen if-else-Anweisung Der Fragezeichenoperator: (boolean_condition) ? expression 1: expression 2; int x=(y>0)? 7: 8; // wenn y>0 dann x=7 sonst x=8 Java-Intensivkurs WS 07/08 Folie 50
If-else-Anweisung public static void null. Stellen(){ Asöldfk /* * Für eine quadratische Funktion f(X)=a. X^²+b. X+c mit a!=0 * ist Xi eine Nullstelle falls gilt: f(Xi)=0 * Die Nullstellen einer quadratischen Funktion lassen * sich mithilfe der pq-Formel wie folgt leicht * ermitteln: */ //f(X)=2 X^²+3 X+1 float a=2 f, b=3 f, c=1; float p=b/a; float q=c/a; Java-Intensivkurs WS 07/08 Folie 51
If-else-Anweisung float d=(float)Math. pow(p/2, 2)-q; //d=(p/2)^²-q; if(d<0) System. out. println("Die Funktion f(X)="+a+"X^²+"+b+"X+"+c+" hat keine Nullstellen!"); else if(d==0){ float x 0=-p/2; System. out. println("Die Funktion f(X)="+a+"X^²+"+b+"X+"+c+" hat nur eine Nullstelle: X 0="+x 0); } else { float x 0=-p/2+(float)Math. sqrt(d); float x 1=-p/2 -(float)Math. sqrt(d); System. out. println("Die Funktion f(X)="+a+"X^²+"+b+"X+"+c+" hat zwei Nullstellen: X 0="+x 0+" und X 1="+x 1); } } Java-Intensivkurs WS 07/08 Folie 52
Switch Eine if-else-Abfrage kann schnell unübersichtlich werden, wenn viele Alternativen berücksichtigt werden müssen Eine kompaktere Anweisungsform bietet das switch. Konstrukt switch(testvaribale){ case C 1: statement_1; case C 2: statement_2; …. case Cn: statement_n; default: default_statement; } Java-Intensivkurs WS 07/08 Folie 53
Switch Die Testvariable muss zuweisungskompatibel mit int sein Testvariable ist vom Typ byte, char, short, oder int Die sog. case-Labels (OPEN_FILE, DELETE_FILE, …) müssen Konstanten sein final int OPEN_FILE=0; final int DELETE_FILE=1; final int SAVE_FILE=2; switch(command){//command wird Testvariable genannt case OPEN_FILE: System. out. println("opening file. . . "); break; case DELETE_FILE: System. out. println("deleting file. . . "); break; case SAVE_FILE: System. out. println("saving file. . . "); break; default: System. out. println("invalid command !!!!!"); } Java-Intensivkurs WS 07/08 Folie 54
Schleifen while(boolean_condition) repeated_statement_or_block public static void while. Binary(int number) { String binary=""; int number=123 ; int div=number ; int rest; while(div>0 ){ rest=div%2; div=div/2; binary=rest+binary; } } System. out. println("Die Binärdarstellung von "+number+" ist "+binary); } while. Binary(123 ); Ausgabe: Die Binärdarstellung von 123 ist 1111011 Java-Intensivkurs WS 07/08 Folie 55
while Beispiele für endlose while-Schleifen public static void endless. While. Loop() { byte b=0; while(b<3); b++; //this statement will never execute byte y=0; while(true) System. out. println((++y)); //overflow after 128 iterations byte x=1; byte y=10; while(Math. min(x, y)<5); // endless loop: ++x; } Java-Intensivkurs WS 07/08 Folie 56
do-while do repeated_statement_or_block while (boolean_condition); public static void do. While. Sum. Of. Digits(int number) { //Berechnung der Quersumme einer positiven Zahl: int sum. Of. Digits = 0; do { sum. Of. Digits += number % 10; // sum. Of. Digits=sum. Of. Digits+number%10 number /= 10; // number=number/10 } while (number != 0) System. out. println(sum. Of. Digits); // 25 } do. While. Sum. Of. Digits(283746); Ausgabe: 30 Java-Intensivkurs WS 07/08 Folie 57
for-Schleife for(statement; boolean_condition; expression) statement_block public static void fibbonacci(int n) { int fib 1 = 0, fib 2 = 1; int fib = fib 1 + fib 2; for (int i = 3; i <= n; i++) { fib 1 = fib 2; fib 2 = fib; fib = fib 1 + fib 2; } System. out. println(fib); } Samples. fibbonacci(11); Ausgabe: 89 Java-Intensivkurs WS 07/08 Folie 58
for-Schleife public static void strange. For. Loop() { // strange loop for(System. out. println("Ich werde einziges Mal zu Beginn ausgeführt!"); i<5; System. out. println("Ich werde am Ende eines Schleifendurchlaufs ausgeführt! ")) { System. out. println("Ich werde zum "+(i++)+". Mal ausgeführt!"); } } //Die beiden Schleifen sind äquivalent for(System. out. println("Ich werde einziges Mal zu Beginn ausgeführt!"); i<5; ) { System. out. println("Ich werde zum "+(i++)+". Mal ausgeführt!"); System. out. println("Ich werde am Ende eines Schleifendurchlaufs ausgeführt! ") } Java-Intensivkurs WS 07/08 Folie 59
for-each-Schleife Erst seit Version 5 Sie bietet eine komfortable Möglichkeit über Arrays und Kollektionen (Collections) zu iterieren: public static void for. Each. Loop() { double [] trigonometry=new double[]{Math. PI, Math. sin(Math. PI/2), Math. cos(Math. PI/2)}; for (double d : trigonometry) System. out. println(d); //for each element d in the trigonometry array } //äquivalent zu: for(int i=0; i<trigonometry. length; i++) System. out. println(trigonometry[i]); Java-Intensivkurs WS 07/08 Folie 60
break und continue In vielen Fällen ist das Beenden eines Schleifendurchlaufes bzw. das Verlassen eines Schleifenrumpfes erforderlich continue und break: Abarbeitung der Schleife sofort beendet Schleife wird verlassen Unabhängig davon ob das Abbruchkriterium erfüllt ist oder nicht Anwendungsbeispiel: Textsuche-Programm Java-Intensivkurs WS 07/08 Folie 61
break public static void break. Sample(){ /* Erstelle eine zufällig generierte * Liste aus Ganzzahlen */ int [] numbers= get. Random. Integer. List(); //Siehe 6. 4 break und continue /* Ermittle die Summe aller Zahlen, die vor der ersten * negativen Zahl in der Liste vorkommen. * Implementierung mit einer for-each-Schleife */ int sum=0; for (int number : numbers) { if(number<0) break; sum+=number; } System. out. println("Die Summe beträgt: "+sum); } Java-Intensivkurs WS 07/08 Folie 62
continue break: Schleife wird verlassen continue: aktuelle Schleifendurchlauf wird unterbrochen Nach der Ausführung von continue wird die Schleifenbedingung erneut ausgewertet und ggf. wird mit dem nächsten Schleifendurchlauf fortgefahren. Java-Intensivkurs WS 07/08 Folie 63
continue Beispiel Berechne die Wurzel jeder positiven Zahl in einer Liste L und überspringe dabei die negativen Zahlen public static void continue. Sample(){ int [] numbers= get. Random. Integer. List(); /* Berechne die Wurzel jeder positiven Zahl in der Liste und * überspringe dabei die negativen Zahlen * Implementierung mit einer for-each-Schleife */ for (int number : numbers) { if(number<0){ System. out. println(number+" hat keine Wurzel!"); continue; } double sqrt=Math. sqrt(number); System. out. println("Wurzel von "+number+"= "+sqrt); }} Java-Intensivkurs WS 07/08 Folie 64
OOP Klasse: Abstrakter Datentyp, der die Eigenschaften, das Verhalten & die Struktur einer Menge gleichartiger Objekte der realen Welt definiert Eigenschaften werden Attribute genannt Das Verhalten legen sog. Methoden fest Objekt =Instanz= konkrete Ausprägung einer Klasse Objekte haben einen Zustand, Verhalten und Identität Der Zustand eines Objektes ist durch die Belegung seiner Attribute definiert Objekte haben Verhalten (führen Aktionen durch) Objekte haben Namen Beispiel: Klasse Mensch Java-Intensivkurs WS 07/08 Folie 65
Attribute einer Klasse (attributes) public class Bankkonto {//Klassendeklaration //Beginn des Klassenrumpfes //Attribute legen den Zustand eines Objektes fest public int konto. Nummer; //Felddeklaration public float konto. Stand; //in € // Felddeklaration public String inhaber; //Felddeklaration //Ende des Klassenrumpfes } Java-Intensivkurs WS 07/08 Folie 66
Methoden einer Klasse (methods) public class Bankkonto {//Klassendeklaration public void einzahlen(float betrag){ konto. Stand+=betrag; } public void abheben(float betrag){ konto. Stand-=betrag; } public float get. Konto. Stand(){ return konto. Stand; } } Java-Intensivkurs WS 07/08 Folie 67
Methoden und Konstruktoren (constructors) Methoden haben Signatur (Methodenkopf): - Zugriffsmodifikator (public, private, protected) Rückgabetyp (void, int, . . ) Namen Parameterliste Methodenrumpf public void einzahlen(float betrag) //Methodenkopf (Signatur) { //Methodenrumpf } Java-Intensivkurs WS 07/08 Folie 68
Konstruktoren Spezielle Methoden Haben keinen Rückgabetyp Heißen genau so wie ihre zugehörigen Klassen Werden in der Regel verwendet, um die Attribute eines Objektes mit Anfangswerten zu initialisieren //Konstruktor public Bankkonto(){ konto. Nummer=0; inhaber="Unbekannt"; konto. Stand=0. f; } Java-Intensivkurs WS 07/08 Folie 69
Konstruktoren Ein Konstruktor wird immer dann aufgerufen, wenn ein Objekt mit dem new-Operator instanziiert wird: Bankkonto alex. Konto=new Bankkonto(); //Objekt (Instanz) Eine Klasse muss keine Konstruktoren definieren In diesem Fall fügt der Compiler den parameterlosen Default-Konstruktor in die Klasse ein Java-Intensivkurs WS 07/08 Folie 70
Default-Konstruktor: Heißt genau so wie seine Klasse Hat keine Parameter und enthält keine Anweisungen //Der Defaultkonstruktor public Klassen. Name(){ } Java-Intensivkurs WS 07/08 Folie 71
Überladen von Methoden (overloading) Zwei Parameterlisten sind unterschiedlich Sie haben unterschiedliche Anzahl an Parametern a. Method(float dx, float dy) //2 Parameter a. Method()//keine Parameter a. Method(float dx) //1 Parameter Wenn sie dieselbe Anzahl an Parametern haben, jedoch unterschiedliche Reihenfolge der Parametertypen a. Method(float dx, int dy) a. Method(int dx, float dy) a. Method(float dx, float dy) a. Method(int dx, int dy) Java-Intensivkurs WS 07/08 Folie 72
Überladen von Methoden Die Bezeichnung der Parameter spielt in beiden Fällen keine Rolle Demnach sind die folgenden Parameterlisten absolut identisch: a. Method(float delta. X, int delta. Y) a. Method(float dx, int dy) Java-Intensivkurs WS 07/08 Folie 73
Überladen von Methoden Eine Methode ist durch ihren Namen und die exakte Folge ihrer Eingabeparametertypen eindeutig bestimmt Die Wiederverwendung desselben Methodennamens mit einer anderen Parameterliste und evtl. einem anderen Rückgabetyp wird als Überladung bezeichnet Die beiden Methoden müssen unterschiedliche Parameterlisten haben Java-Intensivkurs WS 07/08 Folie 74
Überladen von Methoden Alle folgenden Methoden stellen Überladungen der Methode translate dar: public public void void translate(float dx, float dy) translate(int dx, int dy) translate(float dx, int dy) translate(int dx, float dy) translate(int dxy) translate(float dxy) translate() Java-Intensivkurs WS 07/08 Folie 75
Überladen von Methoden Keine Überladung: public void translate(float distance) public void translate(float abstand) Auch keine Überladung: public void translate(int delt. X, float delta. Y) public void translate(int dx, float dy) public float translate(int dx, float dy) Bemerkung: Konstruktoren können auch überladen werden Java-Intensivkurs WS 07/08 Folie 76
Vererbung (inheritance) Ein wesentliches Konzept in der OOP ist die Vererbung Bietet die Möglichkeit die nicht privaten Attribute und Methoden einer existierenden Klasse A auf eine neue Klasse B zu übertragen B erbt die Attribute und Methoden der Klasse A A ist eine Oberklasse von B B ist eine Unterklasse von A Das Konzept unterstützt die Wiederverwendung von bereits existierendem Code Java-Intensivkurs WS 07/08 Folie 77
Vererbung Girokonto als Unterklasse der Klasse Bankkonto: class Girokonto extends Bankkonto{ float dispositions. Limit; public void dauer. Auftrag. Einrichten(){ /* * Code für die Einrichtung eines * Dauerauftrags */ } } Java-Intensivkurs WS 07/08 Folie 78
Vererbung Girokonto Erbt alle Attribute und Methoden von Bankkonto Fügt eigene Attribute und Methoden hinzu: - Kreditrahmen und dauer. Auftrag. Einrichten() Was kann eine Klasse alles von ihrer Vaterklasse erben? Nur die nicht privaten Attribute und Methoden Konstruktoren werden nicht vererbt Java-Intensivkurs WS 07/08 Folie 79
Überschreibung von Methoden (overriding) Aus der Oberklasse geerbten Methoden dürfen in der Unterklasse neu definiert werden Wird eine von einer Oberklasse geerbten Methode in der Unterklasse neu definiert ohne ihren Namen und Parameterliste zu verändern, so spricht man von einer Überschreibung der Methode Die überschreibende Methode ersetzt ihre überschriebene Methode in der Unterklasse komplett Java-Intensivkurs WS 07/08 Folie 80
Überschreibung von Methoden Die Parameterliste der überschreibenden Methode muss mit der Parameterliste der überschriebenen Methode bis auf die Parameternamen identisch sein Java-Intensivkurs WS 07/08 Folie 81
Überschreibung von Methoden public class Point { public float x 1; public float y 1; //Verschiebung public void translate(float dx, float dy){ this. x 1+=dx; this. y 1+=dy; } //Gleichmäßige Verschiebung public void translate(float distance){ x 1+=distance; y 1+=distance; } } Java-Intensivkurs WS 07/08 Folie 82
Überschreibung von Methoden class Line extends Point{ //Line ist die Unterklasse der Oberklasse Point float x 2; float y 2; /* *Überschreibung der Methode translate(float dx, float dy) *der Oberklasse */ @Override public void translate(float dx, float dy){ //Wiederverwendung des Codes der Oberklasse super. translate(dx, dy); x 2+=dx; y 2+=dy; } } Java-Intensivkurs WS 07/08 Folie 83
Überschreibung von Methoden class Line extends Point{ float x 2; float y 2; // Überschreibung der Methode translate(float distance) @Override public void translate(float distance){ //Überschreiben ohne Wiederverwendung //des Codes der Oberklasse x 1+=distance; y 1+=distance; x 2+=distance; y 2+=distance; } } Java-Intensivkurs WS 07/08 Folie 84
Polymorphismus (polymorphism) Unter Polymorphismus versteht man die Fähigkeit einer Objektreferenz, Objekte seiner Unterklasse zu referenzieren und sich abhängig davon zu verhalten In Java ist es nämlich erlaubt einer Oberklasssenobjektreferenz ein Unterklassenobjekt O zuzuweisen Verhält sich O in diesem Fall wie ein Objekt der Oberoder Unterklasse? Java-Intensivkurs WS 07/08 Folie 85
Polymorphismus (polymorphism) Wird einer Oberklassenobjektreferenz R ein Objekt O einer Unterklassen U zugewiesen, so verhält O dementsprechend wie alle anderen Objekte von U Java-Intensivkurs WS 07/08 Folie 86
Polymorphismus /* * Package: default * Class: Polymorphism. java * Method: */ class Polygon { //Oberklasse /* * Gibt den Flächeninhalt des Polygons zurück. */ public void get. Surface(){ System. out. println("The surface of this polygon is undefined. "); } } Java-Intensivkurs WS 07/08 Folie 87
Polymorphismus class Rectangle extends Polygon{//Unterklasse /** * Ein Rechteck */ public float width; public float height; public Rectangle(float width, float height){ this. width=width; this. height=height; } public void get. Surface(){ System. out. println("The surface of this rectangle is: "+this. width*height); } } Java-Intensivkurs WS 07/08 Folie 88
Polymorphismus class Triangle extends Polygon{ float base; float height; public Triangle(float base, float height){ this. base=base; this. height=height; } public void get. Surface(){ System. out. println("The surface of this triangle is: "+. 5 f*base*height); } } Java-Intensivkurs WS 07/08 Folie 89
Polymorphismus //polygon ist eine Oberklassenobjektreferenz Polygon polygon=new Polygon(); polygon. get. Surface(); polygon =new Rectangle(2, 3); polygon. get. Surface(); polygon =new Triangle(3, 2); polygon. get. Surface(); Ausgabe: The surface of this polygon is undefined. The surface of this rectangle is: 6. 0 The surface of this triangle is: 3. 0 Java-Intensivkurs WS 07/08 Folie 90
Polymorphismus Umgekehrt ist in Java und vielen anderen Programmiersprachen nicht erlaubt einer Referenz einer Unterklasse ein Objekt seiner Oberklasse zuzuweisen Triangle triangle=new Polygon(); //Kompilierfehler Rectangle rectangle=new Triangle(); //Kompilierfehler Java-Intensivkurs WS 07/08 Folie 91
Referenzen in Java Zwei Kategorien von Datentypen: Primitive Datentypen Referenztypen (Arrays, Klassen und Interfaces) Es gibt einen wesentlichen Unterschied zwischen einer primitiven Variablen und einer Referenzvariablen Java-Intensivkurs WS 07/08 Folie 92
Referenzen in Java public class Student { public } String name; //Referenzvariable (Objektreferenz) Date geb. Datum; // Referenzvariable (Objektreferenz) String studiengang; // Referenzvariable (Objektreferenz) int semesteranzahl; //primitive Variable Java-Intensivkurs WS 07/08 Folie 93
- Slides: 93