Java: Der Einstieg

Werbung
Java: Der Einstieg
Algorithmen und Datenstrukturen II
1
Grundlegendes zu Java: Historisches
• 1990-1991: Entwicklung der Programmiersprache OAK durch James Gosling von
Sun Microsystems (zunächst für Toaster, Mikrowellen etc.; unabhängig vom Chip,
extrem zuverlässig)
• Umbenennung in Java
• 1995: α und β Release
• von IBM, SGI, Oracle und Microsoft lizensiert
Algorithmen und Datenstrukturen II
2
Grundlegendes zu Java: Eigenschaften
• durch den Bytecode (Zwischensprachencode) unabhängig von der Plattform
• Syntax an C und C++ angelehnt
• objektorientiert
• streng typisiert
• unterstützt parallele Abläufe (Nebenläufigkeit / Threads)
• Graphical User Interface (GUI)
• netzwerkfähig
• modularer Aufbau
• Nachteil: Effizienz leidet (ca. 5–10mal langsamer als C und C++)
Algorithmen und Datenstrukturen II
3
Anwendungen
Selbstständig
laufende
Anwendung
Quellprogramm
Java-Compiler
?
Java-Bytecode auf dem Server
Java-Interpreter
?
Ablauf des Programms
Algorithmen und Datenstrukturen II
4
Applets
Applet
Quellprogramm
Java-Compiler
?
Java-Bytecode auf dem Server
Übertragung per Internet
?
Bytecodes auf dem Rechner des
Benutzers (Client)
Java-Interpreter im Browser oder
Applet-Viewer
?
Ablauf des Programms
Algorithmen und Datenstrukturen II
5
Sicherheit
• keine Pointerarithmetik wie in C
• Garbage Collectiona
• Überprüfungen zur Laufzeit (Datentypen, Indizes, etc.) durch Mechanismen zur
Verifizierung von Java-Bytecode bei der Übertragung
• dennoch ist die (Netz-)Sicherheit umstritten
a Ein
Garbage Collector entfernt automatisch Objekte, Felder und Variablen, auf die keine Referenz
mehr vorhanden ist, aus dem Speicher (siehe Arnold & Gosling [1], S. 12, Kapitel 1.6).
Algorithmen und Datenstrukturen II
6
Erstellen eines Java-Programms
1. Quellprogramm erstellen:
class Hello {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
2. Übersetzen eines Programms:
> javac Hello.java
3. Interpretation des Bytecodes:
> java Hello
Algorithmen und Datenstrukturen II
7
Grundzüge imperativer Sprachen
Algorithmen und Datenstrukturen II
8
Das Behältermodell der Variablen
Imperative Programmierung geht aus vom Modell eines Speichers, aufgegliedert in
einzelne Variablen, in denen Werte abgelegt werden können. Der Speicher bzw. die
Variablen werden verändert durch Befehle bzw. Anweisungen, die selbst vom aktuellen
Speicherinhalt abhängen. Ein typisches Beispiel ist die Anweisung
x = y + z.
Sie bedeutet: Addiere die Variableninhalte von y und z und lege die Summe in der
Variablen x ab.
Algorithmen und Datenstrukturen II
9
Seiteneffekte
• nicht nur der Variableninhalt von x kann sich ändern, sondern auch der von y und
z sowie aller möglicher anderer Variablen;
• falls x ≡ y oder y ≡ z, dann ist dies unmittelbar einsichtig.
Also ist “x = y + z” keine Gleichheit, die zwischen den Werten (Inhalten) von x, y und
z gilt, und mittels der wir über Programme nachdenken und Beweise führen können.
Das Prinzip der referential transparency“ (Werttreue), das in der funktionalen
”
Programmierung gilt, ist in der imperativen verletzt.
Algorithmen und Datenstrukturen II
10
Konsequenzen
1. Der Nachweis von Programmeigenschaften wird viel schwieriger, ebenso das
Verstehen von Programmen.
2. Die Semantik eines Programms hängt von einem strikten Nacheinander der
Ausführung der einzelnen Anweisungen ab.
3. Wiederverwendung von Programmteilen in anderem Kontext bedarf besonderer
Vorsicht.
Algorithmen und Datenstrukturen II
11
Klassen, Objekte und Methoden im Überblick
Java-Programme werden aus Klassen aufgebaut. Aus einer Klassendefinition lassen
sich beliebig viele Objekte erzeugen, die auch Instanzen genannt werden (vgl. Arnold
& Gosling [1], Kapitel 1.6 und 1.7).
Eine Klasse enthält folgende Bestandteile:
• Objektvariablen (objektbezogene Datenfelder)
• objektbezogene Methoden
• Klassenvariablen (klassenbezogene Datenfelder)
• klassenbezogene Methoden
Datenfelder (Synonym: Attribute) enthalten den Zustand des Objektes oder der
Klasse. Methoden sind Sammlungen von imperativ formulierten Anweisungen, die auf
den Datenfeldern operieren, um deren Zustand zu ändern.
Algorithmen und Datenstrukturen II
12
Klassen
Beispiel der Deklaration einer einfachen Klasse:
class Point {
double x, y;
}
Algorithmen und Datenstrukturen II
13
Das Erzeugen von Objekten
Objekte werden mit dem Schlüsselwort new erzeugt. Neu geschaffene Objekte
bekommen innerhalb eines Bereiches des Speichers (welcher Heap genannt wird) einen
Speicherplatz zugewiesen und werden dort abgelegt. Auf alle Objekte in Java wird
über Objektreferenzen zugegriffen – jede Variable, die ein Objekt zu enthalten scheint,
enthält tatsächlich eine Referenz auf dieses Objekt (bzw. auf deren Speicherplatz).
Objektreferenzen haben den Wert null, wenn sie sich auf kein Objekt beziehen. Wir
werden im folgenden Objekte und Objektreferenzen synonym verwenden, es sei denn,
die Unterscheidung ist wichtig.
Algorithmen und Datenstrukturen II
14
Erzeugung und Initialisierung
Point lowerLeft = new Point();
Point upperRight = new Point();
0.0.1
Wertzuweisung
lowerLeft.x = 0.0;
lowerLeft.y = 0.0;
upperRight.x = 1280.0;
upperRight.y = 1024.0;
Algorithmen und Datenstrukturen II
15
Klassenvariablen
class Point {
double x, y;
static Point origin = new Point();
}
static final Point origin = new Point();
Algorithmen und Datenstrukturen II
16
Methoden
Eine Methode ist eine Funktion bzw. Prozedur. Sie kann parameterlos sein oder
Parameter haben. Sie kann einen Rückgabewert liefern oder als void deklariert sein,
wenn sie keinen Wert zurückliefert. Methoden dürfen nicht geschachtelt werden.
Innerhalb von Methoden dürfen lokale Variablen deklariert werden.
class Point {
double x, y;
void clear() {
x = 0.0;
y = 0.0;
}
}
Algorithmen und Datenstrukturen II
17
Um eine Methode aufzurufen, gibt man ein Objekt und den Methodennamen,
getrennt durch einen Punkt, an.
lowerLeft.clear();
upperRight.clear();
Algorithmen und Datenstrukturen II
18
Methode distance
double distance(Point p) {
double xdiff, ydiff; // Beispiel fuer lokale Variablen
xdiff = x - p.x;
ydiff = y - p.y;
return Math.sqrt(xdiff*xdiff + ydiff*ydiff);
}
Aufruf: double d = lowerLeft.distance(upperRight);
Algorithmen und Datenstrukturen II
19
Klassenbezogene Methoden
Klassenbezogene Methoden werden durch das Schlüsselwort static deklariert, z.B.
ist Math.sqrt() eine Klassenmethode der vordefinierten Klasse Math.
0.0.2 “distance” als Klassenmethode
static double distance(Point p1, Point p2) {
double xdiff = p1.x - p2.x;
double ydiff = p1.y - p2.y;
return Math.sqrt(xdiff*xdiff + ydiff*ydiff);
}
Aufruf: double d = Point.distance(lowerLeft, upperRight);
Algorithmen und Datenstrukturen II
20
Vererbung, Pakete und Gültigkeitsbereiche
Algorithmen und Datenstrukturen II
21
Vererbung
Klassen in Java können um zusätzliche Variablen und Methoden erweitert werden.
Dies wird durch das Schlüsselwort extends angezeigt. Die entstehende Unterklasse
besitzt dann alle Eigenschaften der Oberklasse und zusätzlich die in der jeweiligen
Erweiterung angegebenen Eigenschaften. Dieses Konzept wird auch als Vererbung
bezeichnet, weil die Unterklasse alle Eigenschaften der Oberklasse erbt.
Zum Beispiel ist ein farbiger Punkt eine Erweiterung eines Punktes:
class ColoredPoint extends Point {
String color;
}
Algorithmen und Datenstrukturen II
22
Pakete
Bei größeren Softwareprojekten ist es häufig ratsam, diese in verschiedene,
unabhängige Teile aufzuteilen. Solche Teile werden als Module oder Pakete
bezeichnet. Java besitzt einige Eigenschaften, die es erlauben, Software modular
aufzubauen: Verschiedene (i.d.R. logisch zusammengehörige) Klassen können in einem
Paket zusammengefasst werden. Die Klassendefinitionen können in verschiedenen
Dateien enthalten sein.
Algorithmen und Datenstrukturen II
23
Der Paketname muss im Header jeder Datei angegeben sein:
A.java
package abc;
public class A {
...
}
C.java
package abc;
class C {
...
}
class B {
...
}
import abc.A;
class test {
A a;
}
Algorithmen und Datenstrukturen II
24
Gültigkeitsbereiche
public
default (package)
protected
private
zugreifbar für
Nicht-Unterklassen im selben
Paket
ja
ja
ja
nein
zugreifbar für Unterklassen
im selben Paket
ja
ja
ja
nein
zugreifbar für
Nicht-Unterklassen in einem
anderen Paket
ja
nein
nein
nein
zugreifbar für Unterklassen in
einem anderen Paket
ja
nein
ja
nein
Algorithmen und Datenstrukturen II
25
Literatur
[1] K. Arnold, J. Gosling: JavaT M - Die Programmiersprache. Addison-Wesley, 1996.
[2] T.H. Cormen, C.E. Leierson, R.L. Rivest: Introduction to Algorithms. MIT Press, 1990.
[3] D. Flanagan: Java in a Nutshell. O’Reilly &
Associates Inc., 1996.
[4] F. Jobst: Programmieren in Java. Hanser Verlag, 1996.
[5] H. Klaeren: Vom Problem zum Programm.
2.Auflage, B.G. Teubner Verlag, 1991.
[6] K. Echtle, M. Goedicke: Lehrbuch der Programmierung mit Java. dpunkt-Verlag, 2000.
Herunterladen