O’REILLY®
Beijing • Cambridge • Farnham • Köln • Sebastopol • Taipei • Tokyo
Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen.
Alle Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt und sind möglicherweise eingetragene Warenzeichen. Der Verlag richtet sich im Wesentlichen nach den Schreibweisen der Hersteller. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
Kommentare und Fragen können Sie gerne an uns richten:
O’Reilly Verlag
Balthasarstr. 81
50670 Köln
E-Mail: kommentar@oreilly.de
Copyright:
© 2014 by O’Reilly Verlag GmbH & Co. KG
Die Darstellung eines Tigers im Zusammenhang mit dem
Thema Java ist ein Warenzeichen von O’Reilly Media, Inc.
Bibliografische Information Der Deutschen Bibliothek
Die Deutsche Bibliothek verzeichnet diese Publikation in der
Deutschen Nationalbibliografie; detaillierte bibliografische Daten
sind im Internet über http://dnb.ddb.de abrufbar.
Lektorat: Alexandra Follenius, Köln
Korrektorat: Sibylle Feldmann, Düsseldorf
Satz: Tung Huynh, Reemers Publishing Services GmbH, Krefeld; www.reemers.de
Umschlaggestaltung: Michael Oreal, Köln
Produktion: Andrea Miß, Köln
Belichtung, Druck und buchbinderische Verarbeitung:
Druckerei Kösel, Krugzell; www.koeselbuch.de
ISBN 978-3-95561-540-6
Dieses Buch ist auf 100% chlorfrei gebleichtem Papier gedruckt.
Einleitung
Teil I: Einstieg
1 Java war früher eine Eiche
2 Einführung für Programmieranfänger
Die Ansprüche sind gestiegen
Vom Maschinencode zu den höheren Programmiersprachen
Die strukturierte Programmierung
Die objektorientierte Programmierung
Noch Fragen?
3 Das erste Programm
Programmerstellung in Java
Installation des JDK
Welche Art Programm darf es sein?
Konsolenanwendungen
Klassen, Pakete und die Standardbibliothek
4 Java-Stilkonventionen
5 Workshop: Programmierwerkzeuge
Lernen Sie Ihre Programmierwerkzeuge kennen
Teil II: Java-Grundlagen
6 Variablen
Definition
Verwendung
Gültigkeitsbereiche
Literale und Konstanten
Ein- und Ausgabe
Übungen
7 Datentypen
Die elementaren Datentypen
Die komplexen Datentypen
Die Klasse String
Typumwandlung
Wrapper-Klassen
Übungen
8 Operatoren und Ausdrücke
Allgemeines
Operationen auf allen Datentypen
Operationen auf numerischen Datentypen
Operationen auf booleschen Typen
Operationen auf Strings
Operationen auf Referenztypen
Sonstige Operatoren
Reihenfolge der Ausdrucksauswertung
Nebeneffekte
Übungen
9 Kontrollstrukturen
Entscheidungen und Bedingungen
Verzweigungen
Schleifen
Sprunganweisungen
Fallstricke
Übungen
10 Workshop: Mastermind
Eine Mastermind-Adaption
Teil III: Objektorientierte Programmierung
11 Klassen und Objekte
Die Klassendefinition
Felder
Methoden
Der Konstruktor
Zugriffsspezifizierer
Klassendesign
Übungen
12 Arrays und Aufzählungen (enum)
Definition und Erzeugung
Auf Array-Elemente zugreifen
Programmieren mit Arrays
Mehrdimensionale Arrays
Aufzählungen (enum)
Übungen
13 Pakete, Gültigkeitsbereiche und andere Fragen
Pakete
Gültigkeitsbereiche und Lebensdauer
Blöcke, lokale Variablen und »Definitive Assignment«
Innere Klassen
Repräsentation von Daten
Speicherbereiche
Übungen
14 Workshop: Mastermind-Verbesserung
Codeverbesserung durch Reorganisation
Teil IV: Fortgeschrittene objektorientierte Programmierung
15 Vererbung und Komposition
Das Prinzip der Vererbung
Wie greift man auf geerbte Elemente zu?
Wie initialisiert man geerbte Elemente?
Verdecken, überschreiben und überladen
Vererbung und objektorientiertes Design
Übungen
16 Polymorphie und generische Programmierung
Polymorphe Variablen
Polymorphe Methoden
Generische Programmierung
Java Generics
Übungen
17 Abstrakte Klassen und Schnittstellen (Interfaces)
Abstrakte Klassen
Schnittstellen
Übungen
18 Fehlerbehandlung mit Exceptions
Möglichkeiten der Fehlerbehandlung
Exceptions abfangen
Exceptions weiterleiten
Exceptions werfen
Eigene Exceptions definieren
Programmfluss und Exception-Behandlung
Übungen
19 Programmieren mit Objekten
Objekte auf Konsole ausgeben
Objekte kopieren
Objekte vergleichen
Objekte befragen mit Reflection
Übungen
20 Workshop: Überarbeitung einer Klassenhierarchie
Die Vorgabe
1. Schritt – Umwandlung in eine Klassenhierarchie
2. Schritt – Absicherung gegen falschen Gebrauch
Teil V: Weiterführende und ergänzende Techniken
21 Strings
Was ist ein String?
String-Literale
Strings sind unveränderlich
Pooling
Zeichensätze und Kodierungen
Die Klassen StringBuilder und StringBuffer
Die Klasse StringTokenizer
String-Vergleiche mit regulären Ausdrücken
22 Zeit, Datum und System
Datum und Zeit
Runtime und Process
System
Zeitgeber
23 Container (Collections)
Programmieren mit Containern
Listen (List)
Mengen (Set)
Warteschlangen (Queue)
Wörterbücher (Map)
Iteratoren und for-Schleife
Suchen und Sortieren
24 Ein- und Ausgabe II
Dateien und Verzeichnisse
Altlasten: Dateien und Verzeichnisse bis Java 6
Ein- und Ausgabestreams
Formatieren und Scannen
Verbesserte Konsolenunterstützung
25 Lambda-Ausdrücke
Funktionale Schnittstellen und Lambda-Ausdrücke
Das Paket java.util.function
Variablenzugriff im Lambda-Ausdruck
Methodenreferenzen
Default-Methoden
Collections-Erweiterungen
Massendatenverarbeitung: Streams
26 Annotationen
Vordefinierte Annotationen
Selbst definierte Annotationen
27 Workshop: Kellerautomat
Klammerung und Kellerautomat
Die Datenstruktur
Die Verarbeitungslogik
Teil VI: GUI-Programmierung
28 Grafische Benutzeroberflächen – erster Einstieg
Die Grundpfeiler: AWT und JFC/Swing
Ein Grundgerüst für Benutzeroberflächen mit Swing
29 Benutzeroberflächen
Model-View-Controller
Das Hauptfenster (JFrame)
Komponenten anordnen: Layout-Manager
Ereignisse behandeln
Austauschbares Erscheinungsbild (Look & Feel)
Swing-Beispielprogramm
30 Komponenten (Steuerelemente)
Component und JComponent
Beschriftungsfelder – JLabel
Schaltflächen, Kontrollkästchen und Optionsfelder
Listenfelder – JList
Kombinationsfelder (JComboBox)
Fortschrittsanzeige – JProgressBar
JScrollPane
Baum- und Tabellendarstellung
31 Menüs
Erstellen von Menüs
Tastaturkürzel
Symbolleisten
Die Zwischenablage
32 Dialogfenster
Standarddialoge
Eigene Dialoge mit JDialog
Modale und nicht modale Dialoge
33 Grafik
Grafikgrundlagen
Praxis der Grafikprogrammierung
Bilder und Bilddateien
34 Textverarbeitung
Grundlagen
Einzeilige Textfelder
Texteditierung mit JTextArea
35 Drucken und Drag & Drop
Drag & Drop
36 Sound
Die Java-Sound-API
37 Workshop: Java-Millionenquiz
Aufbau und Erstellung
Das Programm (Millionenspiel.java)
Das Hauptfenster (Hauptfenster.java)
Die Spielsteuerung (Spiellogik.java)
Teil VII: Spezielle Programmiergebiete und Methodik
38 Datenbankzugriffe mit JDBC
Datenbankgrundlagen
MySQL-Datenbank anlegen
Datenbankverbindung aufbauen
SQL-Abfragen durchführen
Java-DB
39 Thread-Programmierung
Einführung
Threads
Synchronisierung
Threads und Swing
Threads und Collections
40 HTTP-Verbindungen (WWW)
Uniform Resource Locator (URL)
URL mit Sonderzeichen: x-www-form-urlencoded
41 Praxis des Programmierens
Der Softwareentwicklungszyklus
Fallbeispiel – Temperaturregelung
Iterative und rekursive Algorithmen
Entwurfsmuster (Design Patterns)
Automatisierte Tests
Logging
Teil VIII: Bonus-Teil – Android-Programmierung
42 Einführung in die App-Erstellung
Die Dalvik-Maschine und die Android-Architektur
App-Besonderheiten
Der App-Lebenszyklus
43 Installation und erste App
Download und Installation
Die erste App
Die App im Emulator testen
Die App auf dem Smartphone testen
44 Aufbau von Benutzeroberflächen
Benutzeroberfläche
Ressourcenmodell
App-Symbol
Der Intent-Mechanismus
Grafik
45 Google Play
Die App vorbereiten
Digitales Signieren
Die App exportieren und signieren
Bei Google Play registrieren
App hochladen
46 Workshop: Das Millionenquiz als App
Die Activity (QuizActivity.java)
Die Fragen (Frage.java)
Die Spielsteuerung (Spiellogik.java)
Der Abschlussbildschirm (AbschlussActivity.java)
Index
Teil IX: Anhänge – Auf der Website zum Buch
A Lösungen zu den Übungen
B Die Java-Tools
C Anwendungen weitergeben
D Installation von MySQL
E Zahlensysteme
F Tabellen
Die Programmiersprache Java liegt mittlerweile in der achten Version vor und hat nach einigen stürmischen Anfangsjahren nun einen hohen Grad an Stabilität, Performanz und Funktionalität erreicht. Es ist daher auch nicht verwunderlich, dass Java mittlerweile neben – oder sollte man sagen vor – C++ und C# die wichtigste Programmiersprache für Neuentwicklungen von kommerziellen Softwareprodukten ist und sich auch im Hochschulbereich sowie in der Abteilung Hobby und Freizeit großer Beliebtheit erfreut. Und der Trend setzt sich fort: Google hat Java als Programmiersprache für seine Android-Apps (für Smartphones mit Android-Betriebssystem) auserwählt und Java damit einen weiteren riesigen Boom beschert (Grund genug für uns, einen eigenen App-Teil in das Buch aufzunehmen.)
Vor diesem Hintergrund versteht sich das vorliegende Buch als ein Lehr- und Standardwerk zur Programmierung mit Java, das sich vornehmlich an Studenten und engagierte Einsteiger wendet, sich aber auch sehr gut für fortgeschrittene Leser und Umsteiger von anderen Sprachen eignet.
Studenten – oder ganz allgemein Einsteiger, die die Java-Programmierung zwar mit Spaß, aber auch mit einer gewissen Ernsthaftigkeit betreiben möchten – werden neben den umfassenden und klar verständlichen Ausführungen vor allem die vielen Erläuterungen und Hintergrundinformationen, die Einblicke in Alltag und Methodik des Programmierens und die Einführungen in die speziellen Programmiergebiete (inklusive Android) schätzen.
Umsteiger und fortgeschrittene Leser können sich mit dem Buch weiterbilden und es (auch mithilfe des ausführlichen Index) als zuverlässiges Nachschlagewerk nutzen.
Vorkenntnisse werden keine vorausgesetzt. Für Leser, die noch über keinerlei Programmierkenntnisse verfügen, gibt es im ersten Teil eine Schnelleinführung in die wichtigsten Programmierkonzepte, verknüpft mit einem Rückblick auf die Entwicklung der modernen Programmiersprachen.
Die neueste Version der Sprache, Java 8, hat vor allem viele interne Verbesserungen und Bugfixes gebracht. Daneben gab es aber auch einige größere und kleinere Erweiterungen der Sprache und der angebotenen Bibliotheken, von denen wir folgende in das Buch aufgenommen haben:
Tabelle 0-1: Behandelte Neuerungen von Java 8
Neuerungen in der Sprache |
Beschrieben in Kapitel |
Lambda-Ausdrücke |
Kapitel 25 |
Neuerungen in den Java-Bibliotheken |
Beschrieben in Kapitel |
Neue API für Datums- und Zeitangaben |
Abschnitt »Datum und Zeit« auf Seite 454 |
Das vorliegende Buch ist in mehrere Teile gegliedert, von denen sich die ersten vier vornehmlich auf die reine Java-Syntax konzentrieren, während sich die nachfolgenden Teile mit den Java-Bibliotheken, diversen weiterführenden Programmierthemen sowie der Praxis des Programmierens beschäftigen.
Teil I ist Ihr Einstieg in die Programmierung im Allgemeinen und Java im Besonderen. Wer möchte, kann sich in Kapitel 1 ein wenig über die Entstehung und Geschichte von Java informieren. In Kapitel 2 geht es dann noch weiter zurück, und wir vollziehen im Schnelldurchgang die Entwicklungen nach, die zu den modernen Programmiersprachen Java, C++ und C# geführt haben. Das Hauptaugenmerk gilt dabei allerdings weniger der Historie als vielmehr den grundlegenden Programmierkonzepten, daher ist dieses Kapitel für diejenigen Leser, die noch über keinerlei Programmiererfahrung verfügen, ein absolutes Muss. In Kapitel 3 lernen Sie dann die Programmierwerkzeuge des Java-SDK kennen und erstellen Ihr erstes eigenes Programm. In Kapitel 4 stellen wir Ihnen vorab die in Java üblichen Stilkonventionen vor.
Teil II befasst sich mit grundlegenden Sprachelementen, die man heute in fast allen strukturierten Programmiersprachen wiederfindet: von den Variablen bis zu den Kontrollstrukturen.
In Teil III befassen wir uns erstmals ernsthafter mit der objektorientierten Programmierung, d. h., wir werden Objekte nicht mehr nur verwenden, sondern untersuchen, wie man eigene Klassen zur Erzeugung von Objekten schreibt. Daneben stellen wir Ihnen in Kapitel 12 noch zwei weitere grundlegende Datentypen vor, Arrays und Aufzählungen, die in Java eng mit dem Java-Konzept verknüpft sind, und schließen mit Kapitel 13 die Grundlagen ab.
Teil IV ist den weiterführenden Konzepten der objektorientierten Programmierung gewidmet: Vererbung, Polymorphie, Schnittstellen (Interfaces), Exceptions und weiterführenden Aspekten der Programmierung mit Objekten.
Teil V nimmt Sie mit auf einen Streifzug durch die wichtigsten Utility-Klassen der Java-Bibliothek. Hier werden neben Datum, Zeit, Systemumgebung usw. auch so wichtige Themen wie Strings, Collections sowie Ein- und Ausgabe ausführlich behandelt. Darüber hinaus gibt es noch ein Kapitel zur funktionalen Programmierung mittels Lambda-Ausdrücken (Kapitel 25) und der Verwendung von Annotationen (Kapitel 26).
Teil VI behandelt die Erstellung von Anwendungen mit grafischen Benutzeroberflächen (GUI). Neben den reinen Grundlagen werden hier auch weiterführende Aspekte wie das Drucken, Drag & Drop, Grafik sowie die Verwendung von JTree und JTable angesprochen.
Teil VII behandelt weiterführende Programmiergebiete – etwa wie Sie von einem Java-Programm aus auf eine Datenbank zugreifen (Kapitel 38), wie Sie Programmcode mittels Threads parallel ausführen (Kapitel 39) oder wie Sie Webseitentext laden (Kapitel 40). Besonders interessant für Studenten dürfte auch Kapitel 41 sein, das sich etwas ausführlicher mit der Praxis und Methodik des Programmierens beschäftigt.
Teil VIII ist denjenigen Lesern gewidmet, die ihre Java-Kenntnisse auch zur Entwicklung von Android-Apps nutzen möchten.
Ergänzt wird das Buch durch umfangreiche Anhänge, die Sie sich von der Website zum Buch (siehe Hinweis weiter unten) herunterladen können.
Bücher, die sich um eine möglichst vollständige Darstellung der Java-Syntax und der Java-Bibliotheken bemühen, haben üblicherweise mit dem Problem zu kämpfen, dass sie als Lehrbücher oder gar zum Selbststudium meist nur sehr bedingt geeignet sind. Umgekehrt behandeln einführende Programmierlehrbücher meist nur einen Bruchteil der Möglichkeiten, die Java und seine Standardbibliothek bieten.
Wir erheben keineswegs den Anspruch auf Lösung dieses Dilemmas, hoffen aber, ein vernünftiges Konzept gefunden zu haben, das dem Leser beides bieten kann: ein verständliches Lehrbuch und ein gutes Nachschlagewerk.
So werden Sie in diesem Buch kaum Stellen finden, an denen Syntaxelemente oder Klassen vorgestellt werden, ohne dass nicht auch etwas über die Bedeutung oder die sinnvolle Verwendung dieser Elemente gesagt wird. Zudem nehmen wir uns immer wieder Zeit, Hintergründe zu erläutern, praktische Beispiele an die Hand zu geben oder den Blick vom Detail auf das übergeordnete Ganze zu richten. Übungen und Workshops helfen, das Gelernte zu vertiefen und praktische Erfahrungen zu sammeln, und in Teil VII gibt es dann noch ein eigenes Kapitel zur Praxis des Programmierens.
Dafür mussten wir uns bei der Vorstellung der weiterführenden Programmierthemen auf einige herausragende Gebiete konzentrieren – was uns allerdings nicht als großes Manko erscheint, da Leser, die ein Niveau erreicht haben, auf dem diese Informationen für sie interessant werden, meist gut dazu in der Lage sind, sich über die sehr ausführliche und hilfreiche Java-API-Dokumentation bzw. die entsprechende Fachliteratur und diverse Internetforen informieren zu können. Neben einer kurzen Einführung in die HTTP-Programmierung haben wir uns daher auf die Datenbankprogrammierung (einen Klassiker), die Android-Programmierung (eines der am stärksten boomenden Anwendungsgebiete) und die Thread-Programmierung (weil unabdingbar für viele professionelle Anwendungen und wichtig auch für viele Android-Apps) konzentriert.
Wenn Sie noch über keinerlei Programmiererfahrung verfügen, lesen Sie unbedingt zuerst die Einführung für Programmieranfänger (Kapitel 2). Ansonsten können Sie je nach Wissensstand auch mit Kapitel 3 oder 4 ff. beginnen. (Sie können aber natürlich trotzdem einen Blick in Kapitel 2 werfen; es dürfte wegen seines historischen Rückblicks auch für den einen oder anderen Leser mit Vorkenntnissen interessant sein.)
In den ersten Teilen, die sich mit der Java-Syntax befassen, gibt es am Ende jeden Kapitels einen Übungsteil. Versuchen Sie nicht, dem Drang nachzugeben, diese Übungen nur grob zu überfliegen oder ganz zu übergehen. Die Übungen sind in der Regel gut machbar,1 da wir sie weniger als geistige Herausforderung sehen, sondern vielmehr als Möglichkeit, das Gelernte zu rekapitulieren und praktisch einzuüben.
Besonders stolz sind wir auf die Workshops, die es am Ende fast jedes Buchteils gibt. In diesen Workshops können Sie uns bei der Programmierung über die Schulter schauen oder mit uns zusammen ein etwas größeres Projekt angehen (beispielsweise ein eigenes Mastermind-Spiel oder ein Millionen-Quiz).
Wie man ein Buch als Nachschlagewerk verwendet, muss wohl kaum erklärt werden. Wir beschränken uns hier daher darauf, auf das Inhaltsverzeichnis, die Querverweise im Text, die zahlreichen Methodentabellen in den hinteren Kapiteln und den umfangreichen Index zu verweisen. (Beachten Sie im Index unteren anderem die Obereinträge API und Softwareentwicklung.)
Dieses Buch verwendet die folgenden typografischen Konventionen:
Kursiv
Wird für wichtige Begriffe, Programm- und Dateinamen, URLs, Ordner und Verzeichnispfade, Menüs, Optionen und zur Hervorhebung verwendet.
Nichtproportionalschrift
Wird für Programmcodes verwendet.
Tipp
Dieses Symbol kennzeichnet einen Praxistipp – denn Manches geht ganz leicht, wenn man nur weiß, wie.
Hinweis
Die so gekennzeichneten Hinweise enthalten Informationen von besonderer Bedeutung, die es verdienen, hervorgehoben zu werden.
Warnung
Mit diesem Symbol werden Sie vor Besonderheiten gewarnt, die zu Problemen führen oder ein Risiko darstellen können.
Dieses Buch ist dazu gedacht, Ihnen bei der Erledigung Ihrer Arbeit zu helfen. Im Allgemeinen dürfen Sie den Code in diesem Buch in Ihren eigenen Programmen oder Dokumentationen verwenden. Solange Sie den Code nicht in großem Umfang reproduzieren, brauchen Sie uns nicht um Erlaubnis zu bitten. Zum Beispiel benötigen Sie nicht unsere Erlaubnis, wenn Sie ein Programm unter Zuhilfenahme mehrerer Codestücke aus diesem Buch schreiben. Wenn Sie allerdings einen Datenträger mit Beispielen aus O’Reilly-Büchern verkaufen oder vertreiben wollten, müssten Sie eine Genehmigung von uns einholen. Eine Frage mit einem Zitat oder einem Codebeispiel aus dem Buch zu beantworten, erfordert keine Genehmigung. Signifikante Teile von Beispielcode aus dem Buch für die eigene Produktdokumentation zu verwerten, ist dagegen genehmigungspflichtig.
Wir freuen uns über eine Quellenangabe, verlangen sie aber nicht unbedingt. Zu einer Quellenangabe gehören normalerweise Autor, Titel, Verlagsangabe, Veröffentlichungsjahr und ISBN, hier also: »Dirk Louis & Peter Müller, Java – Der umfassende Programmierkurs, O’Reilly Verlag 2014, ISBN 978-3-95561-540-6«. Sollten Sie das Gefühl haben, Ihre Verwendung der Codebeispiele könnte gegen das Fairnessprinzip oder die Genehmigungspflicht verstoßen, dann nehmen Sie bitte unter kommentar@oreilly.de Kontakt mit uns auf.
Wir haben eine Webseite zu diesem Buch eingerichtet, auf der die Codebeispiele, Errata und zusätzliche Informationen veröffentlicht werden. Sie finden die Seite unter:
www.oreilly.de/catalog/pwjava8ger/
Zusatzinformationen finden Sie auch auf der Website der Autoren:
www.carpelibrum.de
Das vorliegende Buch wird durch umfangreiche Anhänge ergänzt, die Sie sich als PDF von der oben genannten O’Reilly-Website zum Buch herunterladen können. Hier finden Sie auch die Lösungen zu den Übungen.
Bitte richten Sie Anfragen und Kommentare zu diesem Buch an den Verlag:
O’Reilly Verlag GmbH & Co. KG
Balthasarstraße 81
50670 Köln
Tel.: +49(0)221-973160-0
Fax: +49(0)221-973160-8
Kommentare oder technische Fragen zu diesem Buch schicken Sie bitte per E-Mail an:
kommentar@oreilly.de
Weitere Informationen zum gesamten Angebot des O’Reilly Verlags finden Sie auf unserer Website: http://www.oreilly.de.
Wir sind auf Facebook: facebook.com/oreilly.de (https://www.facebook.com/oreilly.de)
Folgen Sie uns auf Twitter: twitter.com/OReilly_Verlag/ (https://twitter.com/OReilly_Verlag)
Unsere Google+-Seite: http://bit.ly/googleplus_oreillyverlag
Viel Erfolg und Spaß mit Java wünschen Ihnen die Autoren!
Dirk Louis (autoren@carpelibrum.de)
Peter Müller (leserfragen@gmx.de)
Einstieg
Java war früher eine Eiche
Die Geschichte Javas – nicht die der Insel Java, sondern die der Programmiersprache Java – ist recht bewegt, und wir wollen zur Einstimmung mit einem kurzen Rückblick auf seine Entstehung beginnen.
1990 war Sun Microsystems auf der Suche nach einem neuen Betätigungsfeld. Das Kern-geschäft mit Workstations1 und Servern lief zwar gut, doch die Konkurrenz des PCs, der immer leistungsfähiger, günstiger und anwenderfreundlicher wurde, war bereits zu spüren. Um langfristig nicht ins Abseits zu geraten, wurde ein Team zusammengestellt, das eruieren sollte, welche die nächsten großen Trends in der Computertechnologie sein könnten. Die streng geheime Untersuchung, die unter dem Namen »Green«-Projekt geführt wurde, kam bald zu dem Ergebnis, dass einer der bedeutendsten Trends die zunehmende Ausstattung von elektronischen Gebrauchsgeräten mit Mikroprozessoren und deren Anbindung an das Internet sei. Ein Trend, der den PC, dieses »Abfallprodukt« der Computerentwicklung, dieses Artefakt im privaten Heim, vollkommen überflüssig machen könnte.
Die Mitarbeiter des Green-Projekts gingen nun daran, ein Produkt zu kreieren, das dem prognostizierten Trend nicht nur entsprechen, sondern selbst zum Trendsetter werden sollte: Star7, ein PDA mit Touchscreen, drahtloser Netzanbindung, PCMCIA-Schnittstelle, eigener Unix-Version, einer kleinen animierten Figur namens Duke (siehe Abbildung), die dem Anwender bei der Bedienung des Geräts Hilfestellung leisten sollte, und ... einer eigenen, plattformunabhängigen, robusten, objektorientierten Programmiersprache namens Oak2.
Star7 wurde firmenintern gut aufgenommen, doch nachfolgende Versuche, das Produkt zur Marktreife zu führen, scheiterten. Sun war seiner Zeit einfach zu weit voraus. Das Projekt, für das noch 1992 eine eigene Firma, First Person Inc., gegründet wurde, zerfiel, die Mitarbeiter zerstreuten sich.
Mittlerweile hatte sich im Internet einiges getan. 1993 wurde am Cern-Institut in Lausanne das World Wide Web, das »Netz im Netz«, ins Leben gerufen. Noch im gleichen Jahr entwickelte man am NCSA3 den ersten grafischen Webbrowser, den Mosaic-Browser, an dem auch der Student Marc Andreessen mitarbeitete, der ein Jahr später Netscape gründen und den legendären Netscape Navigator auf den Markt bringen sollte.
Bei Sun hatte man derweil die Entwicklung des World Wide Web und der Browser aufmerksam verfolgt. Aus Sicht von Sun stellte sich die Situation in etwa wie folgt dar: Auf der einen Seite gab es eine schnell wachsende Gemeinde von Internetanwendern, die das Web nutzten und freudig jede Entwicklung begrüßten, die es gestattete, Webseiten lebendiger und interaktiver zu gestalten. Auf der anderen Seite hatte man bei Sun eine leistungsfähige, plattformunabhängige Programmiersprache namens Oak, für die es derzeit keine rechte Verwendung gab, sowie erste Ergebnisse aus einem Projekt, das Sun zum Teil mitfinanziert hatte und das sich mit der Entwicklung einer »virtuellen Maschine« beschäftigte, die es Programmierern ermöglichen würde, ihre Anwendungen auf unterschiedlichen Architekturen und Betriebssystemen auszuführen.
Wie wäre es nun, wenn man die virtuelle Maschine in einen Browser integrieren und Oak so weiterentwickeln würde, dass Oak-Programme innerhalb dieses Browsers auf beliebigen Plattformen ausgeführt werden könnten? Browser und Programmiersprache könnte man frei im Internet zur Verfügung stellen, um einen neuen Standard zu setzen und später mit Lizenzierungen Gewinn zu erwirtschaften. Darüber hinaus würde man die Attraktivität des Internets erhöhen, was zweifelsohne wiederum den Verkaufszahlen der eigenen Workstations und Server zugutekäme, die sich durch hochwertige Netzwerktechnik und beste Vernetzbarkeit auszeichneten. Und vielleicht liebäugelte man auch schon mit der Idee des Internet-PCs, der keine Festplatte haben und seine Anwendungen aus dem Internet beziehen sollte – sozusagen ein früher Vorfahr der Cloud-Technologie.
Ein neues Team wurde zusammengestellt, dem auch James Gosling wieder angehörte. Aus Oak wurde Java (der Name »Oak« wurde bereits von einer anderen Firma für eines ihrer Produkte verwendet, und so einigte man sich in der Cafeteria, bei viel heißem Kaffee, auf den Namen Java), und 1995 wurde der erste Java-fähige Browser, HotJava, vorgestellt. Gleichzeitig kündigte Netscape-Chef Andreessen an, dass er Java für seinen Navigator, den damals unumstrittenen Marktbeherrscher, lizenzieren wird. Im Januar 1996 wurde das JDK 1.0, die erste Version der Java-Entwicklungstools, zum Download im Internet freigegeben. Der Ansturm auf das JDK war gewaltig, und es glich geradezu einem Wunder, dass der Server nicht zusammenbrach. Aber schließlich gehörte Sun ja schon immer zu den führenden Anbietern von High-End-Servern.
Doch nicht überall wurde Java mit Euphorie und Wohlwollen begrüßt, so zum Beispiel im Hause Microsoft.
Gerade hatten Gates und Microsoft es geschafft, den ungeliebten Konkurrenten DR DOS durch – so jedenfalls die Vorwürfe des Konkurrenten – absichtlich täuschende Produktvorankündigungen, unlautere Lizenzierungsverfahren, schwarze Listen für Betatester und versteckte Inkompatibilitäten, die verhinderten, dass Windows 3.x zusammen mit DR DOS lief, aus dem Markt zu drängen4, als man erkennen musste, dass man die Entwicklung des Internets verschlafen und seine Bedeutung und Bedrohung unterschätzt hatte.
Einmal erwacht, ging Microsoft in die Gegenoffensive: mit eigenem Internetportal (MSDN), eigener Webserversoftware (IIS usw.) und eigenem Webbrowser – dem Internet Explorer. Anfangs versuchte Microsoft, Java zu ignorieren, doch man erkannte bald, dass es ohne Java-Unterstützung schwierig würde, gegenüber dem Netscape-Browser Marktanteile zu gewinnen. Netscape vertrieb seinen Browser praktisch kostenfrei – lediglich gegen Entrichtung einer Registrierungsgebühr – und setzte darauf, dass sich die Popularität des Navigator indirekt auszahlen würde, beispielsweise durch erhöhte Absatzzahlen der Netscape-Serversoftware – ein Konzept, das anfangs bestens aufging.
Microsoft konterte, indem es Java lizenzierte, den Internet Explorer aufrüstete und ihn ganz offiziell kostenlos im Internet zum Download anbot. Ja, Microsoft belohnte sogar Firmen, die zur weiteren Verbreitung des Internet Explorer beitrugen. Einmal in Schwung gekommen, stellte Microsoft dann auch noch seine Serversoftware kostenlos zur Verfügung – ein Schritt, der Netscape besonders empfindlich traf. Der letzte Coup bestand darin, den Internet Explorer zusammen mit dem Betriebssystem Windows 98 auszuliefern. Dies brach dem Navigator endgültig das Genick und brachte Microsoft eine folgenschwere Klage vor Gericht ein. Wieder einmal wurden die US-Justiz auf Microsofts Geschäftsgebaren aufmerksam, und es kam zum zweiten Antitrust Case »United States v. Microsoft«, bei dem es um die Monopolstellung Microsofts ging.
Zurück zu Java. Der Browserkrieg war kaum in Gang gekommen, da eröffnete Microsoft eine zweite Front und wandte sich Java zu.
Das erste Geschoss, das Gates auf Java abfeuerte, trug die Aufschrift ActiveX und erwies sich als wenig durchschlagskräftig. ActiveX war keine eigene Programmiersprache, sondern lediglich eine Technologie zur Erstellung von Softwarekomponenten, die in Webseiten und Programme eingebettet werden konnten – vornehmlich also Konkurrenz für die beiden Java-Technologien der Java-Applets und der JavaBeans. Im Vergleich zu diesen war ActiveX jedoch kompliziert zu programmieren, plattformgebunden und unsicher in der Verwendung (zumindest für den unbedarften Websurfer, der sich ActiveX-Elemente aus Webseiten auf seine lokale Festplatte lud).
Microsofts zweites Geschoss war schon gewichtiger. Zuerst lancierte Microsoft die integrierte Entwicklungsumgebung Visual J++ für Java, dann stattete es diese Umgebung mit einer eigenen Java Virtual Machine5 aus. Microsoft rechtfertigte dies damit, dass die eigene Virtual Machine besser sei als die Sun-Machine und man seinen Kunden nur das Beste bieten wolle. Sun sah darin einen Versuch, den Java-Standard aufzuweichen und eine zweite zum Sun-Standard inkompatible Java-Laufzeitumgebung zu etablieren. Um die Integrität der Java-Plattform zu erhalten, strengte Sun eine Gerichtsklage an. Der Prozess verlief gut für Sun, und im Januar 2001 konnte man Microsoft einen außergerichtlichen Frieden diktieren. Microsoft durfte weiter die Sun-Java-Technologie lizenzieren und unverändert verwenden, musste aber die Weiterentwicklung seiner eigenen Microsoft Virtual Machine aufgeben und die Auslieferung bis zum Jahr 2004 gänzlich einstellen.
Die eigene Java Virtual Machine war Microsoft untersagt worden, doch den Konzern traf dies nur marginal – arbeitete man doch bereits an einer neuen Virtual Machine, diesmal nicht für Java, sondern für eine eigene Programmiersprache: C#.
C# ist Java sehr ähnlich, und ebenso wie Java-Code wird C#-Code nicht in maschinenspezifische Befehle, sondern in virtuellen Objektcode übersetzt. Wenn ein C#-Programm gestartet wird, lädt die Virtual Machine (die Laufzeitumgebung) den Objektcode, wandelt ihn in maschinenspezifischen Code um und führt ihn aus.
Die »Virtual Machine« für C# heißt .NET Framework. Ähnlich wie die Java Virtual Machine besteht das .NET Framework in der Hauptsache aus Werkzeugen zum Ausführen der Programme (Interpreter, Garbage Collector usw.) sowie einer umfangreichen Klassenbibliothek, auf die der Programmierer beim Schreiben seiner Programme zurückgreifen kann.
Im Gegensatz zur Java Machine unterstützt das .NET Framework jedoch nicht nur eine, sondern eine Vielzahl von Programmiersprachen. Welche Sprachen unterstützt werden? Alle Sprachen, für die ein .NET-Compiler verfügbar ist, der den Quelltext in den virtuellen Objektcode des Frameworks übersetzt. Gehört Java auch zu diesen Sprachen? Nein, nicht soweit uns bekannt ist. Microsoft stellt aber Programme zur Verfügung, mit denen Java-Quelltext in C#-Code umgewandelt werden kann. Ist es sinnvoll, seine Java-Programme in C++-Programme umzuwandeln? Nur wenn Sie von Java auf C# umsteigen möchten.
Und sollte man auf C# umsteigen? Ist C# besser als Java? Wird C# Java verdrängen?
C# und .NET sind zweifelsohne eine starke Konkurrenz zu Java, doch sie werden Java nicht verdrängen. Beide, Java wie C#, haben ihre Vorzüge und auch ihre Nachteile, Stärken wie Schwächen, und beide werden sich im Konkurrenzkampf weiterentwickeln und reifen.
Die Programmiersprache Java ist im Grunde genommen nichts weiter als eine technische Spezifikation, die beschreibt, wie Java-Code aussehen soll. Lebendig wird diese Spezifikation erst durch eine Entwicklungsumgebung, das JDK, das dem Programmierer die Mittel an die Hand gibt, um in Java geschriebene Quelltexte in lauffähige Java-Programme umzuwandeln.
Früher oblagen Pflege und Weiterentwicklung der Sprache Java und des zugehörigen JDK ganz der Firma Sun Microsystems, in deren Auftrag die Sprache Java überhaupt erst entwickelt wurde. Doch Sun hat sich mittlerweile aus diesem Aufgabenbereich weitestgehend zurückgezogen. Bereits 2006 begann man mit der Umwandlung des JDK in ein Open Source-Projekt, wenige Jahre später wurden dann die weiteren Rechte an Java an die Firma Oracle verkauft.
Seitdem gibt es zwei wichtige Referenzimplementierungen: das OpenJDK und das Oracle JDK.
Oracle hat zugesichert, das OpenJDK weiter zu unterstützen, sodass derzeit nicht zu befürchten ist, dass die JDK-Versionen stark auseinanderdriften werden. Zudem wird das JDK für Java SE derzeit von Oracle weiter kostenfrei zum Download angeboten und darf im Rahmen der Lizenzbedingungen genutzt werden. Lediglich für diverse kommerzielle Zusatzkomponenten, die optional hinzugenommen werden können, sind Lizenzgebühren zu bezahlen.
Solange dies so bleibt, empfehlen wir die Arbeit mit dem Oracle JDK. Sofern Sie aber mit einem Betriebssystem arbeiten, auf dem eine passende Version des OpenJDK bereits vorinstalliert ist, können Sie diese natürlich ebenfalls verwenden.
Einführung für Programmieranfänger
In diesem Kapitel:
• Die Ansprüche sind gestiegen
• Vom Maschinencode zu den höheren Programmiersprachen
• Die strukturierte Programmierung
• Die objektorientierte Programmierung
• Noch Fragen?
Dieses Kapitel ist für Programmierneulinge gedacht und führt anhand theoretischer Gedankenspiele und -modelle in die Grundprinzipien der Programmierung ein. Da es gleichzeitig nebenbei auch ein wenig die Entwicklungsgeschichte der modernen Programmiersprachen resümiert, dürfte es aber durchaus auch für den einen oder anderen fortgeschrittenen Leser ganz interessant sein.
Auf jeden Fall ist es ein bisschen theorielastig und aufgrund der vielen eingeführten Begriffe und Konzepte für blutige Anfänger sicherlich nicht immer leicht zu verdauen. Trotzdem kann man Einsteigern, die sich ernsthaft mit Programmierung befassen möchten, die Lektüre nur empfehlen.
Wer lieber gleich in medias res gehen möchte, der darf aber natürlich auch direkt zu Kapitel 3 springen.
Java ist eine wunderbare Programmiersprache. Sie ist modern, leistungsfähig, vielseitig, in gewisser Weise sogar ästhetisch ... Eines ist sie jedoch ganz bestimmt nicht: leicht zu erlernen. Nun, das allein wäre ja noch gar nicht mal so schlimm – schließlich erwartet ja niemand, dass eine so mächtige Sprache von einem Tag auf den anderen zu meistern ist. Während sich der hoffnungsvolle Novize jedoch in die meisten anderen Sprachen Schritt für Schritt einarbeiten kann, muss er sich in Java gleich zu Beginn mit einer Vielzahl sehr komplizierter Konzepte auseinandersetzen.
So besteht bereits das einfachste Programm, das in Java geschrieben werden kann, aus mindestens vier Zeilen, vollgepackt mit kryptischem Code:
public class Programm {
public static void main(String[] args) {
System.out.println("Hallo Anwender!");
}
}
Das gleiche Programm, das übrigens nichts anderes macht, als den Benutzer mit einem freundlichen »Hallo« auf der Konsole zu begrüßen, hätte ein Basic-Programmierer Anfang der Neunziger wie folgt geschrieben:
print "Hallo Anwender!"
Die erste Hürde liegt für den Java-Programmierer also extrem hoch, sodass ihm letzten Endes nur drei Möglichkeiten bleiben:
1. Er läuft unter der Hürde durch, d. h., er akzeptiert die ihm nicht verständlichen Syntaxformen des Grundgerüsts als naturgegeben und arbeitet sich danach so gut es geht schrittweise in die Sprache ein.
2. Er wartet mit dem Programmieren, bis er sich theoretisch so weit in die Sprache eingearbeitet hat, dass er sämtliche im Grundgerüst vorkommenden Konzepte verinnerlicht hat. Dann erst nimmt er die Hürde.
3. Er verzichtet auf jegliche Eleganz und klettert über die Hürde.
Den letzten Weg werden Sie jetzt einschlagen. Indem Sie in einem kurzen Abriss die historische Entwicklung der Programmiersprachen von den ersten Anfängen bis zu Java nachvollziehen, werden Sie sich mit den wichtigsten Konzepten moderner Programmiersprachen zumindest so weit vertraut machen, dass Sie das Grundgerüst verstehen und einfache Programme schreiben können.
Programmieren bedeutet, dem Rechner Befehle zu erteilen, die er ausführen kann. Früher wurden diese Befehle vom Rechenwerk ausgeführt, das in den ersten Rechenmaschinen aus dem 19. Jahrhundert noch mechanisch arbeitete. Heute ist das Herzstück des Rechners der Prozessor. Doch eines hat sich nicht geändert: Jeder Rechner/Prozessor verfügt nur über einen ganz begrenzten Satz an Befehlen, und auch diese versteht er nur, wenn sie binär, d. h. als eine Folge von Nullen und Einsen, codiert vorliegen.1
10100001 00111111101001100110010100000001
10000011 1100000 00000000000000000000000000000011
10100011 00111111101001100110010100000001
Da die Programmierung mit binär codierten Maschinenbefehlen äußerst mühselig und fehleranfällig ist, sann man schon früh nach Möglichkeiten, die Programmierung zu vereinfachen. Ein erster Schritt in diese Richtung war Assembler.
Assembler-Programmierung ist immer noch Programmierung auf Maschinenebene, nur dass der Programmierer die Befehle nicht mehr binär codiert, sondern in Form sogenannter Mnemonics niederschreibt.
MOV EAX, o[3FA66501]
ADD EAX, 3
MOV [3FA66501], EAX
Ein spezielles Übersetzerprogramm, das ebenso wie die Sprache Assembler genannt wird, übersetzt die Befehlsnamen (MOV, ADD ...), Registerbezeichnungen (EAX, EDX ...) Speicheradressen ([3FA66501] ...) und Zahlen (3 ...) in die zugehörigen Binärfolgen.
Einfache Zahlen können zumeist direkt in die Maschinenbefehle integriert und vom Prozessor verarbeitet werden (siehe den Befehl ADD EAX, 3). Für komplexere Daten wie z. B. Zeichenfolgen (»Dies ist ein Text«) ist das nicht möglich. Sie müssen im Arbeitsspeicher abgelegt und bei Bedarf in den Prozessor geladen werden.
Hinweis
Zeichenfolgen werden in der Programmierung gemeinhin als Strings bezeichnet.
Auch Daten, denen im Programm eine bestimmte Bedeutung zukommt und deren Wert sich im Lauf des Programms ändern kann, müssen im Arbeitsspeicher verwahrt werden. Ein Programm, das die Mausklicks des Anwenders zählt, könnte beispielsweise einen bestimmten Bereich im Arbeitsspeicher für die Anzahl der Mausklicks reservieren. Beim Programmstart schreibt es den Wert 0 in diesen Speicherbereich. Danach lauscht es auf Mausklicks, und jedes Mal, wenn der Anwender eine Maustaste drückt, liest es den aktu-ellen Wert des Speicherbereichs in den Prozessor, addiert den Wert 1 und schreibt das Ergebnis zurück in den Speicherbereich. So werden aus an sich bedeutungslosen Zahlenwerten sinnvolle Daten!
In den obigen Maschinenbefehlen wurden die Speicheradressen, von denen Daten geladen oder in die Daten geschrieben werden sollten, stets als explizite (hexadezimale oder binäre) Adressen angegeben. Dies hat zwei gravierende Nachteile: Der Programmierer muss sich merken oder gesondert notieren, welche Daten an welchen Adressen stehen, und er ist selbst für die korrekte Speicherbelegung verantwortlich, muss also beispielsweise aufpassen, dass sich die Speicherbereiche zweier Daten nicht überlappen.
Hier schafft das Konzept der Variablen, das schnell auch in Assembler Einzug fand, Abhilfe. Statt numerischer Speicheradressen vergibt der Programmierer Namen und überlässt dem Übersetzerprogramm (im Fall der Assembler-Programmierung also dem Assembler) die Zuordnung dieser Namen zu echten Speicheradressen. Statt nichtssagender Zahlen kann der Programmierer nun Namen auswählen, die auf Art und Zweck der gespeicherten Daten hinweisen, beispielsweise mausklickZaehler, alter oder preis.
Abbildung 2-1: Variablen sind ein wenig wie Schubladen, in denen man Werte aufbewahren kann.
Hinweis
Das Beziehungsgefüge aus Name, zugehörigem Speicherort und darin abgelegten Daten wird als Variable bezeichnet. Im alltäglichen Sprachgebrauch wird die Variable aber auch häufig mit ihrem Wert, d. h. mit den in ihr abgelegten Daten, gleichgesetzt. Wenn ein Programmierer also davon spricht, dass er die Variable A zur Variablen B hinzuaddiert, meint er damit, dass der Wert in der Variablen A zu dem Wert der Variablen B hinzuaddiert wird.
Ende der Fünfziger, Anfang der Sechziger wurden die ersten höheren Programmiersprachen entwickelt. Anders als die Assemblersprachen, bei denen jeder Befehl der Sprache exakt einem Maschinenbefehl entspricht, arbeiten die höheren Programmiersprachen mit Anweisungen, die weitaus komplexere Operationen ausführen und in eine ganze Folge von Maschinenbefehlen übersetzt werden. Klar, dass es hierfür spezielle entsprechend leistungsfähige Übersetzerprogramme geben muss. Dabei wird je nach der prinzipiellen Arbeitsweise zwischen Compilern und Interpretern unterschieden:
• Ein Compiler liest den gesamten Quelltext des Programms (oder Programmmoduls) ein, analysiert ihn und übersetzt ihn dann in Maschinencode. Dieser Maschinen-code kann mithilfe eines weiteren Programms, des Linkers, mit anderem Maschinencode verbunden und in ein ausführbares Programm verwandelt werden (beispielsweise eine Windows-EXE-Datei). Zum Starten des Programms wird die ausführbare Programmdatei aufgerufen.
• Ein Interpreter liest den Quelltext Zeile für Zeile ein. Jede Zeile wird sofort übersetzt und direkt zur Ausführung an den Prozessor weitergereicht. Zum Ausführen des Programms muss also nur der Quelltext des Programms an den Interpreter übergeben werden.
Für jede höhere Programmiersprache gibt es einen eigenen Compiler oder Interpreter. Wortschatz und Grammatik der Programmiersprache sind in der Spezifikation der Sprache niedergeschrieben und im Compiler (oder Interpreter) implementiert. Die Sprache wird also genauso gut durch den Compiler (oder Interpreter) wie durch ihre Spezifikation definiert. Oder um es noch drastischer zu formulieren: Wenn Sie ein Programm geschrieben haben, das sich mit dem zugehörigen Compiler nicht übersetzen lässt, nutzt es Ihnen gar nichts, wenn Sie belegen können, dass Ihr Quelltext exakt den Regeln der Sprachspezifikation folgt. Letzte Instanz ist in so einem Fall der Compiler. Sie können sich bei dem Compilerhersteller beschweren, aber wenn Sie Ihr Programm übersetzen möchten, müssen Sie den Regeln folgen, die der Compiler implementiert2.
Hinweis
Die obige Unterscheidung zwischen Compiler und Interpreter beschreibt die traditionellen Grundprinzipien, die mit Kompilation und Interpretation verbunden sind. Obwohl diese Grundprinzipien nach wie vor gelten, können moderne Compiler und Interpreter in einzelnen Punkten davon abweichen. (Der Java-Compiler erzeugt beispielsweise weder echten Maschinencode noch ausführbare EXE-Dateien. Dazu später in Abschnitt »Programmerstellung in Java« auf Seite 35 mehr.)
Ein einfaches Programm, das von der Konsole eine Radiusangabe einliest, den zugehörigen Kreisumfang berechnet und diesen auf der Konsole ausgibt, würde, in Basic geschrieben, wie folgt aussehen:
Beispiel 2-1: Ein Basic-Programm, wie es in den späten Achtzigern geschrieben worden sein könnte
' Programm zur Berechnung des Kreisumfangs
print "Geben Sie einen Radius ein: "
input radius
umfang = 2 * 3.1415 * radius
print "Der Kreisumfang betraegt " umfang
Das Programm beginnt damit, dass es einen Text ausgibt, der den Anwender auffordert, über die Tastatur einen Radiuswert einzutippen. Dieser wird mit dem Schlüsselwort input in die Variable radius eingelesen. (Die Variable radius wird dabei automatisch eingerichtet und mit ausreichend Speicher verbunden.) In der vorletzten Quelltextzeile wird der Kreisumfang berechnet und in der neuen Variablen umfang abgespeichert. Schließlich gibt das Programm einen kurzen erläuternden Text und den Inhalt von umfang auf der Konsole aus.
Das Beispiel zeigt nicht nur, wie einfach die Programmierung in höheren Programmiersprachen sein kann, es demonstriert auch den Einsatz einiger wichtiger Elemente, die für Quelltexte höherer Programmiersprachen typisch sind:
• Kommentare, die den Quelltext erklären und vom Programmierer eingefügt werden, damit er selbst oder andere Programmierer sich später schneller in den Quelltext einarbeiten können. Kommentare werden vom Übersetzerprogramm ignoriert (' Programm zur Berechnung des Kreisumfangs).
• Konstante Werte, die in der Programmierung als Literale bezeichnet werden ("Geben Sie einen Radius ein! ", 2, 3.1415 ...).
Beachten Sie, dass in Dezimalzahlen die Nachkommastellen durch einen Punkt – und nicht wie im Deutschen üblich durch ein Komma – abgetrennt werden!
• Variablen zum Abspeichern und Verwalten der Daten (radius, umfang).
• Operatoren zur Durchführung einfacher, grundlegender Bearbeitungsschritte wie der Multiplikation (*) oder der Zuweisung eines berechneten Werts an eine Variable (=).
• In der Sprache oder in den Standardbibliotheken der Sprache implementierte höhere Befehle, die häufig benötigte Aufgaben erledigen – beispielsweise das Einlesen von Daten über die Tastatur (input) oder die Ausgabe von Strings auf der Konsole (print).
Abbildung 2-2: Ausführung eines Java-Programms auf der Windows-Konsole
Maschinenbefehle werden grundsätzlich der Reihe nach – so wie sie in den Arbeitsspeicher geladen wurden oder wie der Interpreter sie an den Prozessor schickt – ausgeführt. Wo es nötig oder opportun ist, von dieser sequenziellen Ausführung abzuweichen, kann der Programmierer Sprungbefehle einbauen, die dafür sorgen, dass die Programmausführung an einer beliebigen anderen Stelle des Programms fortgeführt wird.
Höhere Programmiersprachen, auch Basic, geben die Fähigkeit, Sprünge zu vollziehen, meist auf verschiedene Weise an den Programmierer weiter:
• durch direkte Sprünge zu beliebigen Anweisungen (das zugehörige Schlüsselwort heißt in der Regel goto),
• durch spezielle Kontrollstrukturen, die der Interpreter mithilfe von Sprüngen realisiert,
• durch Funktionsaufrufe (siehe Abschnitt »Funktionen« auf Seite 22).
Die direkten Sprünge mit goto sollen uns nicht weiter interessieren. Sie führen schnell zu wirrem Spaghetticode und werden in Java daher nicht unterstützt. Wesentlich interessanter sind da schon die Kontrollstrukturen, zu denen
• die bedingte Ausführung,
• die Verzweigung und
• die Schleife
gehören.
Eine bedingte Ausführung dient dazu, zu entscheiden, ob eine nachfolgende Anweisung oder ein Anweisungsblock ausgeführt werden soll oder nicht. In den meisten Program-miersprachen wird die bedingte Ausführung mit dem Schlüsselwort if eingeleitet. In Basic hat sie folgenden Aufbau:
if (Bedingung) then
Anweisung(en)
end if
Diese Konstruktion kann man wie einen deutschen Konditionalsatz lesen:
»Wenn die Bedingung erfüllt ist, dann (und nur dann) führe die Anweisungen aus.«
verkaufszahlen < 1000verkaufszahlenififend if