Folien

Werbung
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
Herunterladen