Ch. Wolff Digitale Informationsverarbeitung, Kap. 261 Entwicklung von Java zForschungsprojekt zur Entwicklung einer Programmiersprache für vernetzte und eingebettete Anwendungen (OAK) zkonzeptuelle Basis: OOP-Sprachen (C++, SmallTalk, Eiffel) zJava Development Kit 1.2: ca vordefinierte Klassen zJDK 1.0: 1995, 1.1: 1996, 1.2: 1999 (Java 2-Plattform) zkiller application: Java Applets im WWW zNachteile höherer Programmiersprachen: yHardwareinkompatibiliät, mangelnde Portabilität yunzureichende oder nicht implementierte Standards yBedeutung des Internet über den akademischen Bereich hinaus
Ch. Wolff Digitale Informationsverarbeitung, Kap. 262 Grundkonzepte zEinfachheit zObjektorientierung zRobustheit zPortabilität und Architekturneutralität: yplattformneutraler Bytecode yvirtuelle Java-Maschine (JVM) als Interpreter auf jeder Plattform zInterpretierte Sprache zMultithreading (nebenläufige Programmierung als genuines Sprachkonstrukt) zLeistungsfähigkeit (?) zautomatische Speicherverwaltung zSicherheit
Ch. Wolff Digitale Informationsverarbeitung, Kap. 263 Einfachheit zWesentlicher Anspruch: Einfachheit verglichen mit den Nachteilen von C++. zReduzierte Sprachdefinition gegenüber C++, typische Charakteristika von C++ fehlen zEinfache Migration, da syntaktisch eng an C++ angelehnt: class HelloWorld { public static void main(String args[]) { System.out.println(Hello, world!"); } zDeklaration der Klasse HelloWorld zVerwenden einer Methode main(), die wiederum eine vordefinierte Methode der System-Klasse (Eigenschaft out der Klasse System vom Typ Printwriter - Ausgabe an die Konsole)
Ch. Wolff Digitale Informationsverarbeitung, Kap. 264 Objektorientierung in Java zUmsetzung der Objektorientierung analog zu C++ mit Vereinfachungen yDatenkapselung (Modularität, data hiding and abstraction) yPolymorphismus yVererbung ydynamisches Binden von Klassen nach Bedarf yObjekte: Zustand definiert durch Instanzenvariablen, Instanzenvariablen und Methoden werden in einer Klassendefinition festgelegt; Objekte werden unter Verwendung des Klassennamens instantiiert.
Ch. Wolff Digitale Informationsverarbeitung, Kap. 265 Objektorientierung in Java II zWie in C++: unterschiedliche Konstruktoren für eine Klasse zBildung von Unterklassen (subclassing) im wesentlichen wie in C++ zWie in C++ Bildung abstrakter Superklassen, die nicht unmittelbar zu Objekten instantiiert werden: Effizienzsteigerung durch einmalige Definition abstrakter Methoden in der abstrakten Oberklasse, die dann von allen konkreten" Objekten der Unterklassen benutzt werden können (Beispiel: Graphical - Rectangle, Circle etc)
Ch. Wolff Digitale Informationsverarbeitung, Kap. 266 Besonderheiten von Java im Vergleich zu C++ zSyntax: eng an C/C++ angelehnt (Operatoren, Aufbau von Ausdrücken, Datentypen...) zUnterschiede: ykein Präprozessor ykein Typedef ykein Define ykeine Records und Unions (nur Klassen !) ykeine Funktionen ( Methoden !) ykeine Mehrfachvererbung ykein Goto
Ch. Wolff Digitale Informationsverarbeitung, Kap. 267 Besonderheiten von Java im Vergleich zu C++, II zkein Überladen von Operatoren zkeine Templates zkeine automatische Typumwandlung zkeine Zeiger/Pointer zSpeicherung in Unicode zPackages (Pakete zusammengehörender Klassen) für den Import von Klassen statt #include über Headerdateien zverschiedene Typen von Kommentaren zautomatische Speicherverwaltung zsynchronisierte Threads werden unterstützt
Ch. Wolff Digitale Informationsverarbeitung, Kap. 268 Sprachbeschreibung von Java zlexikalische Struktur zDatentypen zProgrammstruktur zObjektorientierung zSyntax (Ausdrücke, Anweisungen, Operatoren)
Ch. Wolff Digitale Informationsverarbeitung, Kap. 269 Zeichenkodierung zZeichenkodierung yKodierung von Zeichen in UNICODE yÜbersetzung eines Unicode-Zeichenstroms in Java-Tokens yZusätzlich Mapping von ASCII nach UNICODE, um auch Source-Code auf nicht-UNICODE-Systemen zu unterstützen (UNICODE als Obermenge von ASCII)
Ch. Wolff Digitale Informationsverarbeitung, Kap Lexikalische Struktur von Java II Quelltext ::== { Kommentar | Leerzeichen | Sprachelement } Leerzeichen ::== ASCII-SP | ASCII-HT | ASCII-FF | Zeilenendezeichen Sprachelement::== Schlüsselwort | Identifikator | Literal | Separator | Operator
Ch. Wolff Digitale Informationsverarbeitung, Kap Schlüsselwörter von Java abstract boolean break byte case cast catch char class const continue default do native new null operator outer package private protected public rest return short static super switch sychronized this throw throws transient try var void while double else extends final finally float for if implements import instanceof int interface long
Ch. Wolff Digitale Informationsverarbeitung, Kap Programmstruktur Quelltextdatei ::== [Paketfestlegung] {Import} {Typdeklaration} Paketfestlegung ::== package Paketname; Import = Typimport | Paketimport; Typdeklaration = Klassendeklaration | Schnittstellendeklaration
Ch. Wolff Digitale Informationsverarbeitung, Kap Beispiel Programmaufbau package NeuesPaket; import java.applet.Applet; class Test extends Applet { int EineEigenschaft = 0; int EineMethode(int EinFormalerParameter) { return (EinFormalerParameter + EineEigenschaft) * 5; }
Ch. Wolff Digitale Informationsverarbeitung, Kap Datentypen zeinfache/primitive Datentypen yZeichen: char yGanzzahlen: byte short int long yGleitkommazahlen: float double yWahrheitswerte: boolean zReferenzdatentypen yArrays yKlassen-Datentypen yInterface-Datentypen (Schnittstellen)
Ch. Wolff Digitale Informationsverarbeitung, Kap Klassen- und Interface-Typdeklarationen zEine Klassendeklaration führt einen Referenztyp ein, dessen Implementierung von der Implementierung einer anderen Klassen abgeleitet sein kann (Vererbung) zEine Klasse kann unmittelbare oder mittelbare Superklasse einer anderen sein zinterface-Deklaration: neuer Referenztyp, der eine Menge von Methoden und/oder Namen spezifiziert, ohne unmittelbare Implementierung
Ch. Wolff Digitale Informationsverarbeitung, Kap Klassendeklarationen zAufbau: [public] [Klassenmodifikator (abstract, final)] class Bezeichner[extends Klassentyp] [implements Schnittstellentyp {, Schnittstellentyp}] Klassenrumpf Beispiele: public class Test {...} abstract class Test2 {...} public final class Test3 implements InterfaceExmpl {...}
Ch. Wolff Digitale Informationsverarbeitung, Kap Klassenrumpf zKlassenrumpf = { Komponentendeklaration | Initialisierung } zDer Klassenrumpf besteht aus einer oder mehrerer Komponentendeklarationen, d.h. Variablen- und Methodenvereinbarungen sowie aus Initialisierungen public class test { int test; //Deklaration int test2 = 0 //Deklaration und Initialisierung {test = 5; } // Initialisierung in speparatem Block int quadriere(int einWert)// Methodendeklaration { return einWert * einWert; }
Ch. Wolff Digitale Informationsverarbeitung, Kap Sichtbarkeit zDas Schlüsselwort public in der Klassendeklaration einer (Toplevel-)Klasse regelt deren Sichtbarkeit: yIst die Klasse public, ist sie auch außerhalb ihres Paketes sichtbar, yansonsten ist sie nur in dem Paket sichtbar, in dem sie deklariert wurde.
Ch. Wolff Digitale Informationsverarbeitung, Kap Vererbung: Grundprinzipien zIn Java existiert zwischen Klassen nur die Einfachvererbung, d.h. eine Klasse kann immer nur von einer Oberklasse abgeleitet sein: class Unterklasse extends Oberklasse { //... } zDamit ist die sog. diamond inheritance ausgeschlossen
Ch. Wolff Digitale Informationsverarbeitung, Kap Vererbung: Sonderfälle zVon einer Klasse, die als final gekennzeichnet ist, kann man keine Unterklasse ableiten: zfinal class Unterklasse extends Oberklasse z// geht nicht: class Unterklasse2 extends Unterklasse zUmgekehrt muß man von einer als abstract gekennzeichenten Klasse eine Unterklasse ableiten, um sie verwenden zu können zMehrfachvererbung ist nur indirekt, d.h. über die einmalige oder mehrfache Implementierung von Schnittstellen durch eine Klasse möglich (zusätzlich zur Einfachvererbung)
Ch. Wolff Digitale Informationsverarbeitung, Kap Methodendeklaration zVollständige Syntax der Methodendeklaration: [public | protected | private] Sichtbarkeit der Methode [static] Zuordnung Klasse/Objekt [abstract | final] Vererbbarkeit/Abstraktionsgrad [native]Zugriff auf Plattformspezifisches [synchronized] Synchronisation von threads Resulttattyp Methodenname {[]} ([ÜbergabeParameter]) [Ausnahmen] Methodenrumpf
Ch. Wolff Digitale Informationsverarbeitung, Kap Methodendeklaration zDie Methodendeklaration mußwenigstens folgende Bestandteile aufweisen: zResulttattyp MethodenName() { //Rumpf } zz.B. void eineMethode() { int x = 5; }
Ch. Wolff Digitale Informationsverarbeitung, Kap Sichtbarkeit von Methoden und Eigenschaften zpublic: Methode kann von anderen Klassen benutzt werden, auch außerhalb ihres Pakets bzw. der Klassenhierarchie zprotected: Methode kann nur innerhalb der Klassenhierarchie und des Pakets der Klasse benutzt werden zdefault (kein Modifikator): Methode ist nur im gleichen Paket sichtbar zprivate: Methode kann nur von Objekten der Klasse, in der sie definiert ist, benutzt werden
Ch. Wolff Digitale Informationsverarbeitung, Kap Konstruktoren zKonstrukten die dienen der Initialisierung von Objekten zEin Konstruktor einer Klasse hat denselben Bezeichner wie die Klasse selbst, aber keinen Rückgabewert zFür eine Klasse kann es mehrere Konstruktoren mit unterschiedlichen Parametern geben (Polymorphismus) class Konstrukt { int einWert; Konstrukt(int W) { einWert = W; }
Ch. Wolff Digitale Informationsverarbeitung, Kap Konstruktoren: Beispiel z Für die vordefinierte Klasse String existieren zahlreiche verschiedene Konstruktoren, u. a.: ypublic String() ypublic String(String value) ypublic String(char[] value) ypublic String(char[] value, int offset, int count) ypublic String(byte[] ascii, int hibyte, int offset, int count) ypublic String(byte[] ascii, int hibyte) ypublic String(StringBuffer, buffer)
Ch. Wolff Digitale Informationsverarbeitung, Kap Schnittstellen zMit einer Schnittstelle gibt eine man Menge von Methoden und Eigenschaften vor, die von einer Klasse implementiert werden sollen. Alle Methoden einer Schnittstelle sind abstrakt, d.h. ohne Implementierung zEine Schnittstelle liefert eine Funktionsschablone, die von unterschiedlichen Klassen implementiert werden kann
Ch. Wolff Digitale Informationsverarbeitung, Kap Aufbau von Schnittstellen z Syntax: [public] [abstract] interface Schnittstellenname [extends Schnittstellenname {, Schnittstellenname}] Schnittstellenrumpf
Ch. Wolff Digitale Informationsverarbeitung, Kap Schnittstellen: Beispiel public interface Darstellbar { int Groesse = 2000; int Flaeche = 500; void stelleDar(); }
Ch. Wolff Digitale Informationsverarbeitung, Kap Methoden und Variablen in Schnittstellen zAlle Methoden einer Schnittstelle sind abstrakt; sie sind öffentlich (public), falls die Schnittstelle öffentlich ist zDie Variablen (Eigenschaften) einer Schnittstelle dienen zur Bestimmung von Konstantenwerten, d.h. sie müssen im Schnittstellenrumpf initialisiert werden; ihr Wert kann nicht mehr geändert werde.
Ch. Wolff Digitale Informationsverarbeitung, Kap OO-Modellierung mit Java: Klassen
Ch. Wolff Digitale Informationsverarbeitung, Kap OO-Modellierung mit Java: Objekte
Ch. Wolff Digitale Informationsverarbeitung, Kap OO-Modellierung mit Java: Vererbung
Ch. Wolff Digitale Informationsverarbeitung, Kap OO-Modellierung mit Java: Schnittstellen
Ch. Wolff Digitale Informationsverarbeitung, Kap Fazit: OO-Konzepte in Java zEntstehung der Sprache: zJava ist syntaktisch eng an C++ angelehnt, aber anders als C++ eine streng an den Prinzipien der Objektorientierung orientierte Sprache. zAusnahme: Primitiven Datentypen, die keine Objekte eines Klassentyps sind. zTypisierung: zJava realisiert eine strenge Typprüfung – sowohl zur compile time als auch zur Laufzeit eines Programms.
Ch. Wolff Digitale Informationsverarbeitung, Kap OO-Konzepte in Java (Forts.) zVererbung yFür Klassen existiert nur Einfachvererbung, Mehrfachvererbung nur für Schnittstellen zPolymorphismus: ydas Überladen von Methoden und Konstruktoren, yEntscheidung für die passende Methodenimplementierung zur Laufzeit (late binding) und yZuweisung von Objektreferenzen zu Objektreferenzen anderen Typs (im gleichen Teilbaum der Klassenhierarchie) yKein Überladen von Operatoren (z. B. Neudefinition von + oder * für eine Klasse)
Ch. Wolff Digitale Informationsverarbeitung, Kap OO-Konzepte in Java III zInitialisierung und Konstruktoren yEigenschaften von Klassen werden automatisch instantiiert und mit Default-Werten belegt (0 bei Integer-Werten, false bei boolean...) yFür jede Klasse existiert ein (parameterloser) Defaultkonstruktor yunterschiedliche Konstruktoren (Parametertyp und -anzahl) können deklariert werden yDie Dekonstruktion von Klassen geschieht automatisch durch die Speicherverwaltung
Ch. Wolff Digitale Informationsverarbeitung, Kap OO-Konzepte in Java IV zAbstrakte Klassen yDie Bildung abstrakter Klassen wird von Java unterstützt. Zusätzlich können in Schnittstellen abstrakte Methoden zusammengestellt werden, die einen semantisch zusammengehörenden Funktionalitätsbereich spezifizieren. zMetaklassen und Klassenobjekte Durch die Klasse Class und die im Paket java.lang.reflect unterstützt Java die Bildung von Klassen und Objekten und das dynamische Laden von Klassen, deren Instantiierung und Verwendung zur Laufzeit eines Programms.
Ch. Wolff Digitale Informationsverarbeitung, Kap OO-Konzepte in Java V Generische Klassen Mit Hilfe der Basisklasse Object und der Mechanismen der class reflection lassen sich generische Klassen (z. B. abstrakte Datentypen) definieren, die je nach Bedarf mit Objekten unterschiedlichen Typs gefüllt werden können, vgl. unten Kap. und. Zuweisung von Objektreferenzen Die Zuweisung von Objektreferenzen erfolgt auf der Basis der Referenzsemantik (d. h. die Referenz auf das Objekt, nicht seine Werte werden übergeben). Für primitive Datentypen gilt die Wertsemantik.
Ch. Wolff Digitale Informationsverarbeitung, Kap Anweisungen und Anweisungsblöcke zBlockaufbau und Variablendeklarationen erfolgen im wesentlichen nach den von C++ bekannten Regeln. zFolgende Typen von Anweisungen sind in Java vorhanden: yLeere Anweisung yAnweisung mit Label yAusdruck; yAuswahl yIteration ySprunganweisung ySychronisationsanweisung yAusnahmeanweisung
Ch. Wolff Digitale Informationsverarbeitung, Kap Anweisungsblöcke zEin Anweisungsblock besteht aus einer einzenlen, durch Semikolon abgeschlossenen Anweisung oder einer in geschweiften Klammern eingefassten Folge von Anweisungen: Anweisung; { Anweisung1; Anweisung2; //... Anweisungn; }
Ch. Wolff Digitale Informationsverarbeitung, Kap Methoden- und Komponentenzugriffe zAuf die Methoden einer Klasse (eines Objektes einer Klasse) kann man unter Angabe von Klase und Methode zugreifen: Objektname.Methodenname(); Z. B.: System.out.println(); Gleiches gilt für die Komponenten eines Objekts: MeinObjekt.MeineEigenschaft = 0; Die Angabe der Objektvariablen ist nur notwendig, wenn der Zugriff nicht ohnehin innerhalb der Klassendeklaration erfolgt.
Ch. Wolff Digitale Informationsverarbeitung, Kap Operatoren und Separatoren zverfügbare Operatoren im wesentlichen mit den aus C/C++ bekannten Operatoren identisch: zSeparatoren: ()[]{};,. zOperatoren: => =!= &&|| */&|^% > >>>+=-=*=/=&=|=^=%= >= >>>= yWichtig: Der Additionsoperator ist auch für Objekte vom Typ String definiert (string concatenation).
Ch. Wolff Digitale Informationsverarbeitung, Kap Auswahlanweisungen zWie in C/C++ gibt es zwei Formen: zif-Anweisung (mit else-Verzweigung) zswitch-Anweisung zZu beachten ist, daß bei der if-Anweisung der auszuwertende Typ den Datentyp boolean haben muß; anders als in C können also nicht ohne weiteres einfach Integer-Variablenwerte ausgewertet werden, da sie nicht direkt nach boolean konvertierbar sind.
Ch. Wolff Digitale Informationsverarbeitung, Kap Die IF-Anweisung if( ) Anweisung; bzw. {Anweisungsblock;} [else Anweisung; bzw. {Anweisungsblock;}] class Test { static public void main(String args[]) { int iZaehler = 5; if(iZaehler > 10) { System.out.println(iZaehler); } else { System.out.println(iZaehler+10); }}}
Ch. Wolff Digitale Informationsverarbeitung, Kap Switch-Anweisung switch( ) { case Auswahlwert1: // auszuführender Code für Fall 1 [break;] case Auswahlwert2: // auszuführender Code für Fall 1 [break;] //...ggf. weitere Fälle default: // auszuführender Code, sollte sonst nichts zutreffen [break;] }
Ch. Wolff Digitale Informationsverarbeitung, Kap Beispiel Switch-Anweisung int i = 0; for(i = 5; i >= 0; i--) { switch(i) { case 4: case 5: System.out.print("i "); break; case 3: System.out.print("\bst"); break; case 2: System.out.print(" die "); case 1: System.out.println("Zählvariable"); break; default: System.out.println("."); break; }
Ch. Wolff Digitale Informationsverarbeitung, Kap Iterationsanweisungen zZur Ablaufsteuerung existieren wie in C/C++ drei Schleifenkonstrukte: yeine while-Schleife: while (Ausdruck) Statement yeine do/while-Schleife: do Anweisung while (Ausdruck) yeine for-Schleife: for(Init; Ausdruckopt; Inkrementopt) Anweisung
Ch. Wolff Digitale Informationsverarbeitung, Kap Beispiel while-Schleife //... iZaehler = 5; while(iZaehler-- > 0) { System.out.Println(iZaehler); } //... while(false) { // Schleifenrumpf wird nie erreicht System.out.println(iZaehler); } //...
Ch. Wolff Digitale Informationsverarbeitung, Kap Beispiel do-while-Schleife iZaehler = 5; do { System.out.println("Schleifenrumpf do-while\n"); } while(iZaehler-- > 0);
Ch. Wolff Digitale Informationsverarbeitung, Kap Beispiel For-Schleife for(i = 5; i < 10; i++) { System.out.println(i); System.out.println(\n); }
Ch. Wolff Digitale Informationsverarbeitung, Kap Sprunganweisungen zDer Kontrollfluß kann auch unbedingt durch Sprunganweisungen gesteuert werden: ybreak [Bezeichner] - Verlassen einer Ausführungsumgebung ycontinue [Bezeichner] - Fortsetzen einer umgebenden Anweisung yreturn [ ] Wertrückgabe
Ch. Wolff Digitale Informationsverarbeitung, Kap Beispiel break-Anweisung int i = 0; for(i = 5; i >= 0; i--) { if(i == 3) break; } System.out.println(i);
Ch. Wolff Digitale Informationsverarbeitung, Kap Beispiel Break mit Label int i = 10, j = 0, k = 0; Ziel_des_Sprungs: while(i > 0) { do { j++; for(k = 5; k >= 0; k--) { if(k == 3) break Ziel_des_Sprungs; } }while(j < 10); i--; } System.out.println(k); Ausgabe: 3
Ch. Wolff Digitale Informationsverarbeitung, Kap Beispiel continue-Anweisung for(int i = 0; i < 5; i++) { System.out.println("vor"); if(i == 2) continue; System.out.println("nach"); } Ausgabe: vor nach vor nach vor vor nach vor nach
Ch. Wolff Digitale Informationsverarbeitung, Kap Defensives Programmieren mit Ausnahmen z Möglichst frühzeitig sollen vom "normalen" Verhalten eines Programms abweichende Ereignisse abgefangen werden. Gerade bei Zugriff auf externe Ressourcen (Dateien, Netzwerkverbindungen etc.) tritt häufig der Fall ein, daß etwa ein Dateizugriff nicht gelingt da die Datei gesperrt ist oder eine Netzwerkressource nicht erreicht werden kann. zDazu dienen in Java Ausnahmen
Ch. Wolff Digitale Informationsverarbeitung, Kap Ausnahmen zAusnahmen können durch eine throws-Anweisung einer Methode zugeordnet werden zin Java gibt es eine Reihe vordefinierter Ausnahmen zEine Ausnahme wird durch die throw-Anweisung explizit ausgelöst
Ch. Wolff Digitale Informationsverarbeitung, Kap Beispiel: Ausnahmeauslösung static int teile(int x, int y) throws ArithmeticException { if(y==0) throw(new ArithmeticException("Division durch 0")); else return x / y; }
Ch. Wolff Digitale Informationsverarbeitung, Kap Abarbeiten von Ausnahmen zTry-, catch- und finally-Anweisungen dienen der Bearbeitung von Ausnahmen zFolgende Varianten sind erlaubt: ytry ytry [ ] finally zEin mit try umschlossener Anweisungsblock muß einen catch- und/oder finally-Block nach sich ziehen. Ein einzelnes catch- Statement in einem ist wie folgt aufgebaut zcatch(Ausnahmetyp)
Ch. Wolff Digitale Informationsverarbeitung, Kap try-/catch-Anweisungen schematisch Schematisch sieht die Verwendung von try-catch-Konstrukten wie folgt aus: try {// Programmcode, der möglicherweise eine Ausnahme auslöst} catch(Ausnahme A1) {// Programmcode zur Ausnahmebehandlung} catch(Ausnahme A2) {// Programmcode zur Ausnahmebehandlung} finally {// Programmcode, der unabhängig davon, wie der try-Block // verlassen wurde, immer ausgeführt wird}