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