Programmieren in Java I

ArticleCategory: [Artikel Kategorie]

Software Development

AuthorImage:[Bild des Autors]

[Photo of the Author]

AuthorName:[Name des Autors]

Jose M. Fernández

AboutTheAuthor:[Über den Autor]

Sorry, no information about the author available.

Abstract:[Zusammenfassung]

Dieses ist der erste Artikel in einer Reihe über die Programmierung in Java. Der erste Teil beschreibt Java als Programmiersprache, ihre generellen Eigenschaften und nennt wichtige Informationsquellen.

ArticleIllustration:[Titelbild des Artikels]

[Ilustration]

ArticleBody:[Der eigentliche Artikel]

Einleitung

Hiermit beginnt eine Serie von Artikeln, die die Programmiersprache Java und ihre Entwicklungsumgebung beschreibt. Zunächst werde ich nicht über die historische Geschichte der Sprache, über Mikrowellen und über Waschmaschinen erzählen...(falls jemand wirklich an diesen Aspekten interessiert ist, es gibt eine Menge Publikationen darüber). Ich werde ebenfalls nichts von Duke (Javas Maskottchen) erzählen, diesen Typ mit der großen Nase und dem dreieckigen Körper, der seine Hände zum Rhythmus einer Marimba bewegt und mich an diese alten amerikanischen Science-Fiction Filme erinnert.

Es liegt ein wenig Liebhaberei im Java-Phänomen. Jedes nennenswerte Computer-Magazin schreibt über Java, viele Software-Firmen verkaufen Produkte zur Entwicklung von Java-Applets und nur wenige Web-Sites haben nicht mindestens ein oder zwei Applets.

In dieser Artikelserie will ich versuchen sowohl eine Gesamtübersicht zu vermitteln, als auch auf die Tiefen der Sprache einzugehen. Java ist recht einfach in der grundlegenden Anwendung aber gleichzeitig ziemlich komplex und schwierig zu handhaben, weil es sich ständig weiterentwickelt.

Unser Ziel in den ersten paar Artikel ist, eine generelle Beschreibung der Sprache zu geben, so daß wir später tiefergehende Themen wie Applets, Netzwerkprogrammierung JDBC, Beans usw. besprechen können.

Ich sollte betonen, daß Java eine Programmiersprache für generelle Anwendungen ist. Nicht nur für Applets auf Webseiten, obwohl genau die Java so populär gemacht haben. Wir werden also nicht nur mit diesem Aspekt von Java zu tun haben, weil Java viel mehr Möglichkeiten bietet, die interessanter sein können als Applets.

Dieser erste Artikel ist mehr erläuternd als von praktischen Nutzen. Im nächsten Artikel werden wir die grundlegenden Eigenschaften der Sprache und der Entwicklungsumgebung erkunden. Erst am Ende werden wir ein Beispiel für Java-Programmierung sehen.

Herkunft

Im Jahre 1991 wurde Java von James Gosling, Patrick Naughton, Chis Warth, Ed Frank und Mike Sherindan bei Sun Microsystem Inc. über einen Zeitraum von 18 Monaten erdacht. Zwischen 1992 and 1995 halfen Bill Joy, Arthur Van Hoff, Jonathan Payne, Frank Yellia, Tim Lindolm den ersten Prototypen zur Reife auszuarbeiten

Von diesen Daten ausgehend wird klar, daß Java vor oder wenigstens zusammen mit dem WWW entstand. Bis 1991 hatte Tim Berners Lee die HTML-Sprache noch nicht entwickelt.

Die Syntax von Java ist der von C und der objektorientierte Ansatz ist dem von C++ sehr ähnlich. Java ist eine klare und logisch konsistente Programmiersprache.

Die Gemeinsamkeiten mit C und C++ mögen den Eindruck erwecken, daß Java eine C++-Version für das Internet wäre. Aber es gibt wichtige theoretische und praktische Unterschiede. Besonders, da Java das Paradigma der Objektorientiertheit im Vergleich zu C++ erweitert und verfeinert.

Das Internet hat Java zum Durchbruch verholfen und machte daraus eine allgemein bekannte Programmiersprache. Gleichzeitig hatte Java einen grundlegenden Effekt auf das Internet, weil es die Vielfalt von Objekten erweiterte, die sich frei im Cyberspace bewegen können (dynamische selbstausführende Programme).

