Institut für Telematik Universität zu Lübeck 5-2 Überblick Programmieren Kapitel 5: Java (5.1 bis 5.6) 1. Einführung (Warum Java?) 2. Compiler und Laufzeitumgebung, IDEs 3. Das erste eigene Java-Programm 4. Elementare Datentypen und Variablen 5. Elementare Operatoren 6. Kontrollstrukturen Wintersemester 2008/2009 Prof. Dr. Christian Werner 5-3 Warum Java? (1/5) 5-4 Warum Java? (2/5) Es gibt unterschiedliche Programmiersprachenkonzepte : Funktionale Programmiersprachen - Grundprinzip: Termersetzung - Beispiele: Lisp, HOPE, Miranda, SML, Haskell Logikbasierte Programmiersprachen - Grundprinzip: Prädikatenlogik - Beispiel: Prolog Imperative Programmiersprachen - Grundprinzip: Folge von Variablenzuweisungen - Beispiele: Algol, Fortran, Cobol, Pascal, C, Basic Spezialfall v. IP: Objektorientierte Programmierung - Grundprinzip: Interaktionen zwischen Objekten - Beispiele: SmallTalk, Java, C++ Besonderheiten von Java: Sprache i. W. neu entworfen, nur wenige Altlasten d.h. vergleichsweise einfach zu erlernen! Write once, run everywhere (WORE) Technische Realisierung: Programm Programm Compiler Compiler Interpreter Maschinencode Bytecode Maschinencode
5-5 Warum Java? (3/5) 5-6 Warum Java? (4/5) Byte-Code ist Maschinencode für eine virtuelle Maschine, die auf jeder realen Maschine simuliert werden kann. Vorteil: Ist für eine reale Rechnerarchitektur eine VM vorhanden, kann darauf jedes Java-Programm laufen (ohne erneut zu compilieren!) Vorteil: WORE Nachteil: Langsamer als echter Maschinencode Aber: Inzwischen wurden sog. Just-in-Time-Compiler entwickelt, welche den Geschwindigkeitsnachteil in vielen Bereichen kompensieren können! ab 1991: J. Gosling und Kollegen entwickeln auf der Basis von C++ eine Sprache namens Oak (Object Application Kernel). Einsatzbereich: Haushalts- und Konsumelektronik. Ziele: Plattform-Unabhängigkeit, Erweiterbarkeit der Systeme und Austauschbarkeit von Komponenten. 1993: Oak wird wegen rechtlicher Probleme in Java umbenannt. Zu diesem Namen wurden die Entwickler beim Kaffeetrinken inspiriert. 1994: Java entwickelt sich wegen der Applet-Technologie zur Sprache des WWW. seit 1995: Sun bietet sein Java-Programmiersystem JDK (Java Development Kit) mit einem Java-Compiler und Interpreter kostenlos an. 5-7 Warum Java? (5/5) 5-8 Compiler und Laufzeitumgebung (1/2) Typische Einsatzbereich für Java heute: Sog. Applets, das sind kleine Java-Programme, die direkt im Web-Browser laufen. Technik für Web-Server: Servlets, JSPs Mittel zur Implementierung dynamischer Web-Seiten Geschäftsanwendungen Inzwischen sehr mächtig und performant! Direkte Konkurrenz: Microsoft C# Ein Java-Entwickler benötigt zwei wesentliche Komponenten: Byte-Code-Compiler Virtual Maschine (auch genannt: Laufzeitumgebung ) Beides wird von der Firma Sun Microsystems kostenlos angeboten: http://java.sun.com/javase/downloads/ Empfohlener Download: JDK 6 ohne weiteres Zubehör
5-9 Compiler und Laufzeitumgebung (2/2) 5-10 IDEs Das JDK stellt bereit Compiler: javac VM: java Zur Erstellung des Programms (genauer: des Quellcodes), benötigen wir weiterhin einen sog. Text-Editor: Unix: vi, vim, nano, pico, nedit, emacs, Windows: edit, PSPad, UltraEdit, werner@pinot:~> edit MeinProgramm.java werner@pinot:~> javac MeinProgramm.java werner@pinot:~> java MeinProgramm Alternative: Integrated Development Environment (IDE) Integriert Editor, Compiler und VM Viele Zusatzfunktionen: Syntax Highlighting, Debugger, Plug-Ins für Spezialanwendung usw. Aber: Für das Erlernen von Java nicht hilfreich! Entscheiden Sie selbst, ab wann Sie eine IDE einsetzen wollen! Empfehlung: Nutzen sie eine IDE nur bei Projekten mit mehr als drei Klassen 5-11 Ein erstes Java-Programm 5-12 Nächste Schritte Programmname (muss mit Dateinamen übereinstimmen!) public class MeinProgramm { public static void main(string[] args) { System.out.println("42"); Anweisung zum Ausgeben von Text Grundgerüst steht Weitere Fragen, die geklärt werden müssen: Welche Datentypen gibt es in Java? Wie deklariere ich Variablen? Welche Operatoren stellt Java bereit? Wie steuere ich den Programmablauf? (Schleifen, bedingte Anweisungen usw.) Rest: Grundgerüst, welches wir für jedes Java-Programm benötigen!
5-13 (primitive) Datentypen in Java (1/3) Ganze Zahlen: byte: The byte data type is an 8-bit signed two's complement integer. It has a minimum value of -128 and a maximum value of 127 (inclusive). The byte data type can be useful for saving memory in large arrays, where the memory savings actually matters. They can also be used in place of int where their limits help to clarify your code; the fact that a variable's range is limited can serve as a form of documentation. short: The short data type is a 16-bit signed two's complement integer. It has a minimum value of -32,768 and a maximum value of 32,767 (inclusive). As with byte, the same guidelines apply: you can use a short to save memory in large arrays, in situations where the memory savings actually matters. int: The int data type is a 32-bit signed two's complement integer. It has a minimum value of -2,147,483,648 and a maximum value of 2,147,483,647 (inclusive). For integral values, this data type is generally the default choice unless there is a reason (like the above) to choose something else. This data type will most likely be large enough for the numbers your program will use, but if you need a wider range of values, use long instead. long: The long data type is a 64-bit signed two's complement integer. It has a minimum value of -9,223,372,036,854,775,808 and a maximum value of 9,223,372,036,854,775,807 (inclusive). Use this data type when you need a range of values wider than those provided by int. 5-14 (primitive) Datentypen in Java (2/3) Fließkommazahlen: float: The float data type is a single-precision 32-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in section 4.2.3 of the Java Language Specification. As with the recommendations for byte and short, use a float (instead of double) if you need to save memory in large arrays of floating point numbers. This data type should never be used for precise values, such as currency. For that, you will need to use the java.math.bigdecimal class instead. Numbers and Strings covers BigDecimal and other useful classes provided by the Java platform. double: The double data type is a double-precision 64-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in section 4.2.3 of the Java Language Specification. For decimal values, this data type is generally the default choice. As mentioned above, this data type should never be used for precise values, such as currency. 5-15 (primitive) Datentypen in Java (3/3) Sonstiges: boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined. char: The char data type is a single 16-bit Unicode character. It has a minimum value of '\u0000' (or 0) and a maximum value of '\uffff' (or 65,535 inclusive). 5-16 Deklaration von Variablen Eine Variable ist ein Speicherplatz für einen Wert aus einem bestimmten Wertebereich, welcher durch den verwendeten Datentyp festgelegt wird. Eine Variable wird deklariert (d.h. erzeugt): <Typ> <Name>; Beispiele: int myint; short myshort, myshort2; char c1; boolean flag; Usw.
5-17 Spezialfall: Arrays Wir benötigen zehn Integer-Variablen. int i0, i1, i2, i3, i4, i5, i6, i7, i8 i9; Geht das auch einfacher? Ja, mit einem Array: int[] i = new int[10]; Zugriff über: i[0], i[1],, i[9] 5-18 Operatoren (1/7) Was können wir nun mit Variablen und deren Werten anfangen? Werte zuweisen Werte vergleichen Werte Addieren Werte Subtrahieren Usw. Dies alles geschieht über Operatoren! Vollständige Übersicht: http://java.sun.com/docs/books/tutorial/java/nutsandbolt s/operators.html 5-19 Operatoren (2/7) 5-20 Operatoren (3/7) Zuweisungsoperator: = Weist einer Variablen einen Wert zu. int myint; myint = 10; Alternative und kürzere Schreibweise: int myint = 10; Andere Beispiele: byte b = 10; short s = 20; int i = 30; long l = 11111111111; float f = 10.001f; double d = 10.001d; boolean flag = false; flag = true; char c = 'f'; Operatoren für Zahlenvergleiche: == (gleich)!= (ungleich) > (größer) >= (größer oder gleich) < (kleiner) <= (kleiner oder gleich) Geben jeweils einen boolean-wert zurück. int i = 0; int j = 10; System.out.println(i==j); System.out.println(j<10); Ausgabe: false false
5-21 Operatoren (4/7) 5-22 Operatoren (5/7) Operatoren für Bool sche Ausdrücke: && (und-verknüpfung) (oder-verknüpfung)! (Negation) Geben jeweils einen boolean-wert zurück. System.out.println( ((false && true)!(1==2)) ); Ausgabe: true Operatoren für Zahlenarithmetik: + (Addition) - (Subtraktion) * (Multiplikation) / (Division) % (Rest-Operator) Geben jeweils einen Zahlen-Wert zurück. System.out.println(3+9.5); System.out.println(10%8); Ausgabe: 12.5 2 5-23 Operatoren (6/7) 5-24 Operatoren (7/7) Weitere Operatoren für Zahlenarithmetik: ++ (Inkrement) -- (Dekrement) Geben jeweils einen Zahlen-Wert zurück. Jeweils in zwei Varianten verfügbar: i++ (Post-Inkrement) i-- (Post-Dekrement) ++i (Prä-Inkrement) --i (Prä-Dekrement) int i = 3; i++; System.out.println(i); // "4" ++i; System.out.println(i); // "5" System.out.println(++i); // "6" System.out.println(i++); // "6" System.out.println(i); // "7" Explizite Typumwandlung ( Casting ): (Datentyp) Wert Gibt den Wert im angegebenen Datentyp zurück. Wird benötigt, weil die Java-Laufzeitumgebung Datentypen sehr strikt handhabt. Der Programmierer muss explizit angeben, wenn er eine Typkonvertierung wünscht. Falsch: int i = 3.5f * 6; (Compiler-Fehler, denn der Ausdruck auf der rechten Seite ist vom Typ float) Auch falsch (Ergebnis wäre 3*6=18): int i = (int) 3.5f * 6; Richtig: int i = (int)(3.5f * 6);
5-25 Kontrollstrukturen (1/4) 5-26 Kontrollstrukturen (2/4) If-Anweisung (bedingte Ausführung): if (i > 12 ) { System.out.println("i ist größer als 12!"); If-Else-Anweisung: if (i > 12 ) { System.out.println("i ist größer als 12!"); else { System.out.println("i ist kleiner als 12!"); Switch-Anweisung: int month = 8; switch (month) { case 1: System.out.println("January"); break; case 2: System.out.println("February"); break; case 3: System.out.println("March"); break; case 4: System.out.println("April"); break; case 5: System.out.println("May"); break; case 6: System.out.println("June"); break; case 7: System.out.println("July"); break; case 8: System.out.println("August"); break; case 9: System.out.println("September"); break; case 10: System.out.println("October"); break; case 11: System.out.println("November"); break; case 12: System.out.println("December"); break; default: System.out.println("Invalid month."); break; Sollte nach Möglichkeit anstelle von stark verschachtelten If-Else-Anweisungen verwendet werden. Der Code wird dadurch kürzer und besser verständlich! 5-27 Kontrollstrukturen (3/4) 5-28 Kontrollstrukturen (4/4) While-Schleife: Wiederhole, solange der Ausdruck wahr ist: while (i>10) { System.out.println(i); i--; Do-While-Schleife: Wiederhole, solange der Ausdruck wahr ist, mindestens jedoch einmal: do { System.out.println(i); i--; while (i > 10); For-Schleife: Durchläuft einen Wertebereich. Schleifenvariable kann dabei direkt im Kopf der Schleife mit angegeben werden. Das spart Codezeilen! for (int i=0;i<10;i++){ System.out.println(i); Initialisierung Schleifen- Bedingung Inkrement oder Dekrement
5-29 Demo 5-30 Exkurs: Einlesen von Zeichen Wir schreiben ein Java-Programm, das eine Zeichenfolge einliest und diese in umgekehrter Reihenfolge wieder ausgibt! Importiert einen InputStreamReader. Er dient zum Konvertieren eines byte-stroms in einen char-strom IOExceptions können auftreten: Dies sind hier Fehlerfälle beim Lesen eines Zeichens (z.b. Strom nicht lesbar usw.) import java.io.inputstreamreader; public class MeinProgramm throws java.io.ioexception { public static void main(string[] args) { InputStreamReader reader = new InputStreamReader(System.in); char c = (char) reader.read(); Standardeingabe Lesen eines einzelnen Zeichens Initialisierung dieses Readers 5-31 Fertiges Programm 5-32 Gültigkeitsbereich von Variablen (1/2) import java.io.inputstreamreader; public class Inverter { public static void main(string[] args)throws java.io.ioexception { InputStreamReader reader = new InputStreamReader(System.in); char[] puffer = new char[20]; char zeichen; System.out.println("Bitte geben Sie eine Zeichenfolge ein und bestätigen Sie mit <Enter>: "); zeichen = (char)reader.read(); // erstes Zeichen Lesen int index=0; while (zeichen!='\n' && zeichen!='\r' && index<=19) { // weiterlesen bis <Enter> puffer[index]=zeichen; // oder Puffer voll zeichen=(char)reader.read(); index++; System.out.println("Inverse Zeichenfolge:"); for (int i=index-1;i>=0;i--) { System.out.print(puffer[i]); System.out.println(); //Zeilenumbruch Merkregeln Eine Variablen kann grundsätzlich an jeder Position im Code deklariert werden. Gültigkeitsbereich erstreckt sich von der Position der Deklaration bis zum Ende der aktuellen Einrückungsebene.
5-33 Gültigkeitsbereich von Variablen (2/2) 5-34 Zusammenfassung und Ausblick import java.io.inputstreamreader; public class Inverter { public static void main(string[] args) throws java.io.ioexception { InputStreamReader reader = new InputStreamReader(System.in); char[] puffer = new char[20]; char zeichen; System.out.println("Bitte geben Sie eine Zeichenfolge ein und bestätigen Sie mit <Enter>: "); zeichen = (char)reader.read(); // erstes Zeichen Lesen int index=0; while (zeichen!='\n' && zeichen!='\r' && index<=19) { puffer[index]=zeichen; zeichen=(char)reader.read(); index++; System.out.println("Inverse Zeichenfolge:"); for (int i=index-1;i>=0;i--) { System.out.print(puffer[i]); System.out.println(); //Zeilenumbruch reader puffer zeichen index i Sie können bereits alle denkbaren Algorithmen in Java formulieren (vgl. Kapitel 4)! Falls Sie noch einmal genau nachlesen wollen: http://java.sun.com/docs/books/tutorial/java/ Wie strukturiert man aber Java-Programme so, dass die gut lesbar und wenig fehleranfällig sind? Restliche Magie unseres Programm- Grundgerüsts muss noch erklärt werden Nächster Schritt: Objektorientierung