EINFÜHRUNG: JAVA ALLGEMEIN

Werbung
JAVA
●
Grundelemente der Sprache
●
Fortgeschrittene Sprachkonstrukte
Stefan Berner
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
EINFÜHRUNG: JAVA ALLGEMEIN
●
Folie 1 von 29
2
Womit haben wir es bei Java zu tun?
◆ Programmiersprache
◆ Virtuelle Maschine, Ausführungsmodell
◆ Entwicklungsumgebung, Klassenbibliothek
●
Schwerpunkt in diesem Vortrag ist die Sprache
→ Übersicht über die Programmiersprache
→ Ziel: Sprachkonzeption und Leistungsfähigkeit
beurteilen können
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 2 von 29
EINFÜHRUNG: SPRACHE JAVA
●
Java ist eine objektorientierte Programmiersprache
●
Objektorientiert steht hier für:
3
◆ Objekte
◆ Klassen
◆ Geheimnisprinzip (Information Hiding)
◆ Vererbung
◆ Polymorphismus
●
ausserdem unterstützt Java
◆ Fehlerbehandlung mittels Exceptions
◆ Multithreading
◆ Synchronisation von Threads
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
GLIEDERUNG
●
Folie 3 von 29
4
Grundelemente der Sprache
◆ Ein kleines, einführendes Beispiel
◆ Typsystem und Datentypen
◆ Anweisungen (Bedingte Anweisungen, Schleifen)
◆ Programmstruktur von Java
●
Fortgeschrittene Sprachkonstrukte
◆ Pakete und Importe
◆ Klassen und Schnittstellen
◆ Methoden, Objekterzeugung
◆ Exceptions
◆ Threads und Synchronisation
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 4 von 29
EIN EINFÜHRENDES BEISPIEL
package
tiny.example;
import
java.lang.Math;
5
/* Paketdeklaration (optional) */
/* Deklaration der Importe */
/* Klassendeklaration */
class Circle
{
Double radius;
/* Instanzvariablendeklaration */
Circle( double radius )
{ this.radius = new Double( radius ); }
/* Konstruktor */
double area()
/* Instanzmethode */
{ return ( Math.PI
* Math.pow( radius.doubleValue(), 2 ) ); }
}
class Application
{
/* startet das Programm */
public static void main( String args[] )
{ Circle aCircle = new Circle( 42d );
System.out.println( aCircle.area() ); } }
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
TYPSYSTEM UND VARIABLEN
●
Folie 5 von 29
6
Java ist eine streng getypte Sprache!
◆ statische Typprüfung
◆ keine “legale” Zeigerarithmetik (u.a. kein *ptr++ etc.)
◆ Variablen können nur typverträgliche Werte enthalten
→ keine implizite Typkonvertierung
→ nicht zwischen “unzusammenhängenden”Typen
●
Variable enthält entweder:
◆ Wert eines “einfachen Datentyps” oder
◆ Referenz auf ein Objekt bzw. auf ein Datum eines “komplexen Datentyps”
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 6 von 29
JAVA DATENTYPEN
●
7
“Einfache” Datentypen
◆ Werte ohne Identität
→ Wertsemantik
◆ Ganzzahlen, Fliesskommazahlen,
Zeichen bzw. Buchstaben, Bool’sche Werte
●
“Komplexe” Datentypen
◆ Objekte mit Identität
→ Referenzsemantik,
… aber … keine expliziten Zeiger und keine explizite Dereferenzierung
◆ Felder, Klassen, Schnittstellen
◆ Schlüsselwort null steht für das Fehlen einer Referenz
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
GANZZAHLEN
●
Folie 7 von 29
8
4 Varianten
◆ 8 bit → byte
◆ 16 bit → short
◆ 32 bit → int
◆ 64 bit → long
●
Vorzeichenbehaftet (kein “unsigned”)
●
Zweierkomplement
●
Randbedingung: Ablaufgeschwindigkeit
◆ 1 Anweisung ≡ Drei-Address-Code
◆ Keine automatische Grössenanpassung (Bignums)
wie beispielsweise in Smalltalk
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 8 von 29
FLIESSKOMMAZAHLEN
●
9
2 Varianten (IEEE754)
◆ 32 bit Fliesskomma → float
◆ 64 bit Fliesskomma → double
●
Keine Bignums (aber ab v1.1 Klasse BigNum)
●
Keine Exceptions
◆ da im Standard so definiert
◆ Auch bei “Division durch 0” keine Exception
◆ POSITIVE_INFINITY, NEGATIVE_INFINITY, “Negative Zero” oder NaN
◆ Anleihe von funktionalen Sprachen, siehe VAL oder SETL
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
ZEICHEN UND BOOL’SCHE WERTE
Folie 9 von 29
10
Zeichen
●
char
◆ 16 Bit Unicode
→ Sonderzeichen, Umlaute etc. zulässig in Bezeichnern
◆ Transparent implementiert
Bool’sche Werte
●
boolean
◆ true und false
◆ sind keine “Integers”,
z.B. aBoolean = (boolean) 17 wird nicht übersetzt
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 10 von 29
KOMPLEXE DATENTYPEN
11
●
haben in Java Referenzsemantik
●
Felder → int[][]… matrix = new int [3][3] …
●
Klassen → class EineKlasse …
●
Schnittstellen → interface EineSchnittstelle …
●
Java kennt keine Records, Structs, Unions etc.
◆ Alternative: (methodenlose) Klassen
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
VARIABLEN: DEKLARATION
Folie 11 von 29
12
●
Deklaration à la C
●
Deklaration kann prinzipiell überall erfolgen, vgl. Algol
●
Belegung bei Deklaration ist möglich
●
Zuerst Attributierung, dann Typ, dann Bezeichner
class Foo
{ static final int AClassConstant = 1;
public static Object AClassVariable;
private boolean anInstanceVariable;
Object anotherInstanceVariable = new Object(…);
…
void static aMethod( float aParameter )
{ char aLocalVariable;
…
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 12 von 29
VARIABLENARTEN, LEBENSDAUER
●
Ort und Attributierung der Deklaration
bestimmen Art der Variable
●
Variablenart regelt Lebensdauer
●
Klassenvariablen
13
◆ Lebensdauer: solange die Klasse existiert
●
Instanzvariablen
◆ Lebensdauer: solange das Objekt existiert
●
Methodenparameter und lokale Variablen
◆ Lebensdauer: während die Methode betreten ist (Stapel)
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 13 von 29
VARIABLEN: GÜLTIGKEITSBEREICH
●
Ort und Attributierung der Bezeichnerdeklaration
regelt Sichtbarkeit des Bezeichners
●
Gilt für Variablen, Methoden (und m.E. Klassen)
Sichtbarkeit
public
✔ ✔
selbes Paket, andere
✔ ✔
Klasse (nicht Unterklasse)
anderes Paket,
✔ ✔✘
Unterklasse
anderes Paket, andere
✔
✘
Klasse (nicht Unterklasse)
selbes Paket,
Unterklasse
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
14
standard
private
protected private protected
(ohne Att.)
✔
✔
✘
✘
✘
✘
✘
✘
ab
Version 1.0
nicht mehr
unterstützt
(korrigieren
im Buch Java
in a Nutshell,
S. 179)
Folie 14 von 29
BEDINGTE ANWEISUNGEN
●
15
if-Anweisung wie in C
◆ B muss boolean sein!!!
if
( B ){ … }
else if ( B ) { … }
…
else …
●
switch-Anweisung (leider) wie in C
◆ i darf vom Typ byte, char, short, int, oder long sein
switch (i)
{ case 1: System.out.println(1);
case 2: System.out.println(2); break;
default: System.out.println(3); break; }
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 15 von 29
ITERATION IN JAVA
16
●
For-Schleife:
for (int i; i < n; i++) { … }
●
While-Schleife:
while(B) { … }
●
Do-While-Schleife: do { … } while (B)
◆ wie Repeat-Until-Schleife in Pascal, Modula etc.
◆ Java kennt keine Prozedurparameter, wie z.B. Modula II oder
parametrisierbare Blöcke, wie z.B. Smalltalk
◆ daher ist es umständlich Iterator-Methoden (z.B. do: oder collect: in ST)
zu erstellen. Als Alternative gibt es sogenannte “Enumerations”:
Enumeration anEnumeration = aCollection.elements();
while ( aEnumeration.hasMoreElements() )
{ System.out.println( aEnumeration.nextElement() ); }
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 16 von 29
PROGRAMMSTRUKTUR
17
package ein.paket;
import
import
angabe.der.importe;
…
class EineKlasse
{
static EinTyp EineKlassenVariable;
nochEinTyp eineInstanzVariable;
void eineMethode( … )
{
eineInstanzVariable.einMethodenAufruf( … );
…
}
interface EinInterface
{ … }
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
PAKETE UND IMPORTE
●
package ein.paket.etc. … .etc;
●
Gliedern eng kooperierende Klassen
Folie 17 von 29
18
◆ definieren einen Gültigkeitsbereich für Klassen, Methoden und Variablen
◆ Pfadinformation für die Ablage übersetzter Klassen
●
import ein.paket.etc. … .klasse
◆ “.*” importiert alle Klassen des Pakets
●
Geben die benutzten Klassen und Schnittstellen an
◆ ähnlich IMPORT in Modula II oder with in Ada
◆ Suchpfad für zu importierende Klassen
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 18 von 29
KLASSEN
19
●
public … class EineKlasse
[ extends EineOberklasse ]
[ implements Schittstelle, etc. ]
{ /* Klassenrumpf */ }
●
Datentyp + zugehörige Implementierung
●
Attributierung
◆ public → sinngemäss (siehe auch Folie 14)
◆ abstract → abstrakte Klasse, nicht instanzierbar
◆ final → keine Unterklassen möglich, kann Missbrauch verhindern
●
extends deklariert Oberklasse
●
implements deklariert einzuhaltende Schnittstellen
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
SPEZIALISIERUNG
●
Folie 19 von 29
20
… [ extends Oberkl. ][ implements Schnitts., … ]
◆ Wird extends weggelassen, dann wird Object
als Oberklasse angenommen
●
Typ des Empfängerobjekts der Methoden wird variiert
◆ Typ anderer Parameter wird nicht variiert
●
Typ der Parameter redefinierter Methoden darf nicht
allgemeiner sein als in der Oberklasse (Bsp. Folie u)
●
Ausschliesslich Einfachvererbung ... aber ...
●
Klasse kann mehrere Schnittstellen implementieren
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 20 von 29
REDEFINITION VON METHODEN
class Outside
{ }
class Top
{ }
21
class Middle extends Top
{
void foo( Middle anObject ) { … }
void fooToo( Middle anObject ) { … }
}
class Bottom extends Middle
{
void foo( Outside anObject ) { … }
/* neue Methode */
/* illegal - würde nicht übersetzt werden
void fooToo( Top anObject) */
/* legal */
void fooToo( Bottom anObject ) { … }
/* redefiniert fooToo */
}
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
SCHNITTSTELLEN
Folie 21 von 29
22
●
interface EinInterface [extendsAnderesInterface]
{ /* Schnittstellenrumpf */
public void eineMethode( … );
public void nochEine();
… }
●
Schnittstellendeklaration analog zur Klassendeklaration
◆ Schnittstellenmethoden dürfen nicht native, static, synchronized,
final, private oder protected attributiert sein
●
Wenn eine Klasse eine Schnittstelle implementiert, dann
◆ ist die Schnittstelle bindend auch für alle Unterklassen
◆ wird deren Einhaltung vom Übersetzer überprüft
◆ Enumeration anEnumeration = aCollection.elements();
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 22 von 29
KLASSENRUMPF
23
●
class EineKlasse { anweisung1; anweisung2; … }
●
Rumpfblock enthält
◆ Klassen- und Instanzvariablen (bereits behandelt)
◆ Klassen- und Instanzmethoden
◆ Konstruktoren
●
Bezeichner werden ggf. von Oberklasse geerbt
◆ private-Bezeichner → vorhanden aber nicht sichtbar
◆ Redefinierte Bezeichner → Aufruf mit super.anIdentifier …
◆ Konstruktoren werden nicht vererbt
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 23 von 29
KLASSEN- UND INSTANZMETHODEN 24
●
RückgabeTyp eineMethode( … )
{ … }
●
Bezeichner + Parameter zusammen müssen eindeutig sein
●
ausschliesslich Call-By-Value
●
Attributierung von Methoden
◆ protected, public, private, static wie bei Variablen, zusätzlich
◆ abstract → abstrakte Methode → abstrakte Klasse
◆ synchronized → für Threadsynchronisation. Erwirbt exkl. Lock auf Objekt
◆ native → implementiert in einer anderen Sprache, üblicherweise C
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 24 von 29
KONSTRUKTOREN
●
KlassenName( … ) { … }
●
Konstruktoren sind spezielle Methoden
25
◆ Objekterzeugung
◆ Objektinitialisierung
●
Immer gleicher Bezeichner wie die Klasse
◆ Mehrere Konstruktoren sind erlaubt
◆ Unterscheidung durch unterschiedliche Signatur, z.B. A(), A(B b) etc.
●
Konstruktoren werden nicht vererbt
◆ super( … ) ruft Konstruktor der Oberklasse auf
◆ this( … ) ruft andere Konstruktoren der Klasse auf
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
EXCEPTIONS
●
Folie 25 von 29
26
Ausnahme- bzw. Fehlerbehandlung in PS integriert
◆ wichtig für robusten und verständlichen Code
◆ Fehlerbehandlung wird vom eigentlichen Kontrollfluss getrennt
●
Schlüsselwort throws deklariert die Exceptions,
welche eine Methode auslösen kann
●
Eine Exception muss entweder
◆ behandelt, d.h. abgefangen werden oder
◆ es muss explizit angegeben werden, dass dies nicht geschieht,
d.h. die Exception wird zum Aufrufer weitergereicht
→ “catch or declare”-Regel
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 26 von 29
THREADS UND SYNCHRONISATION
●
27
Java unterstützt Multithreading
◆ new Thread().start() started einen Thread
●
In Java kann ein kritischer Code-Bereich geschützt werden,
so dass nur ein Thread diesen betreten kann
●
Ist eine Methode synchronized attributiert, dann
◆ wird automatisch vor dem Methodenaufruf der Monitor für das zugehörige
Objekt erworben bzw. belegt
◆ nach dem Methodenaufruf wird der Monitor wieder freigegeben
◆ andere Threads werden ggf. “schlafen geschickt” bis Monitor wieder frei ist
◆ mittels wait() und notify() können Threads “schlafen geschickt“ und
“geweckt” werden
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
MONITORE UND REENTRANCE
●
Folie 27 von 29
28
Monitore in Java sind re-entrant,
d.h. der Versuch des Besitzers den Monitor mehrfach zu
erwerben, führt nicht zu einer Verklemmung
class Foo
{
public synchronized void a()
{
System.out.println("bin in a() und rufe b() auf");
b();
System.out.println("bin wieder in a()");
}
public synchronized void b()
{
System.out.println("jetzt bin ich in b()");
}
}
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 28 von 29
BEISPIEL NUMMERNVERGABE
●
ein Thread vergibt (auf Anfrage hin) Nummern
●
andere Threads können Nummern abholen
●
jede Nummer soll nur einmal vergeben werden
29
◆ Nummern werden aufsteigend vergeben
◆ keine Nummer darf mehrmals vergeben werden
●
besteht keine Nachfrage, dann soll die Nummernvergabe
eingestellt werden
◆ Timeout für den Thread, welcher die Nummern vergibt
◆ Threads, welche nach dem Timeout versuchen eine Nummer abzuholen,
sollen gestoppt werden
Grundelemente der Sprache, fortgeschrittene Sprachkonstrukte
Java™ – Technologie und Entwicklungsplattform
© 1996/97, Stefan Berner, 1997/Apr./02
Folie 29 von 29
Herunterladen