Anschaffung und Installation von Java

Es gibt mehrere Tools, die wichtig für die Programmierung mit Java sind. Nebenbei bemerkt: Ich werde mich jedesmal auf die GNU/LINUX-Umgebung beziehen (falls irgendjemand durcheinander kommen sollte):

Die aktuelle ELF-basierte Implementation für Linux benötigt eine Kernelversion von 1.2.13 oder höher.

Ich werde das JDK (Java Development Kit) benutzen, Netscape Version 2.0.14 oder höher und einen Texteditor wie XEmacs. Wir werden immer unter XWindow arbeiten. Obwohl es nicht immer nötig ist, ist es notwendig, wenn man Applets und Programme mit grafischer Benutzerschnittstelle schreibt.

Das JDK kann von folgenden Webseiten heruntergeladen werden:

http://www.blackdown.org/java-linux.html

Auf dieser Seite sucht man sich einen Mirror aus, um die Dateien schnell herunterladen zu können. Vor ein paar Monaten war die letzte Version JDK-1.1.3 (die ich für diesen Artikel nutzte). Aber bei meinem letzten Besuch sah ich dort schon die Version 1.19. (Inzwischen hat die aktuelle Version die Nummer 1.1.7 und das JDK der Version 1.2 (aka Java 2) steht als glibc-Version kurz vor der Veröffentlichung (Anm. d. Ü.)) Beachte bitte, daß ein Download von allen Dateien ein Datenvolumen von rund 24MB umfasst! Dem gegenüber umfasst ein Download von den Dateien, die unbedingt notwendig sind, rund 12 MB (also Geduld!).

Nach dem Entpacken der Archive mit gunzip hindert uns nichts mehr zu beginnen.

Im Normalfall würden wir die Distribution im Verzeichnis /usr/local installieren. Also erzeugen wir das Unterverzeichnis /JDK1.1.3 und darunter folgende Unterverzeichnisse::

/doc Offizielle Dokumentation im HTML-Format

/demo Java Demo-Programme

/lib Programmbibliotheken

/bin Hier liegen die Tools des JDK.

Im Verzeichnisy /lib finden wir die Datei "classes.zip"(diese Datei nicht entzippen!), sie enthält alle kompilierten Klassen, die vom JDK benutzt werden können.

Im JDK-Wurzelverzeichnis finden wir die Datei "src.zip", sie enthält den Quellcode der Dateien, die in classes.zip enthalten sind. Sie können nicht kompiliert werden und wurden der Distribution nur zu Informationszwecken mitgegeben.

Die Entwicklungsumgebung

Wie oben erwähnt, sind die Entwicklungs-Tools im /bin Verzeichnis untergebracht:

javac : Java-Compiler, der Java-Quellcode in Bytecode umwandelt.

java : Java Interpreter. Führt Java-Bytecode aus.

jre : Ein weiterer Interpreter, ähnlich wie java, allerdings für Benutzer gedacht, die nicht alle Optionen nutzen wollen

appletviewer: Testet and startet Applets.

jdb: Debugger.

javap: Disassembler für Bytecode-Dateien, die von java kompiliert wurden.

javadoc : Dokumentations-Generator, erzeugt einen Satz von HTML-Seiten, die die als public und protected deklarierten Klassen, Interfaces, Konstruktoren, Methoden und Felder dokumentieren. Außerdem erzeugt JavaDoc eine hierarchische Darstellung der Klassen und einen Index aller Einträge.

javah : Tool, um native Methoden (in C) zu Java-Programmen hinzuzufügen.

jar: Archiviert Java-Klassen and Quellcode in einer Jar-Archiv-Datei.

javakey : Tool, um digitale Signaturen zu pflegen.

updateAWT : aktualisiert die geänderten Namen der AWT1.02-Methoden in einer Applikation.

Um keine Probleme zu bekommen schlage ich vor, den Pfad /usr/local/JDK1.1.3/bin zur Umgebungsvariablen PATH hinzuzufügen. Falls Du die Entwicklungsumgebung systemweit zur Verfügung stellen möchtest, dann setze die PATH-Variable in der Datei /etc/profile.

Eigenschaften

Bevor wir fortfahren, sollten wir uns fragen: Was ist Java? Die Antwort gibt uns das JDK-Handbuch. Java ist zweierlei: eine Programmiersprache und auch eine Plattform.

