Johann Wolfgang Goethe-Universität Professur für Graphische Datenverarbeitung Fachbereich Informatik und Mathematik Prof. Dr. Detlef Krömker Ashraf Abu Baker Organisatorisches Intensivkurs vom 01.10.07 bis zum 12.10.07 9:00-10:30 Vorlesung 10:30-12:15 Bearbeitung von theoretischen MultipleChoice-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 [email protected] Java-Intensivkurs WS07/08 Folie 1 Organisatorisches Teilnahmeschein (kein Leistungsschein, keine Kreditpunkte) Voraussetzung: Java-Intensivkurs WS07/08 Folie 2 Aktuelle Information http://www.gdv.informatik.uni-frankfurt.de/ 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 WS07/08 Folie 3 Java-Intensivkurs WS07/08 Folie 4 Einleitung Java ist eine Technologie: Plattform Einleitung Java-API: Sammlung aus Java-Programmen, die in Pakete (packages) aufgeteilt sind Pakete: Bibliotheken aus Klassen und Interfaces 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 WS07/08 Folie 5 Einführung JVM: Java-Intensivkurs WS07/08 Folie 6 Einführung Plattformunabhängig? Plattformunabhängige Softwareumgebung, die Java-Bytecode in Maschinensprache übersetzt, interpretiert und ausführt Kann als Bytecode Interpretier- und Ausführungsumgebung verstanden werden Da Java-Programme von der JVM und nicht direkt von Bytecode: Datei mit der Erweiterung „.class“ Entsteht, wenn ein Java-Compiler ein Java-Programm kompiliert und übersetzt der Hardware ausgeführt werden, sind sie plattformunabhängig. Das einzige Codeformat, das die JVM verstehen kann Java-Intensivkurs WS07/08 Folie 7 Java-Intensivkurs WS07/08 Folie 8 Entwicklungsgeschichte Java ist 12 Jahre alt Entwicklung von Java-Programmen Vorbereitung: 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 Development Kit (JDK) Java-Intensivkurs WS07/08 Folie 9 Entwicklung von Java-Programmen Ein Java-Programm Höchstens einer 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 WS07/08 Folie 11 Entwicklungsumgebung Eclipse Java-Intensivkurs WS07/08 Folie 10 Programmbeispiel Enthält ein Java-Programm eine top-levelKlassendefinition z.B. namens MyJavaProgram, so muss seine Quelldatei MyJavaProgram.java heißen /** * A java program containing 1 public- and 2 non public class * definitions. */ public class HelloWorld {// public class definition} class MyFirstClass {// non public class definition} class MySecondClass {// non public class definition} Java-Intensivkurs WS07/08 Folie 12 Bestandteile eines Java-Programms Pakete Imports & Klassen package mypackage;// package declaration Ein Programm kann drei sog. top-levelKompiliereinheiten 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 WS07/08 Folie 13 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 WS07/08 Folie 15 import javax.swing.JButton; // import statement import javax.swing.JPanel;// import statement /* * A top-level class definition */ public class MyClass{ //class body (Klassenrupf) } // interface definition interface MyInterface{} Java-Intensivkurs WS07/08 Folie 14 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 WS07/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 WebAnwendungen gestartet werden Ein Javafähiger Browser ist ein Browser, für den die JVM als Plug-In installiert ist Java-Intensivkurs WS07/08 Folie 17 Applikationen 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 WS07/08 Folie 18 Applikationen Warum muss jede Applikation eine main-Methode enthalten? 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 Was passiert, wenn eine Applikation gestartet werden soll? Das Parameterarray enthält ggf. die Eingabeparameter, die an das Programm übergeben werden sollen Die Applikation repräsentiert durch ihre Klasse, wird in die JVM geladen Enthält die Klasse keine solche Methode, so wird eine Fehlermeldung ausgegeben Die JVM durchsucht dann die Klasse nach der main-Methode Java-Intensivkurs WS07/08 Folie 19 Java-Intensivkurs WS07/08 Folie 20 Bezeichner (Identifier) Java-Bezeichner: Bezeichner Dürfen keine Java-Schlüsselwörter sein Werden zur Benennung von Variablen, Methoden, Klassen, Interfaces, Paketen... verwendet Beliebig lange Folge aus Buchstaben, Ziffern und den UnicodeZeichen $ und _ Müssen mit einem Buchstaben, einem $-Zeichen oder einem Unterstrich „_“ beginnen int minValue;//legal int int int int $;//legal _3;//legal 3a;//illegal min-Value;//illegal int $minValue;//legal int int int int int _minValue;//legal $_;//legal int _;//legal a3;//legal !maxValue;//illegal int -maxValue;//illegal min!Value;//illegal int _int;//legal Java-Intensivkurs WS07/08 Folie 21 Variablen Variable: Symbol für einen Speicherbereich Speichert Daten eines bestimmten Datentyps 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 final finally float if implements import instanceof int interface long native private protected public return short static strictfp super this throw throws transient try void volatile while int _int;//legal Java-Intensivkurs WS07/08 Folie 22 Datentypen Primitive Datentypen (primative data types) Referenzdatentypen (reference data types) Java ist eine stark typisierte Programmiersprache Jede Variable und jeder Ausdruck muss zur Kompilierzeit an einen bestimmten Datentypen gebunden sein Java-Intensivkurs WS07/08 Folie 23 int newVariable;//legal int ifConstant;//legal int If;//legal int New;//legal int Private;//legal int $boolean;//legal Java-Intensivkurs WS07/08 Folie 24 Primitive Datentypen Char 8 Datentypen char: Boolean - Logischer Datentyp - 1 Byte lang - false oder true boolean true false char 16-Bit-Unicode-Zeichen (0x0000 … 0xffff) byte –27 bis 27–1 short –215 bis 215–1 int –231 bis 231–1 long –263 bis 263–1 float 1,4E-45f … 3,4E+38f double 4,9E-324 … 1,7E+308 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 aPlusb=a+b; char c=99; int aPlusbplusC=aPlusb+c; System.out.println("a+b="+aPlusb+",a+b+c="+aPlusbplusC); Ausgabe: Java-Intensivkurs WS07/08 Folie 25 Java-Intensivkurs WS07/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 „0x“ z.B. 0x119 int _281_as_decimal=281; int _281_as_oktal=0431; int _281_as_hexadecimal=0x119; System.out.println(_281_as_decimal+" "+_281_as_oktal+" "+_281_as_hexadecimal); Ausgabe: 281 281 281 Java-Intensivkurs WS07/08 Folie 27 a+b=195, a+b+c=294 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.142857142857143 Java-Intensivkurs WS07/08 Folie 28 Fließkommatypen Float-Zahlen müssen mit dem Suffix „f“ bzw. groß „F“ enden - Beispiel: 2.4f oder 2.4F Double-Zahlen können mit dem Suffix „d“ bzw. groß „D“ enden - Beispiel: 2.4d oder 2.4D Eine suffixlose Kommazahl wird vom Compiler automatisch als Double-Zahl interpretiert 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 - 2.4 ist eine Double-Zahl Um eine Fließkommazahl von einer Ganzzahl unterscheiden zu können, muss mindestens der Dezimalpunkt, der Exponent oder der Suffix vorhanden sein - Beispiele: 1., .1, 2E4, 2e4, 2f, 5D Java-Intensivkurs WS07/08 Folie 29 boolean Boolean FALASE, TRUE char Character MIN_VALUE, MAX_VALUE, SIZE byte Byte MIN_VALUE, MAX_VALUE, SIZE, NaN short Short MIN_VALUE, MAX_VALUE, SIZE, NaN int Integer MIN_VALUE, MAX_VALUE, SIZE, NaN long Long MIN_VALUE, MAX_VALUE, SIZE, NaN float Float MAX_EXPONENT,MIN_EXPONENT, MIN_VALUE, MAX_VALUE, SIZE , NaN double Double MIN_EXPONENT,MIN_VALUE, MAX_VALUE, SIZE,MAX_EXPONENT, NaN Java-Intensivkurs WS07/08 Folie 30 Arithmetik- & Fließkommaprobleme Typkonvertierung & Casting Arithmetische Operationen können ungültige Werte produzieren bzw. Rundungsfehler verursachen Jede Variable in Java ist an einen Typ gebunden 1.30308 Fehlerart 10 * *310≠ 3 49 * 49 ≠ 1.0 Beispiel Ergebnis Overflow Infinity Rundungsfehler true Rundungsfehler 0.0/0.0 NaN Rundungsfehler 1.0/0.0 Infinity Rundungsfehler true Java erlaubt den Datentyp einer Variable in einen anderen Datentyp zu konvertieren Zwei Arten von Typkonvertierungen: Implizite (automatische ) Typkonvertierung - Explizite Typumwandlung (casting) - Java-Intensivkurs WS07/08 Folie 31 Wird vom Compiler automatisch durchgeführt Kann bzw. muss vom Programmierer durchgeführt werden Java-Intensivkurs WS07/08 Folie 32 Typkonvertierung & Casting /* * Package: default * Class: Samples * Method: typeConversion() */ //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 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.0f="+5/2.0f+" 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.0f=2.5 Das Ergebnis ist vom Type float! 117 Java-Intensivkurs WS07/08 Folie 33 Java-Intensivkurs WS07/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 Typkonvertierung & Casting //Method: Samples.typeConversion() 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 WS07/08 Folie 35 Java-Intensivkurs WS07/08 Folie 36 Erweiternde Typkonvertierungen Erweiternde Typkonvertierungen: Einschränkende Typkonvertierungen Einschränkende Typkonvertierungen (erfordern Casting): byte zu short, int, long, float, oder double short zu byte oder char short zu int, long, float, oder double char zu byte oder short char zu int, long, float, oder double int zu byte, short, oder char int zu long, float, oder double long zu byte, short, char, oder int long zu float oder double float zu byte, short, char, int, oder long float zu double double zu byte, short, char, int, long, oder float Java-Intensivkurs WS07/08 Folie 37 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 IntegerVariable einem Integer-Objekt oder umgekehrt zuzuweisen: Integer x=2; int y=new Integer(3); Java-Intensivkurs WS07/08 Folie 39 Java-Intensivkurs WS07/08 Folie 38 Autoboxing Unter Boxing versteht man die automatische Umwandlung eines primitiven Wertes in ein WrapperKlassenobjekt Unboxing ist die Umkehrung von Boxing, sprich die automatische Umwandlung eines WrapperKlassenobjektes in einen primitiven Wert //boxing/unboxing Boolean b=false;//boxing float f=new Float(3.4.f);//unboxing Java-Intensivkurs WS07/08 Folie 40 Autoboxing Arrays Da die Umwandlung automatisch vom Compiler erfolgt, spricht man von Autoboxing Geordnete Folge von Elementen des gleichen Datentyps Primitive Datentypen und ihre korrespondierenden Wrapper-Klassen sind zuweisungskompatibel Felder können enthalten: Vor Version 5 hätte man die Umwandlung manuelle durchführen müssen //Vor Version 5 manuelle Umwandlung Boolean b=new Boolean(false); Float f1=new Float(3.4.f); float f=f1.floatValue(); Java-Intensivkurs WS07/08 Folie 41 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 Elemente eines primitiven Datentyps Referenzen auf andere Arrays bzw. auf Objekte Definition eines Arrays erfolgt in 3 Schritten: Deklaration Konstruktion Initialisierung Java-Intensivkurs WS07/08 Folie 42 Array-Konstruktion Bei der Konstruktion eines Arrays wird ein Arrayobjekt mit dem new-Operator instanziiert und die Länge des Arrays festgelegt: list1= new int[10]; // Arraykonstruktion int [] list1; // Arraydeklaration int list2 [];//Arraydeklaration float [][] twoDimArray; // array of arrays of float float []twoDimArray2[]; // array of arrays of float int [] list3, list4 ; //Deklaration mehrerer Arrays int [] list7, list8, list9[], list10[] ; // Deklaration mehrerer Arrays. list9 und list10 sind zweidimensionale Arrays Java-Intensivkurs WS07/08 Folie 43 Java-Intensivkurs WS07/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 WS07/08 Folie 45 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 Initialisierung /* * Package: * Class: * Method: */ //Explizite default Samples2.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 [][] _3X2Matrix={{1.0f,2.1f},{.5f,2.1f},{3.1f,.72f}}; Java-Intensivkurs WS07/08 Folie 46 Irreguläre Arrays int [][] irregularArray =new int[][]{{3,1},{-1},{5,2,0}}; irregularArray[0] // entspricht {3,1} (erste Zeile) irregularArray[1] // entspricht {-1} (zweite Zeile) irregularArray[1][0] // entspricht -1 (erstes Element in der zweiten Zeile) irregularArray[2] // entspricht {5,2,0} (dritte Zeile) In Java ist es nämlich erlaubt irreguläre mehrdimensionale zu definieren: Arrays, deren Zeilen unterschiedliche Längen aufweisen Java-Intensivkurs WS07/08 Folie 47 Java-Intensivkurs WS07/08 Folie 48 Zugriff auf Arrays Kontrollstrukturen 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. ArrayIndexOutOfBoundsException if-else-Anweisung Der Fragezeichenoperator: (boolean_condition) ? expression1: expression2; public static void wrongIndex(){ int [][] intArray =new int[3][3]; intArray=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(intArray[i][j]+" "); int x=(y>0)?7:8;// wenn y>0 dann x=7 sonst x=8 } Ausgabe: 3 1 3 -1 0 1 5 2 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at Samples.wrongIndex(HelloWorldApp.java:218) at SamplesApplication.main(HelloWorldApp.java:19) Java-Intensivkurs WS07/08 Folie 49 Java-Intensivkurs WS07/08 Folie 50 If-else-Anweisung public static void nullStellen(){ Asöldfk /* * Für eine quadratische Funktion f(X)=aX^²+bX+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)=2X^²+3X+1 float a=2f, b=3f, c=1; float p=b/a; float q=c/a; 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 x0=-p/2; System.out.println("Die Funktion f(X)="+a+"X^²+"+b+"X+"+c+" hat nur eine Nullstelle: X0="+x0); } else { float x0=-p/2+(float)Math.sqrt(d); float x1=-p/2-(float)Math.sqrt(d); System.out.println("Die Funktion f(X)="+a+"X^²+"+b+"X+"+c+" hat zwei Nullstellen: X0="+x0+" und X1="+x1); } } Java-Intensivkurs WS07/08 Folie 51 Java-Intensivkurs WS07/08 Folie 52 Switch Switch Eine if-else-Abfrage kann schnell unübersichtlich werden, wenn viele Alternativen berücksichtigt werden müssen Eine kompaktere Anweisungsform bietet das switchKonstrukt 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; switch(testvaribale){ case C1: statement_1; case C2: statement_2; …. case Cn: statement_n; default: default_statement; } 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 WS07/08 Folie 53 Schleifen while(boolean_condition) repeated_statement_or_block public static void whileBinary(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); } whileBinary(123 ); Ausgabe: Die Binärdarstellung von 123 ist 1111011 Java-Intensivkurs WS07/08 Folie 55 Java-Intensivkurs WS07/08 Folie 54 while Beispiele für endlose while-Schleifen public static void endlessWhileLoop() { 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 WS07/08 Folie 56 do-while do repeated_statement_or_block while (boolean_condition); public static void doWhileSumOfDigits(int number) { //Berechnung der Quersumme einer positiven Zahl: int sumOfDigits = 0; do { sumOfDigits += number % 10;// sumOfDigits=sumOfDigits+number%10 number /= 10;// number=number/10 } while (number != 0) System.out.println(sumOfDigits);// 25 } doWhileSumOfDigits(283746); Ausgabe: 30 Java-Intensivkurs WS07/08 Folie 57 for-Schleife public static void strangeForLoop() { // strange loop for(System.out.println("Ich werde ein 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 ein 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 WS07/08 Folie 59 for-Schleife for(statement; boolean_condition;expression) statement_block public static void fibbonacci(int n) { int fib1 = 0, fib2 = 1; int fib = fib1 + fib2; for (int i = 3; i <= n; i++) { fib1 = fib2; fib2 = fib; fib = fib1 + fib2; } System.out.println(fib); } Samples.fibbonacci(11); Ausgabe: 89 Java-Intensivkurs WS07/08 Folie 58 for-each-Schleife Erst seit Version 5 Sie bietet eine komfortable Möglichkeit über Arrays und Kollektionen (Collections) zu iterieren: public static void forEachLoop() { 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 WS07/08 Folie 60 break und continue In vielen Fällen ist das Beenden eines Schleifendurchlaufes bzw. das Verlassen eines Schleifenrumpfes erforderlich continue und break 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 WS07/08 Folie 61 break public static void breakSample(){ /* Erstelle eine zufällig generierte * Liste aus Ganzzahlen */ int [] numbers= getRandomIntegerList();//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 WS07/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 WS07/08 Folie 63 continue Beispiel Berechne die Wurzel jeder positiven Zahl in einer Liste L und überspringe dabei die negativen Zahlen public static void continueSample(){ int [] numbers= getRandomIntegerList(); /* 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 WS07/08 Folie 64 OOP Attribute einer Klasse (attributes) 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 public class Bankkonto {//Klassendeklaration //Beginn des Klassenrumpfes //Attribute legen den Zustand eines Objektes fest public int kontoNummer; //Felddeklaration public float kontoStand;//in € // Felddeklaration public String inhaber; //Felddeklaration 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 //Ende des Klassenrumpfes } Beispiel: Klasse Mensch Java-Intensivkurs WS07/08 Folie 65 Methoden einer Klasse (methods) Java-Intensivkurs WS07/08 Folie 66 Methoden und Konstruktoren (constructors) Methoden haben public class Bankkonto {//Klassendeklaration public void einzahlen(float betrag){ kontoStand+=betrag; } public void abheben(float betrag){ kontoStand-=betrag; } public float getKontoStand(){ return kontoStand; } } Java-Intensivkurs WS07/08 Folie 67 Signatur (Methodenkopf): - Zugriffsmodifikator (public, private, protected) Rückgabetyp (void, int, ..) Namen Parameterliste Methodenrumpf public void einzahlen(float betrag) //Methodenkopf (Signatur) { //Methodenrumpf } Java-Intensivkurs WS07/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(){ kontoNummer=0; inhaber="Unbekannt"; kontoStand=0.f; } Java-Intensivkurs WS07/08 Folie 69 Default-Konstruktor Default-Konstruktor: Heißt genau so wie seine Klasse Hat keine Parameter und enthält keine Anweisungen //Der Defaultkonstruktor public KlassenName(){ } Konstruktoren Ein Konstruktor wird immer dann aufgerufen, wenn ein Objekt mit dem new-Operator instanziiert wird: Bankkonto alexKonto=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 WS07/08 Folie 70 Überladen von Methoden (overloading) Zwei Parameterlisten sind unterschiedlich Sie haben unterschiedliche Anzahl an Parametern aMethod(float dx, float dy) //2 Parameter aMethod()//keine Parameter aMethod(float dx) //1 Parameter Wenn sie dieselbe Anzahl an Parametern haben, jedoch unterschiedliche Reihenfolge der Parametertypen aMethod(float dx, int dy) aMethod(int dx, float dy) aMethod(float dx, float dy) aMethod(int dx, int dy) Java-Intensivkurs WS07/08 Folie 71 Java-Intensivkurs WS07/08 Folie 72 Überladen von Methoden Die Bezeichnung der Parameter spielt in beiden Fällen keine Rolle Demnach sind die folgenden Parameterlisten absolut identisch: aMethod(float deltaX, int deltaY) Ü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 aMethod(float dx, int dy) Die beiden Methoden müssen unterschiedliche Parameterlisten haben Java-Intensivkurs WS07/08 Folie 73 Überladen von Methoden Alle folgenden Methoden stellen Überladungen der Methode translate dar: public public public public public public public void void void void void 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 WS07/08 Folie 74 Überladen von Methoden Keine Überladung: public void translate(float distance) public void translate(float abstand) Auch keine Überladung: public void translate(int deltX, float deltaY) public void translate(int dx, float dy) public float translate(int dx, float dy) Bemerkung: Konstruktoren können auch überladen werden Java-Intensivkurs WS07/08 Folie 75 Java-Intensivkurs WS07/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 WS07/08 Folie 77 Vererbung Girokonto Erbt alle Attribute und Methoden von Bankkonto Fügt eigene Attribute und Methoden hinzu: - Kreditrahmen und dauerAuftragEinrichten() Was kann eine Klasse alles von ihrer Vaterklasse erben? Nur die nicht privaten Attribute und Methoden Konstruktoren werden nicht vererbt Java-Intensivkurs WS07/08 Folie 79 Vererbung Girokonto als Unterklasse der Klasse Bankkonto: class Girokonto extends Bankkonto{ float dispositionsLimit; public void dauerAuftragEinrichten(){ /* * Code für die Einrichtung eines * Dauerauftrags */ } } Java-Intensivkurs WS07/08 Folie 78 Ü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 WS07/08 Folie 80 Überschreibung von Methoden Die Parameterliste der überschreibenden Methode muss mit der Parameterliste der überschriebenen Methode bis auf die Parameternamen identisch sein Überschreibung von Methoden public class Point { public float x1; public float y1; //Verschiebung public void translate(float dx, float dy){ this.x1+=dx; this.y1+=dy; } //Gleichmäßige Verschiebung public void translate(float distance){ x1+=distance; y1+=distance; } } Java-Intensivkurs WS07/08 Folie 81 Java-Intensivkurs WS07/08 Folie 82 Überschreibung von Methoden Überschreibung von Methoden class Line extends Point{ //Line ist die Unterklasse der Oberklasse Point float x2; float y2; /* *Ü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); x2+=dx; y2+=dy; } } Java-Intensivkurs WS07/08 Folie 83 class Line extends Point{ float x2; float y2; // Überschreibung der Methode translate(float distance) @Override public void translate(float distance){ //Überschreiben ohne Wiederverwendung //des Codes der Oberklasse x1+=distance; y1+=distance; x2+=distance; y2+=distance; } } Java-Intensivkurs WS07/08 Folie 84 Polymorphismus (polymorphism) Polymorphismus (polymorphism) Unter Polymorphismus versteht man die Fähigkeit einer Objektreferenz, Objekte seiner Unterklasse zu referenzieren und sich abhängig davon zu verhalten Wird einer Oberklassenobjektreferenz R ein Objekt O einer Unterklassen U zugewiesen, so verhält O dementsprechend wie alle anderen Objekte von U 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 der Unterklasse? Java-Intensivkurs WS07/08 Folie 85 Java-Intensivkurs WS07/08 Folie 86 Polymorphismus /* * Package: default * Class: Polymorphism.java * Method: */ class Polygon { Polymorphismus class Rectangle extends Polygon{//Unterklasse /** * Ein Rechteck */ public float width; public float height; //Oberklasse /* * Gibt den Flächeninhalt des Polygons zurück. */ public void getSurface(){ System.out.println("The surface of this polygon is undefined."); } } Java-Intensivkurs WS07/08 Folie 87 public Rectangle(float width, float height){ this.width=width; this.height=height; } public void getSurface(){ System.out.println("The surface of this rectangle is: "+this.width*height); } } Java-Intensivkurs WS07/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 getSurface(){ System.out.println("The surface of this triangle is: "+.5f*base*height); } } Java-Intensivkurs WS07/08 Folie 89 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 Polygon();//Kompilierfehler Rectangle rectangle=new Triangle();//Kompilierfehler Java-Intensivkurs WS07/08 Folie 91 Polymorphismus //polygon ist eine Oberklassenobjektreferenz Polygon polygon=new Polygon(); polygon.getSurface(); polygon =new Rectangle(2,3); polygon.getSurface(); polygon =new Triangle(3,2); polygon.getSurface(); 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 WS07/08 Folie 90 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 WS07/08 Folie 92 Referenzen in Java public class Student { public public public public } String name;//Referenzvariable (Objektreferenz) Date gebDatum;// Referenzvariable (Objektreferenz) String studiengang;// Referenzvariable (Objektreferenz) int semesteranzahl; //primitive Variable Java-Intensivkurs WS07/08 Folie 93