Praktische Softwaretechnologie Vorlesung 2 Martin Giese Johann Radon Institute for Computational and Applied Mathematics Österr. Akademie der Wissenschaften Linz PSWT 2006 – p.1/34 Bücher • James Gosling, Bill Joy, Guy Steele The JavaTM Language Specification PSWT 2006 – p.2/34 Bücher • James Gosling, Bill Joy, Guy Steele, Gilad Bracha The JavaTM Language Specification (2nd/3rd edition) (online) PSWT 2006 – p.2/34 Bücher • James Gosling, Bill Joy, Guy Steele, Gilad Bracha The JavaTM Language Specification (2nd/3rd edition) (online) • Ken Arnold, James Gosling, David Holmes The JavaTM Programming Language PSWT 2006 – p.2/34 Bücher • James Gosling, Bill Joy, Guy Steele, Gilad Bracha The JavaTM Language Specification (2nd/3rd edition) (online) • Ken Arnold, James Gosling, David Holmes The JavaTM Programming Language • S. Zakhour, S. Hommel, et al The JavaTM Tutorial (online) PSWT 2006 – p.2/34 Bücher • James Gosling, Bill Joy, Guy Steele, Gilad Bracha The JavaTM Language Specification (2nd/3rd edition) (online) • Ken Arnold, James Gosling, David Holmes The JavaTM Programming Language • S. Zakhour, S. Hommel, et al The JavaTM Tutorial (online) • Xiaoping Jia Object-Oriented Software Development Using Java – Principles. . . PSWT 2006 – p.2/34 Bücher • James Gosling, Bill Joy, Guy Steele, Gilad Bracha The JavaTM Language Specification (2nd/3rd edition) (online) • Ken Arnold, James Gosling, David Holmes The JavaTM Programming Language • S. Zakhour, S. Hommel, et al The JavaTM Tutorial (online) • Xiaoping Jia Object-Oriented Software Development Using Java – Principles. . . • Bruce Eckel Thinking in Java (3rd edition online) PSWT 2006 – p.2/34 Geschichte von Java • Als „Oak“ von James Gosling (erste Version von Emacs) 1991 begonnen • Erste öffentliche Version 1995 • Bis Ende 1995: Integration in Netscape (auch JavaScript) • Sprachdefinition 1996 von Gosling, Bill Joy (BSD Unix, csh, vi, Teile von TCP/IP,. . . ), Guy Steele (Common LISP Buch, Scheme,. . . ) PSWT 2006 – p.3/34 Geschichte von Java • Als „Oak“ von James Gosling (erste Version von Emacs) 1991 begonnen • Erste öffentliche Version 1995 • Bis Ende 1995: Integration in Netscape (auch JavaScript) • Sprachdefinition 1996 von Gosling, Bill Joy (BSD Unix, csh, vi, Teile von TCP/IP,. . . ), Guy Steele (Common LISP Buch, Scheme,. . . ) Zum Vergleich: • Anfänge des World Wide Web 1990–1991 • Netscape: 1994 • Internet Explorer: 1995 PSWT 2006 – p.3/34 Übersetzung von C Programmen int main(int argc, char* argv[]) { printf("Hello World\n"); } hello.c C Compiler Ausfuehrbares Programm hello.exe PSWT 2006 – p.4/34 Übersetzung von Java Programmen class HelloWorld { public static void main(String args[]) { System.out.println("Hello World"); } } HelloWorld.java Java Compiler (javac) Byte-Code Datei Byte-Code Interpreter (java) HelloWorld.class PSWT 2006 – p.5/34 Konsequenzen von Byte-Code • .class Dateien Plattform-unabhängig ➠ auf verschiedenen Systemen lauffähig ➠ Compiler Plattform-unabhängig PSWT 2006 – p.6/34 Konsequenzen von Byte-Code • .class Dateien Plattform-unabhängig ➠ auf verschiedenen Systemen lauffähig ➠ Compiler Plattform-unabhängig • Code sehr kompakt ➠ gut für Übertragung über Netzwerk PSWT 2006 – p.6/34 Konsequenzen von Byte-Code • .class Dateien Plattform-unabhängig ➠ auf verschiedenen Systemen lauffähig ➠ Compiler Plattform-unabhängig • Code sehr kompakt ➠ gut für Übertragung über Netzwerk • Interpreter kann Zugriffsrechte überprüfen ➠ Vertrauen in fremden Code nicht nötig PSWT 2006 – p.6/34 Konsequenzen von Byte-Code • .class Dateien Plattform-unabhängig ➠ auf verschiedenen Systemen lauffähig ➠ Compiler Plattform-unabhängig • Code sehr kompakt ➠ gut für Übertragung über Netzwerk • Interpreter kann Zugriffsrechte überprüfen ➠ Vertrauen in fremden Code nicht nötig • Reflektion leichter PSWT 2006 – p.6/34 Konsequenzen von Byte-Code • .class Dateien Plattform-unabhängig ➠ auf verschiedenen Systemen lauffähig ➠ Compiler Plattform-unabhängig • Code sehr kompakt ➠ gut für Übertragung über Netzwerk • Interpreter kann Zugriffsrechte überprüfen ➠ Vertrauen in fremden Code nicht nötig • Reflektion leichter • Nicht so schnell wie Maschinensprache PSWT 2006 – p.6/34 Konsequenzen von Byte-Code • .class Dateien Plattform-unabhängig ➠ auf verschiedenen Systemen lauffähig ➠ Compiler Plattform-unabhängig • Code sehr kompakt ➠ gut für Übertragung über Netzwerk • Interpreter kann Zugriffsrechte überprüfen ➠ Vertrauen in fremden Code nicht nötig • Reflektion leichter • Nicht so schnell wie Maschinensprache Mit JIT aber fast! PSWT 2006 – p.6/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Das class Schlüsselwort. Java Programme bestehen aus Klassen- und Interface-Definitionen PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Der Klassenname. Groß geschrieben, bei mehreren Wörtern: durchGroßbuchstabenTrennen („camel case“). PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Geschweifte Klammern wie in C. Dazwischen Deklaration von allen Attributen und Methoden. PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Das public Schlüsselwort. Diese Methode kann von jeder anderen Klasse aus aufgerufen werden. PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Das static Schlüsselwort. Diese statische Methode wird von von allen Instanzen der Klasse geteilt. PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Der leere Typ void. Diese Methode hat keinen Rückgabewert. PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Der Methodenname. Methodennamen fangen mit kleinen Buchstaben an, weiter in camel case. Methoden mit Namen main können als Hauptprogramm aufgerufen werden: java HelloWorld ➠ Aufruf von HelloWorld.main(. . . ) PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Die Klasse String für Unicode Zeichenketten ist in den Standardbibliotheken enthalten. Der Typ String[] bezeichnet arrays von Strings. PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Der Name des Arguments. Argumente, Attribute, Variablen auch mit Kleinbuchstaben und camel case. Argumente des Hauptprogramms werden aus der Kommandozeile genommen. PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Die System Klasse enthält Methoden um auf die Laufzeit-Umgebung zuzugreifen: I/O, Environment, etc. PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } out ist ein statisches Attribut der Klasse System. System.out hat den Typ java.io.PrintStream und ist die Standard Textausgabe. PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } println ist eine Methode der Klasse PrintStream. Sie schreibt einen String in den Stream, gefolgt von einem Zeilenumbruch. PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Ein String Literal. PSWT 2006 – p.7/34 Beispiel: HelloWorld class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Statements werden mit Semikolon beendet. PSWT 2006 – p.7/34 HelloWorld Diagramm HelloWorld +main(args:String[]) System +in: InputStream +out: PrintStream +err: PrintStream PrintStream +println(s:String) ...() +...() Standard Ausgabe PSWT 2006 – p.8/34 Datentypen 2 Arten von Datentypen: • primitive Typen: int, char, float, etc. wie entsprechende Typen in C PSWT 2006 – p.9/34 Datentypen 2 Arten von Datentypen: • primitive Typen: int, char, float, etc. wie entsprechende Typen in C • Referenztypen: Referenzen auf Objekte, ungefähr wie Zeiger auf struct in C PSWT 2006 – p.9/34 Datentypen 2 Arten von Datentypen: • primitive Typen: int, char, float, etc. wie entsprechende Typen in C • Referenztypen: Referenzen auf Objekte, ungefähr wie Zeiger auf struct in C Arrays, Strings, u.a. werden von der Sprache direkt unterstützt, sind aber letztlich Objekttypen. PSWT 2006 – p.9/34 Primitive Typen • byte: −27 . . . + 27 − 1 • short: −215 . . . + 215 − 1 • int: −231 . . . + 231 − 1 • long: −263 . . . + 263 − 1 • float: 32-bit IEEE 754 Fließkommazahl • double: 64-bit IEEE 754 Fließkommazahl • boolean: true oder false • char: ein 16-bit Unicode Zeichen PSWT 2006 – p.10/34 Primitive Typen • byte: −27 . . . + 27 − 1 • short: −215 . . . + 215 − 1 • int: −231 . . . + 231 − 1 • long: −263 . . . + 263 − 1 • float: 32-bit IEEE 754 Fließkommazahl • double: 64-bit IEEE 754 Fließkommazahl • boolean: true oder false • char: ein 16-bit Unicode Zeichen ➠ Maschinenunabhängig PSWT 2006 – p.10/34 Primitive Typen • byte: −27 . . . + 27 − 1 • short: −215 . . . + 215 − 1 • int: −231 . . . + 231 − 1 • long: −263 . . . + 263 − 1 • float: 32-bit IEEE 754 Fließkommazahl • double: 64-bit IEEE 754 Fließkommazahl • boolean: true oder false • char: ein 16-bit Unicode Zeichen ➠ Arithmetik modulo 2n PSWT 2006 – p.10/34 Primitive Typen • byte: −27 . . . + 27 − 1 • short: −215 . . . + 215 − 1 • int: −231 . . . + 231 − 1 • long: −263 . . . + 263 − 1 • float: 32-bit IEEE 754 Fließkommazahl • double: 64-bit IEEE 754 Fließkommazahl • boolean: true oder false • char: ein 16-bit Unicode Zeichen ➠ kein unsigned PSWT 2006 – p.10/34 Primitive Typen • byte: −27 . . . + 27 − 1 • short: −215 . . . + 215 − 1 • int: −231 . . . + 231 − 1 • long: −263 . . . + 263 − 1 • float: 32-bit IEEE 754 Fließkommazahl • double: 64-bit IEEE 754 Fließkommazahl • boolean: true oder false • char: ein 16-bit Unicode Zeichen ➠ Defaultwerte 0, false,. . . PSWT 2006 – p.10/34 Literale • int: 23, 027 (oktal), 0x17 (hex) • long: 9223372036854775807L • float: 12.34f, 1.234e1f • double: 12.34, 1.234e1, 12.34d • boolean: true, false • char: ’A’, ’Ä’, ’\n’, ’\’’, ’\"’, ’\\’, PSWT 2006 – p.11/34 Variablendeklarationen Einfach (initialisiert mit default Wert): int i; Mit Initialisierung: int i = 23; Auch mitten im Block: int f(int i) { int j; ... tue etwas mit i und j ... boolean jPostitiv = (j > 0); ... } PSWT 2006 – p.12/34 Arrays Arrays fast wie in C, aber: immer dynamisch alloziert! int f() { int a[10]; a[2] = 3; ... } wie in C geht nicht! PSWT 2006 – p.13/34 Arrays (forts.) In Java: int f() { int[] a; // a Referenz auf ein Array von int a = new int[10]; // Platz für 10 int Werte allozieren a[2] = 3; ... } Arrays als Objekte realisiert ➠ int[] ist Referenztyp PSWT 2006 – p.14/34 Arrays (forts.) Anzahl der Elemente eines Arrays: a.length a[0] ist erstes, a[a.length-1] letztes Element Keine Pointer-Arithmetik! In C: a+1 Zeiger auf Array ab dem 2. Element In Java: Separate Referenz auf Array und Index nötig PSWT 2006 – p.15/34 Mehrdimensionale Arrays int[][] m; m: 1 2 13 0 2 8 1 5 3 PSWT 2006 – p.16/34 Allozieren von mehrdimensionalen Arrays Ein 5 mal 5 Array: int[][] m; m = new int[][5]; for (int i=0;i<m.length;i++) { m[i] = new int[5]; } oder, als Abkürzung dafür: int[][] m; m = new int[5][5]; PSWT 2006 – p.17/34 Strings Unicode Strings Literale: "Eine Zeile\nNoch eine Zeile" Verketten von Strings: String a = "Eine Zeile"; String b = "Noch eine Zeile"; String zweiZeilen = a + "\n" + b; Addition mit anderen Typen rechts: String s = "Die Antwort: " + 42; ➠ s ist nun "Die Antwort: 42" PSWT 2006 – p.18/34 Mehr über Strings Auch Strings sind Referenztypen: String a = "einmalig"; String b = a; Hier wird die Referenz auf den String kopiert. String Objekte ändern sich nach ihrer Erzeugung nie („immutable“) a = "absolut " + a; PSWT 2006 – p.19/34 Mehr über Strings Auch Strings sind Referenztypen: String a = "einmalig"; String b = a; Hier wird die Referenz auf den String kopiert. String Objekte ändern sich nach ihrer Erzeugung nie („immutable“) a = "absolut " + a; • erzeugt einen neuen String "absolut einmalig" PSWT 2006 – p.19/34 Mehr über Strings Auch Strings sind Referenztypen: String a = "einmalig"; String b = a; Hier wird die Referenz auf den String kopiert. String Objekte ändern sich nach ihrer Erzeugung nie („immutable“) a = "absolut " + a; • erzeugt einen neuen String "absolut einmalig" • Speichert in a eine Referenz auf den neuen String PSWT 2006 – p.19/34 Mehr über Strings Auch Strings sind Referenztypen: String a = "einmalig"; String b = a; Hier wird die Referenz auf den String kopiert. String Objekte ändern sich nach ihrer Erzeugung nie („immutable“) a = "absolut " + a; • erzeugt einen neuen String "absolut einmalig" • Speichert in a eine Referenz auf den neuen String • b verweist nach wie vor auf den alten String PSWT 2006 – p.19/34 Operatoren Operatoren ähnlich wie in C • Arithmetik: +, -, *, /, % • Zuweisung: =, +=, -= . . . • Vergleich: ==, !=, <, >, <=, >= • Inkrement/Dekrement: ++, -• Logische Verknüpfungen: &&, ||, ! • Bit-weise: &, |, ~ • Konditional: ? : PSWT 2006 – p.20/34 Kontrollstrukturen: if-then-else int abs(int x) { if (x < 0) { return -x; } else { return x; } } PSWT 2006 – p.21/34 Kontrollstrukturen: switch String monat(int i) { switch(i) { case 1: return "Jänner"; break; case 2: return "Februar"; break; ... default: return "Fehler!"; break; } } PSWT 2006 – p.22/34 Kontrollstrukturen: while int quersumme(int i) { int q = 0; while (i != 0) { q += i % 10; i /= 10; } return q; } PSWT 2006 – p.23/34 Kontrollstrukturen: do-while String line; boolean end = false; do { line = input.readLine(); ... end = ... } while (!end) PSWT 2006 – p.24/34 Kontrollstrukturen: for int[] squares = new int[10]; for(int i=0; i<squares.length; i++) { squares[i] = i*i; } for(int i=0; i<squares.length; i++) { System.out.println(squares[i]); } PSWT 2006 – p.25/34 Kontrollstrukturen: return int sgn(int i) { if (i == 0) { return 0; } else if (i < 0) { return -1; } else { return 1; } } PSWT 2006 – p.26/34 Kontrollstrukturen: break/continue Ohne label: for(...;...;...) { ... if (...) { break; } ... } PSWT 2006 – p.27/34 Kontrollstrukturen: break/continue Mit label: aussen: for(...;...;...) { for(...;...;...) { ... if (...) { break aussen; } ... } } PSWT 2006 – p.28/34 Statische Methoden Bislang noch keine selbst erzeugten Objekte. ➠ können keine Methoden auf Objekten aufrufen. PSWT 2006 – p.29/34 Statische Methoden Bislang noch keine selbst erzeugten Objekte. ➠ können keine Methoden auf Objekten aufrufen. Hauptprogramm: public static void main(String[] args) PSWT 2006 – p.29/34 Statische Methoden Bislang noch keine selbst erzeugten Objekte. ➠ können keine Methoden auf Objekten aufrufen. Hauptprogramm: public static void main(String[] args) Eigene statische Methoden: public static int myMethod(int i) PSWT 2006 – p.29/34 Statische Methoden Bislang noch keine selbst erzeugten Objekte. ➠ können keine Methoden auf Objekten aufrufen. Hauptprogramm: public static void main(String[] args) Eigene statische Methoden: public static int myMethod(int i) Aufruf aus main durch result = myMethod(23); PSWT 2006 – p.29/34 Statische Methoden Bislang noch keine selbst erzeugten Objekte. ➠ können keine Methoden auf Objekten aufrufen. Hauptprogramm: public static void main(String[] args) Eigene statische Methoden: public static int myMethod(int i) Aufruf aus main durch result = myMethod(23); „globale“ Daten auch statisch static int[] qu; PSWT 2006 – p.29/34 .java Dateien Im allg. eine Klassendefinition pro .java Datei. Name der Klasse muß mit Dateinamen übereinstimmen! Z.Bsp. Datei Exercise.java: class Exercise { static int zaehler; static double f(int i) { ... } public static void main(Strig[] args) { ... } } PSWT 2006 – p.30/34 Kommentare 3 Arten: • Einzeiler, von // bis Zeilenende • Mehrzeilige, zwischen /* und */ • JavaDoc, zwischen /** und */ PSWT 2006 – p.31/34 Aufgabe 2 Vertiefen und Ergänzen des Stoffs durch Lesen im Java Tutorial: http://java.sun.com/docs/books/tutorial/java/index.html • Object-Oriented Programming Concepts • Language Basics PSWT 2006 – p.32/34 Aufgabe 3 HelloWorld—die Luxus-Ausgabe. java Hallo ➠ Hallo, wer ist denn da? java Hallo Martin ➠ Hallo Martin! java Hallo Tim Struppi ➠ Hallo Tim und Struppi! java Hallo Tick Trick Track ➠ Hallo Tick, Trick und Track! PSWT 2006 – p.33/34 Aufgabe 4 Ein Programm zur Berechnung von Binomialkoeffizienten: n =1 0 n =1 n n+1 k+1 n n = + k k+1 und n =0 k falls k < 0 oder k > n Und zwar. . . PSWT 2006 – p.34/34 Aufgabe 4 Ein Programm zur Berechnung von Binomialkoeffizienten: n =1 0 n =1 n n+1 k+1 n n = + k k+1 und n =0 k falls k < 0 oder k > n Und zwar. . . • zuerst als zweifach rekursive Funktion PSWT 2006 – p.34/34 Aufgabe 4 Ein Programm zur Berechnung von Binomialkoeffizienten: n =1 0 n =1 n n+1 k+1 n n = + k k+1 und n =0 k falls k < 0 oder k > n Und zwar. . . • zuerst als zweifach rekursive Funktion • dann mit einem Array als Speicher für schon berechnete Werte PSWT 2006 – p.34/34