Als Programmiersprache ist Java eine Hochsprache mit folgenden Eigenschaften (wir werden zu gegebener Zeit auf die Details eingehen):

Das erste, was unsere Aufmerksamkeit auf sich zieht, ist, daß Java interpretiert wird. Obwohl Java-Quellcode eine vorherige Kompilierung benötigt, um ein Objekt in Low-Level-Bytecode zu erzeugen, wird es auf den verschiedenen Plattformen interpretiert.

Dank Javas Bytecode können wir ein Programm einmal schreiben und überall ausführen ("write once and execute always"). Wir können Java Programme auf einer Plattform kompilieren und sie auf völlig anderen Maschinenarchitekturen, die über eine Java Virtual Machine (JVM) verfügen, ausführen. Ein Java-Programm kann zum Beispiel auf einer Windows-NT-Maschine kompiliert werden und ohne Probleme auf einer Sun Ultra Solaris ausgeführt werden (zumindest theoretisch).

Allgemein gesagt ist eine Plattform eine Hard- und Software-Umgebung, auf der eine Applikation läuft. Jedoch ist für Java eine Plattform nur die Software-Umgebung, wo die Applikation läuft, und jede Java-Plattform muß demnach auf den Hardware-Plattformen laufen.

Eine Java-Plattform hat zwei Bestandteile:

Die JVM ist ein abstrahierter Computer auf dem kompilierte Java-Programme ausgeführt werden können. Das Design der JVM wurde schlicht und klein gehalten, damit sie an allen möglichen Einsatzorten genutzt werden kann. Diese Einfachheit ermöglichte es, daß es eine JVM für alle existierende Plattformen gibt. So bildet sie eine gemeinsame Software-Schicht, die in sehr heterogenen Netzwerken eine Menge der Portabilitätsprobleme lösen kann. Wie man sich unschwer vorstellen kann, ist dies einer der Gründe für die unaufhaltsame Verbreitung dieser Technologie. Dennoch sollte die JVM nicht nur als reine Software-Schicht angesehen werden, denn wie der Name schon andeutet, emuliert die Virtual Machine eine komplettes Computersystem. Nach und nach werden wir auf dem Markt Java-Chips sehen, die echte JMs (Java Machines), Kreditkarten TV-Dekoder usw. unterstützen.

Die API von Java ist eine riesige Sammlung von Softwarekomponenten, die eine Menge Hilfsmittel wie die grafische Benutzerschnittstelle (GUI) zur Verfügung stellen. Sie sind in Bibliotheken gruppiert (in der Java-Terminologie: Java Packages). Dank dieser Packages ist es möglich, Java außer für die bekannten Applets im WWW, auch für Programme wie Proxies, Mailserver, IRC-Server und praktisch alles, was mit dem Internet zu tun hat, zu nutzen.

Wir können die API Packages verschiedenen Gruppen zuordnen:

Neben diesem API-Kern gibt es auch 3D-Grafikerweiterungen, mobile Kommunikation, Computeranimation, usw.

Wir erwähnten zu Beginn dieses Abschnittes, daß Java eine Reihe von Eigenschaften aufweist, die wir uns im Detail ansehen wollen:

Java ist einfach:

