Skip to main content

1998 | Buch

Java

Einführung in die objektorientierte Programmierung

verfasst von: Professor Dr. Martin Schader, Lars Schmidt-Thieme

Verlag: Springer Berlin Heidelberg

Buchreihe : Objekttechnologie

insite
SUCHEN

Über dieses Buch

Das vorliegende Buch ist eine Einführung in die Programmiersprache Java. In den ersten Kapiteln werden die Grundlagen behandelt: Klassen, Objekte, Interfaces und Pakete. Weitere Kapitel befassen sich mit Applets und Benutzeroberflächen, der Ausnahmebehandlung, der Threadprogrammierung, mit Client-Server-Implementierung und dem Aufruf entfernter Methoden. Alle Sprachkonstrukte und die verwendeten Klassen der Java-Standardbibliothek werden an Beispielen verdeutlicht. An die einzelnen Kapitel schließt sich eine Reihe von Übungsaufgaben an. Die kompletten Beispielprogramme und Lösungen zu den Übungen befinden sich auf der beiliegenden CD-ROM.

Inhaltsverzeichnis

Frontmatter
Kapitel 1. Einleitung
Zusammenfassung
In diesem einleitenden Kapitel besprechen wir drei einfache Beispiele, die den Leserinnen und Lesern die drei grundsätzlichen Möglichkeiten, Java-Programme zu schreiben:
  • • als kommandozeilenbasierte stand-alone Anwendung,
  • • als stand-alone Anwendung mit grafischer Benutzeroberfläche bzw.
  • • als Applet, das nur in einem Browser lauffähig ist
Martin Schader, Lars Schmidt-Thieme
Kapitel 2. Lexikalische Konventionen
Zusammenfassung
Java-Übersetzungseinheiten werden in Unicode geschrieben. Dies ist ein Zwei-Byte-Code, mit dem man viele länderspezifische Zeichen, z.B. deutsche Umlaute, französische Akzente oder griechische Buchstaben darstellen kann. (Die aktuelle Version findet man in: The Unicode Standard, Version 2.0, The Unicode Consortium/Addison-Wesley, 1996.)
Martin Schader, Lars Schmidt-Thieme
Kapitel 3. Typen und Werte
Zusammenfassung
Die von einem Java-Programm zu verarbeitenden Daten werden, wie auch der eigentliche Programmcode — also die class-Dateien mit ihren Bytecodes — im Speicher als Bytefolgen abgelegt. Solche Speicherinhalte erhalten erst durch die Angabe ihres Datentyps eine sinnvolle Interpretation. Java stellt hierzu eine Reihe elementarer Datentypen zur Verfügung; darüber hinaus deklarieren sich Java-Programmierer ihre für die jeweiligen Anwendungen benötigten Typen selbst oder benutzen Klassen und Interfaces aus der Java-Klassenbibliothek oder ihrer eigenen Bibliothek.
Martin Schader, Lars Schmidt-Thieme
Kapitel 4. Konstanten und Variablen
Zusammenfassung
In Abschnitt 2.1 wurde erklärt, daß die Symbolfolge, aus der sich eine Java-Übersetzungseinheit zusammensetzt, auch Literale enthalten kann. Diese beschreiben einen Wert, der sich zur Laufzeit des Programms nicht ändern kann und in der Regel vom Java-Compiler direkt in den Bytecode aufgenommen wird. Weil ihr Wert bereits durch ihre Schreibweise ausgedrückt wird, werden derartige Konstanten auch Literal konstanten genannt. Jede Literalkonstante hat einen zugehörigen Typ. Es gibt Literale der elementaren Typen boolean, int, long, char, float und double, sowie Zeichenketten, die konstante String-Werte repräsentieren. Der Java-Compiler erkennt nicht nur den Wert, sondern auch den Typ einer Literalkonstanten ohne besondere Deklaration.
Martin Schader, Lars Schmidt-Thieme
Kapitel 5. Typumwandlungen, Ausdrücke und Operatoren
Zusammenfassung
In diesem Kapitel behandeln wir Ausdrücke, mit denen alle Berechnungen in Java formuliert werden. Ausdrücke verbinden ihre Operanden durch Operatoren. Wenn in einem Ausdruck Operanden verschiedener Typen gemischt werden, so macht dies in der Regel die Typumwandlung wenigstens eines Operanden notwendig, da nicht alle Operatoren für alle beliebigen Typkombinationen implementiert sind. Ist z.B. ein byte-Wert mit einem long-Wert zu multiplizieren, wird der byte-Wert zunächst in long konvertiert. Diese Konversion wird vom Compiler implizit vorgenommen. Andere Typumwandlungen, die „unsicher“ sind, da bei ihnen Wert- oder Genauigkeitsverluste möglich sind, können wir nur explizit veranlassen.
Martin Schader, Lars Schmidt-Thieme
Kapitel 6. Anweisungen
Zusammenfassung
Der Kontrollfluß beim Aufruf von Java-Methoden wird durch Anweisungen gesteuert, die wegen dieses Steuereffekts ausgeführt werden und keinen relevanten Wert oder Typ haben. Es gibt in Java zwar Ausdrucksanweisungen, die lediglich wegen ihrer Seiteneffekte ausgewertet werden (siehe 6.3), aber keine Anweisungen, die nur einen Wert berechnen, auf den man nicht mehr zugreifen kann und die sonst keinerlei Aktivitäten auslösen, z.B.
Martin Schader, Lars Schmidt-Thieme
Kapitel 7. Felder
Zusammenfassung
Java-Fdder sind spezielle, einfache Objekte, die — wie alle Objekte — dynamisch erzeugt werden. Ein Feld-Objekt enthält eine Anzahl von Variablen. Diese Anzahl kann null sein; das Feld heißt dann leeres Feld.
Martin Schader, Lars Schmidt-Thieme
Kapitel 8. Klassen und Objekte
Zusammenfassung
Mit einer Klassendeklaration definiert man neue Referenztypen und legt gleichzeitig deren Implementation fest. Jede Klasse (außer Object) ist implizit Subklasse der Klasse Object; es gibt also eine gemeinsame Wurzel der Java-Vererbungshierarchie. Im Rumpf einer Klasse kann man folgendes deklarieren:
  • Variablen eines beliebigen Typs, in denen man Objektzustände speichert,
  • Methoden, das sind die Operationen, die auf Objekte der Klasse angewendet werden können, die also das Objektverhalten implementieren,
  • Konstruktoren, das sind spezielle Methoden, mit denen man die Variablen initialisiert,
  • • static Initialisierer, das sind spezielle Anweisungsfolgen, die nach dem Laden der Klasse (ebenfalls zum Zweck der Initialisierung) einmal ausgeführt werden, und
  • eingebettete Klassen, das sind Klassen, die wieder einen neuen Referenztyp deklarieren; meistens handelt es sich dabei um Hilfskiassen, die man nur lokal benötigt. Eingebettete Klassen behandeln wir in Kapitel 12.