In Java gibt es stets nur eine geringe Anzahl von genau definierten Alternativen, um eine Aufgabe zu erledigen. Es bietet all die Funktionalität einer mächtigen Programmiersprache, jedoch ohne die weniger oft benötigten und mehr verwirrenden Möglichkeiten einer solchen. Javas Syntax ist verwandt mit der von C/C++ und hat viele der objektorientierten Eigenschaften von C++. Jeder mit C/C++ vertraute Programmierer wird kein Problem haben, Java zu lernen. Trotz der Gleichheiten, verzichtet Java auf einige C/C++-Eigenheiten wie:

  • Zeigerarithmetik
  • Register (struct)
  • Typen Definitionen (typedef)
  • Makros (#define)
  • explizite Speicherfreigabe (free)
  • mehrfache Vererbung
  • Überladen von Operatoren
  • Strukturen in varianten Records (structures in unions)
Es ist objektorientiert: Java wurde von Grund auf neu geschaffen. Deshalb ist Javas objektorientierter Ansatz klar, nützlich und sehr praktisch. Das Objektmodell von Java ist einfach und einfach zu gebrauchen.
Es ist verteilt: Java wurde mit mit dem Ziel designed, höchste TCP/IP-Verbindungsfunktionalität zu erreichen. Tatsächlich erlaubt es dem Programmierer, auf Informationen im TCP/IP-Netzwerk ähnlich einfach zuzugreifen, wie auf lokale Dateien.
Es ist robust: Java ist eine stark typengebundene Sprache. Das erlaubt Typenüberprüfungen bereits zur Kompilierzeit. Auch während der Ausführung werden einige Kontrollen durchgeführt. Der Speicher wird automatisch verwaltet, denn der Interpreter beinhaltet einen Automatismus, der nicht mehr genutzten Speicherplatz von selbst wieder frei gibt (garbage collector). Java selbst stellt objektorientierte Ausnahmebehandlungs-Routinen zur Verfügung. In einem korrekt geschriebenen Programm können alle Laufzeitfehler abgefangen werden.
Es ist systemunabhängig: Das Hauptziel der Designer von Java war "write once, run anywhere, any moment and always". (Einmal schreiben, überall ausführen, jederzeit und immer) Java Quellcode wird in einen Bytecode kompiliert, der maschinenunabhängig ist. Dieser Bytecode kann auf jedem Java-Laufzeitsystem ausgeführt werden, vollkommen unabhängig, auf welcher Plattform dieses Laufzeitsystem installiert ist.
Es ist sicher:

Die Notwendigkeit verteilter Informationen setzt höchste Sicherheitsansprüche für das Client-Betriebssystem voraus. Java bietet diese Sicherheit dank einiger Eigenschaften in seiner Laufzeitumgebung:

  • Einen Bytecode-Validator
  • Sicherstellung der Verfügbarkeit von Speicher während der Ausführung
  • Einschränkungen beim Dateizugriff

Obwohl der Compiler nur korrekten Bytecode generiert, überprüft der Interpreter diesen Code, um sicherzustellen, daß er nach seiner Kompilierung nicht (absichtlich oder unabsichtlich) verändert wurde Außerdem ermittelt der Java-Interpreter, ob genug Speicher für die auszuführenden Klassen verfügbar ist. Java kann als eine der sichersten Anwendungen für jedes System angesehen werden.

Es ist portable: Neben der grundlegenden Portabilität implementiert Java einen Standard, um wirklich architekturunabhängig zu sein. Integer sind immer Integer (gleiche Größe, gleiche Speicherart), die grafische Benutzerschnittstelle (GUI) besteht aus einem abstrakten System von Fenstern und ist somit unabhängig von der Architektur (UNIX, PC, Mac).
Es wird interpretiert: Um eines der grundlegenden Ziele von Java zu erreichen, die Plattformunabhängigkeit, erzeugt der Java-Compiler einen Zwischencode (Bytecode). Dieser kann auf jedem System mit einem passenden Interpreter ausgeführt werden. Dieses Modell läßt uns über mögliche Performanceprobleme von Java-Anwendungen nachdenken. Aber gerade wegen dieser Performance-Problematik haben die Erschaffer von Java versucht, den Bytecode einfach und so leicht wie möglich in Maschinencode übersetzbar zu gestalten, um höchst mögliche Performance zu gewährleisten.
Es unterstützt Nebenläufigkeit (Multithreading): Es ist einfach, ein stabiles Java Programm zu schreiben, das mehrere Aufgaben gleichzeitig erledigt.
Es ist dynamisch: Java versucht nicht, alle Module, die die Applikation bilden, vor der Ausführung zu binden. Diese Eigenschaft hilft dabei, den Code dynamisch, sicher und passend zur Laufzeit zu laden.

Nach dieser langen Rede (von der eine Menge in der offiziellen Java Dokumentation gefunden werden kann) kann man nach dem Status von Java innerhalb der GNU/Linux Welt fragen. Wir erwähnten weiter oben die Verfügbarkeit des JDK für Linux, welche nichts anderes ist, als eine von Sun Microsystems entwickelte kommerzielle Implementation (obschon sie frei verteilt wird).

Es sind Tools wie der Compiler GUAVAC unter der GPL Lizenz, die uns Java-Quellcode ohne Probleme kompilieren lassen. Wir sollten auch eine virtuelle Maschine namens KAFFE unter der Berkeley Lizenz erwähnen. Die letzten beiden genannten Projekte befinden sich in einem sehr fortgeschrittenem Stadium, obwohl sie noch auf die Java-Klassenbibliotheken von Sun (derzeit frei verfügbar) angewiesen sind, um eine vollständige Entwicklungsumgebung zu bilden.

Verschiedene neue Projekte, die sich noch in einem frühen Stadium befinden, zielen darauf, Entwicklungsumgebungen für schnelle und visuelle Programmerstellung bereitzustellen.

Zum Schluß möchte ich noch bemerken, daß es eine starke Bewegung in Sachen Java und GNU-Technologie im Internet gibt. Gerade bezüglich der Entwicklung aller Werkzeuge für Java - basierend auf einer freien Distribution und unabhängig von Sun. Wir können schon jetzt die Wichtigkeit von Java sehen und wenn die Modewelle einmal vorübergegangen ist, bin ich sicher, daß einiges davon erhalten bleibt (Ich wage zu behaupten, daß tatsächlich eine Menge erhalten bleiben wird).

Ein erstes Programm in JAVA

Nachdem wir uns einige generelle Eigenschaften der Sprache angesehen haben, lasst uns ein echtes Programm ansehen. Wie ich in der Einleitung bereits bemerkte, möchte ich so weit als möglich von der typischen Vorgehensweise - wie ein "Hello-World"-Programm - absehen. Stattdessen lasst uns mit einem Programm beginnen, das ein Rechteck in beliebiger von uns angegebener Größe zeichnet (vielleicht ein bißchen schwierig, aber nicht sehr):

Datei Cuadro.java
class Cuadro {
public static void main (String args[]) {
        int l ,a;
        if (args.length == 2) {
            l = Integer.valueOf(args[0]).intValue();
            a = Integer.valueOf(args[1]).intValue();
         }
         else {
          l= 20;
          a= 15;
         }
          for (int i=l; i>0; i--){
            System.out.print("*");
            }
            System.out.print("\n");
            for (int i= a-2; i>0; i--){
             System.out.print("*");
               for(int j=l-2; j>0; j--) {
                  System.out.print(" ");
                  }
                  System.out.print("*\n");
                  }
                for (int i=l; i>0; i--){
                System.out.print("*");
                }
              System.out.print("\n");
           }
}

In Java ist der Name, der der Quelldatei gegeben wird, sehr wichtig, da er eine "Kompiliereinheit" definiert. Die Datei kann eine oder mehrere Klassendefinitionen enthalten. Der Kompiler erwartet, daß die Quelldatei die Dateinamenserweiterung .java (4 Buchstaben!) hat. Daraus folgt, daß einige Systeme diese Konvention nicht unterstützen (DOS, Windows 3.1)

Im Beispiel stimmt der Name der definierten Klasse mit dem der Quelldatei überein. Das ist nicht zufällig so. In Java muß jeder Quellcode in Klassen definiert werden. Die Konvention lautet, daß der Name der Klasse mit dem Namen der Quelldatei, die diese Klasse enthält, übereinstimmen muß. Hinzu kommt, daß Java auf den Unterschied zwischen Groß- und Kleinschreibung achtet.

Um das Beispielprogramm umzuwandeln, gib auf der Befehlszeile folgendes ein:

> javac Cuadro.java

Der Java-Kompiler erzeugt (wenn alles gut geht) eine Datei namens Cuadro.class, die den umgewandelten Bytecode enthält und von dem Interpreter wie folgt ausgeführt werden kann:

> java Cuadro

Wenn Java-Quellcode umgewandelt wird, wird jede Klasse für sich in ein Archiv gestellt, das genauso heißt wie die Klasse. Es ist eine gute Angewohnheit, der Quelldatei den gleichen Namen zu geben, wie der Klasse, so daß der Name der Quelldatei mit dem der Archiv-Datei übereinstimmt.

Trotz der Einfachheit unseres Beispielprogramms hilft uns "Cuadro.java", die Grundlagen von Java und insbesondere die Struktur eines typischen Javaprogramms zu verstehen.

Als erstes sei hervorgehoben, daß dieses Beispiel kein Java-Applet ist, das in eine HTML-Datei eingebunden werden kann, sondern ein unabhängiges Programm, das vom Java-Interpreter auf der Kommandozeile ausgeführt wird.

Die erste Zeile des Programms lautet:

class Cuadro {

Das erste Wort ist ein reserviertes Schlüsselwort von Java. Es zeigt die Definition einer neuen Klasse an, in diesem Fall "Cuadro" -- Quadrat in deutsch -- Die genaue Definition der Klasse einschließlich ihrer Bestandteile folgt zwischen zwei geschweiften Klammern {}. Beachte dabei, daß in Java sämtlicher ausführbarer Programmcode innerhalb einer Klasse stehen muß.

In der darauffolgenden Zeile:

public static void main (String args[]) {

wird eine Methode namens main() definiert. Alle Java-Programme starten ihre Ausführung mit der Methode main() (ähnlich wie in C/C++). Als nächstes möchte ich ein paar Details kommentieren, die notwendig sind, dieses Beispiel zu verstehen (in späteren Artikeln werden wir diese Sachen vertiefen)

Das Schlüsselwort public kontrolliert den Gültigkeitsbereich der Methoden der Klasse. Wenn eine Klasse public deklariert wird, dann darf sie von Programmcode benutzt werden, der sich außerhalb der Klasse befinden kann. Das Schlüsselwort static bringt die Methode main() dazu, daß sie ausgeführt werden kann, ohne daß vorher die Klasse als Objekt erzeugt werden muß, also ohne daß eine Instanzierung stattfinden muß. Void zeigt an, daß diese Methode keinen Wert zurückliefern soll. Um einer Funktion oder Methode Parameter zu übergeben, nutzt man die Klammern nach dem Namen der Funktion oder Methode. In unserem Beispiel bekommt main als Parameter eine Feld mit Instanzen der Klasse String übergeben.

Offensichtlich wird der ganze Code der Methode von geschweiften Klammern eingerahmt. In der nächsten Zeile:

 int l, a ;

deklarieren wir zwei Variablen vom Typ Integer (Ganzzahl). In Java muß jede Variable deklariert werden, bevor man sie nutzen kann. Beachte, daß jede Anweisung mit einem Semikolon ";" abgeschlossen wird.

Der restliche Code implementiert einen kleinen Algorithmus, der:

  1. testet, ob die richtige Anzahl von Argumenten bzw. Parametern übergeben wurde
    If (args.length==2)
    
  2. Wenn die Parameter übergeben wurden, dann werden sie den Integer-Variablen zugewiesen:
      l = Integer.valueOf(args[0]).intValue();
      a = Integer.valueOf(args[1]).intValue();
    
  3. Ansonsten werden die Variablen mit Standardwerten initialisiert:
      l = 20;
      a = 15;
    
  4. Der Rest des Programms enthält nichts weiter als die Instrunktionen, um ein Rechteck auf den Bildschirm zu zeichnen. Hier besonders:
    System.out.print()
    

    print() druckt den String, der als Argument übergeben wird. System ist eine vordefinierte Klasse, die den Zugriff auf das System erlaubt und out ist der Ausgabestrom, der auf die Konsole schreibt. Und noch:

    for (int i=l; i>0; i--)
    

    Wie erwartet, verhält sich dieser Code genauso, wie uns unsere Erfahrung mit C/C++ und anderen Programmiersprachen vermuten läßt.

Eine nette Hausaufgabe ist es, diesen kleinen Quelltext zu kompilieren und auszuführen. Und außerdem die Portabilität zu testen, indem das kompilierte Objekt Cuadro.class auf verschiedenen Plattformen ausgeführt wird: Linux, Windows 95 (aber nehmt das nicht geschenkt) und zu sehen, daß es unter verschiedenen Plattformen gleich ausgeführt wird.

Zusammenfassung

Wir haben uns verschiedene generelle Eigenschaften der Programmiersprache Java angesehen. Wir haben soeben angefangen zu programmieren und es liegt noch ein weiter Weg vor uns. In künftigen Artikeln werde ich die Programmiersprache genauer beschreiben. Im nächsten Artikel werden wir die Definitionen und Typen von Variablen, grundlegende Anweisungen, Klassen, usw. kennenlernen - die Hauptbestandteile der Sprache.

In jedem Artikel werde ich die Referenzen, Publikationen und URLs angeben, auf denen diese Artikelserie basiert.


Für unsere deutschsprachigen Leser hier noch zwei Links zum Einstieg in Java: Anm. d. Ü.

Translated by Miguel A Sepulveda
Aus dem Englischen ins Deutsche übersetzt von Karsten Schulz