Martin Schader, Lars Schmidt-Thieme
Kapitel 9. Subklassen, Superklassen und Vererbung
Zusammenfassung
Eines der zentralen Prinzipien der objektorientierten Programmierung ist die Wiederverwendung von Code. Die Wiederverwendung von Klassen, die wir selbst entwickelt und getestet oder in einer Klassenbibliothek gefunden haben, ist in Java dadurch möglich, daß wir in anderen Klassen Referenzen auf diese Typen verwenden und die entsprechenden Objekte erzeugen. Auf diese Weise haben wir schon mehrfach unsere Zaehler-Klasse aus dem ersten Kapitel benutzt.
Martin Schader, Lars Schmidt-Thieme
Kapitel 10. Pakete, Geltungsbereiche und Zugreifbarkeit
Zusammenfassung
Eine Übersetzungseinheit ist die umfassendste Struktur, die man in Java spezifizieren kann. Sie enthält in der Regel den Quellcode für eine Klassen- oder Interfacedeklaration. Mehrere Klassendeklarationen sind möglich; siehe aber die unten (S. 159) angeführten Einschränkungen. Bei seinem Aufruf werden javac die Übersetzungseinheiten als Argumente übergeben, deren Java-Code er in Bytecodes übersetzen soll.
Martin Schader, Lars Schmidt-Thieme
Kapitel 11. Interfaces
Zusammenfassung
In Abschnitt 9.7 hatten wir gesehen, daß es sinnvoll sein kann, eine Klasse wie Kto oder VersVertrag abstrakt zu deklarieren, wenn sie als Superklasse für eine Vererbungsstruktur vorgesehen ist und eine oder mehrere ihrer Methoden nur in Subklassen sinnvoll implementierbar sind.
Martin Schader, Lars Schmidt-Thieme
Kapitel 12. Eingebettete Klassendeklarationen
Zusammenfassung
Innerhalb einer Klassendeklaration kann man nicht nur Variablen und Methoden, sondern auch andere Klassen deklarieren. Es sind hier drei Fälle zu unterscheiden: innere Klassen, anonyme Klassen sowie static deklarierte Klassen.
Martin Schader, Lars Schmidt-Thieme
Kapitel 13. Das Abstract Window Toolkit, Applets und Frames (Teil I)
Zusammenfassung
In Java können wir stand-alone Anwendungen schreiben, die zum Starten lediglich den Java-Interpreter benötigen. Auf der anderen Seite ist es möglich, Applets zu implementieren, die innerhalb eines Web-Browsers gestartet werden. Mit der HTML-Markierung <applet> kann man Verweise auf Applets in eine Web-Seite einbetten. Wenn diese Seite in den Browser geladen wird, lädt der Browser ebenfalls das Applet (vom selben Server, von dem die Seite geladen wurde) und startet das Applet lokal mit seinem eingebauten Java-Interpreter. Je nach Bedarf werden weitere class-Dateien oder Image- oder Audio-Dateien vom Server geladen, wozu u.U. jedesmal eine neue Verbindung aufgebaut werden muß; dies hängt von der von Server und Browser verwendeten HTTP-Version ab. Der Prozeß läßt sich mit Java-Archiven beschleunigen (siehe Abschnitt 13.3).
Martin Schader, Lars Schmidt-Thieme
Kapitel 14. Grundlegende Klassen
Zusammenfassung
In diesem Abschnitt behandeln wir eine Reihe von Klassen aus den Paketen java.lang, java.util und java.text, die man in nahezu jeder Anwendung benötigt, und die in vorangehenden Beispielen zum Teil auch schon eingesetzt wurden. Es sei nochmals daran erinnert (vgl. 10.4), daß Java in jede Übersetzungseinheit implizit ein
Martin Schader, Lars Schmidt-Thieme
Kapitel 15. Ausnahmebehandlung
Zusammenfassung
Zur Laufzeit eines Applets oder einer Anwendung können Ausnahmen eintreten — das sind außergewöhnliche Bedingungen, die es nicht gestatten, im Code normal fortzufahren. Beispielsweise soll aus einer Datei gelesen werden, die nicht gefunden wird, soll auf ein Feldelement zugegriffen werden, das nicht existiert, sollen Objekte erzeugt werden, obwohl nicht mehr genug Speicherplatz verfügbar ist, soll eine Verbindung zu einem Server aufgebaut werden, der unbekannt ist, usw.
Martin Schader, Lars Schmidt-Thieme
Kapitel 16. Ein- und Ausgabeströme
Zusammenfassung
Ein- und Ausgaben basieren in Java auf dem “Stream”-Konzept. Ein Ausgabestrom ist ein Kommunikationskanal, der ein Programm mit einer Datensenke verbindet, und umgekehrt ist ein Eingabestrom eine Verbindung von einer Datenquelle zu einem Programm. Als Quellen und Senken können Terminal- oder Konsolfenster, Dateien, Client- oder Serverprogramme usw. auftreten. Daten fließen durch Stream-Objekte immer unidirektional, wenn man sowohl Ein- als auch Ausgaben vornehmen will, werden also zwei Streams benötigt.
Martin Schader, Lars Schmidt-Thieme
Kapitel 17. Threads und Prozesse
Zusammenfassung
In unseren bisherigen Beispielen wurden die Anweisungen eines Programms sequentiell eine nach der anderen ausgeführt. Diese zeitliche Aufeinanderfolge einzelner Anweisungen können wir uns durch den Programmzähler, der sich durch den Quellcode bewegt, veranschaulichen. Sofern eine Aufgabenstellung das „gleichzeitige“ (nebenläufige) Ausführen von Programmen oder Programmteilen erfordert, setzt man Prozesse oder Threads ein. Während ein Prozeß ein ausführbares Programm mit eigenem Adreßraum und eigenen Systemressourcen (Umgebungsvariablen, Dateideskriptoren, Signalen usw.) ist, sind Threads „kleinere“ Objekte, die eine Anweisungsfolge repräsentieren, die unabhängig von anderen Threads ausgeführt werden kann. Threads haben ihren eigenen Stack, um lokale Variablen zu speichern und um Methoden unabhängig von anderen Threads aufrufen zu können. Die anderen Ressourcen werden geteilt; alle Threads eines Programms laufen also insbesondere im selben Adreßraum.
Martin Schader, Lars Schmidt-Thieme
Kapitel 18. Das Abstract Window Toolkit, Applets und Frames (Teil II)
Zusammenfassung
In diesem Kapitel setzen wir die in Kapitel 13 begonnene Behandlung der AWT-Klassen fort und besprechen komplexere Komponenten, die beim Aufbau fast jeder Benutzerschnittstelle benötigt werden. Alle Komponenten sind bereits in der Vererbungshierarchie auf Seite 199 abgebildet. Auch Erzeugung, Versand und Verarbeitung der von ihnen ausgelösten Ereignisse werden, wie in den Abschnitten 13.5 und 13.7 besprochen, nach dem Delegations-Prinzip unter Verwendung von Listener-Objekten abgewickelt.
Martin Schader, Lars Schmidt-Thieme
Kapitel 19. Zeichnen, Image- und Audioverarbeitung
Zusammenfassung
In diesem Kapitel behandeln wir zunächst elementare Grafikfunktionen wie das Zeichnen geometrischer Figuren und von Schrift, das Laden und Anzeigen statischer Bilder sowie die wichtigsten Techniken zur Animation. Wir schließen mit einem kurzen Überblick über die Druckunterstützung sowie über die — derzeit nur recht rudimentär mögliche — Wiedergabe von Klängen in Applets. Die meisten der hier besprochenen Klassen finden sich im Paket java. awt; nur einige wenige sind nach java. awt. image ausgelagert, worauf wir im einzelnen hinweisen werden.
Martin Schader, Lars Schmidt-Thieme
Kapitel 20. Netzwerke, Client/Server-Programmierung
Zusammenfassung
Das Paket java. net enthält Klassen für den Zugriff auf andere Rechner über ein lokales Netzwerk oder das Internet. Bei einem solchen Zugriff bezeichnet man den Zielrechner, der einen Dienst anbietet, als Server-Rechner, den zugreifenden Rechner als Client-Rechner. Damit ein Client-Rechner auf einen Server-Rechner zugreifen kann, muß dort ein entsprechendes Programm laufen und auf von außen eingehende Anfragen warten; ein solches Programm nennt man Server. Das auf Client-Seite laufende Programm heißt entsprechend Client. (Die beteiligten Rechner, auf denen diese Programme laufen, werden auch als Server-Host bzw. Client-Host bezeichnet.) Um etwa eine HTML-Seite von einem Rechner zu laden, muß auf diesem ein HTTP-Server laufen.
Martin Schader, Lars Schmidt-Thieme
Kapitel 21. Methodenaufrufe für entfernte Objekte (RMI)
Zusammenfassung
Servlets dienen wie CGI-Skripte hauptsächlich als Erweiterung eines HTTP-Servers zur Auswertung von HTML-Formularen. TCP/IP-Sockets stellen zwar eine universell einsetzbare Netzwerktechnik dar, sind aber wegen des zu treibenden Implementationsaufwands nur für spezielle Zwecke zu empfehlen, etwa zur Anbindung bestehender Server wie FTP oder SMTP oder bei der Programmierung besonders zeitkritischer Anwendungen. Werden sowohl Server als auch Client in Java neu entwickelt, stellt RMI (die Remote Method Invocation) eine sehr viel einfacher zu beschreitende Möglichkeit dar. RMI fungiert als Protokoll über TCP/IP und verbirgt die meisten Details einer Netzwerkverbindung. Mittels RMI ist es möglich, Methoden für Objekte aufzurufen, die von einer anderen VM erzeugt und verwaltet werden — wobei diese in der Regel auf einem anderen Rechner läuft. Ein solches Objekt einer anderen VM nennt man entferntes Objekt (remote object).
Martin Schader, Lars Schmidt-Thieme
Backmatter
Metadaten
Titel
Java
verfasst von
Professor Dr. Martin Schader
Lars Schmidt-Thieme
Copyright-Jahr
1998
Verlag
Springer Berlin Heidelberg
Electronic ISBN
978-3-662-08043-6
Print ISBN
978-3-540-63770-7
DOI
https://doi.org/10.1007/978-3-662-08043-6