Kurzeinführung Java - Fakultät Informatik Uni Stuttgart

Werbung
Informatik Verbund Stuttgart
der Universität Stuttgart
Java-Tutorium
Kurzeinführung
Inhaltsverzeichnis
WAS IST JAVA?..................................................................................................................................................2
JAVA UND OBJEKTORIENTIERUNG ............................................................................................................4
BLICK IN DIE ZUKUNFT .................................................................................................................................5
DIE PROGRAMMIERSPRACHE JAVA ...........................................................................................................6
Werkzeuge des JDK .......................................................................................................................................6
Unterschiede zu C und C++ ..........................................................................................................................8
JAVA – KURZREFERENZ.................................................................................................................................9
Schlüsselwörter..............................................................................................................................................9
Kommentare ..................................................................................................................................................9
Konstanten.....................................................................................................................................................9
Einfache Datentypen......................................................................................................................................9
Escape-Sequenzen in Zeichenketten .............................................................................................................10
Klassen ........................................................................................................................................................10
Methoden.....................................................................................................................................................10
Objekt..........................................................................................................................................................11
Modifier.......................................................................................................................................................11
Arrays..........................................................................................................................................................12
if Statement..................................................................................................................................................14
while Statement............................................................................................................................................14
do while Statement .......................................................................................................................................15
for Statement................................................................................................................................................15
switch Statement ..........................................................................................................................................15
UNIX-KURZEINFÜHRUNG............................................................................................................................. 17
Dateibezeichner ...........................................................................................................................................17
Unix Kommandos.........................................................................................................................................17
JAVA QUIZ........................................................................................................................................................ 18
Multiple choice ............................................................................................................................................18
Wahr oder falsch?........................................................................................................................................19
IVS, 2000
IVS-Java-Tutorium
Seite 2/20
Was ist Java?
Sun: " Java is a simple, object-oriented, distributed, interpreted, robust, secure, architectural neutral,
portable, high-performance, multithreaded, and dynamic language."
Java ist eine Allzweckprogrammiersprache.
1990 entwickelte James Gosling bei Sun, einem bekannten Hersteller von UNIX-Workstations, eine
Programmiersprache namens Oak für sein Projekt „Imagination“, einen SGML-Editor. Sie stellte im
wesentlichen eine Abwandlung von C++ und Objective C dar, in die alle Ideen eingeflossen waren, die
frustrierte Entwickler in jahrelanger Erfahrung gesammelt hatten.
Im April 1991 gründete Sun die Tochterfirma First Person Inc., die versuchen sollte, Oak als interne
Programmiersprache für Heimelektronik vom Videorecorder bis zum Toaster, zu vermarkten. 1993 suchte
Time Warner nach Ideen für die Settop-Boxen für das interaktive Fernsehen. Im Hinblick auf diese
Anwendungen musste die Programmiersprache gewisse Anforderungen erfüllen. Sie musste in Echtzeit
laufen, sicher und zuverlässig sein sowie sehr kompakt. Aus dieser Zeit stammt auch noch das Maskottchen
Duke.
Leider hatte das Projekt nicht den rechten Erfolg und die Firma wurde aufgelöst. Zu dieser Zeit begann
jedoch gerade das WWW seinen Siegeszug und Patrick Naughton programmierte an einem Wochenende
einen HTML-Browser, der Oak-Applets starten konnte. Daraus entstand der heutige HotJava-Browser und
das neue Zielgebiet der Programmiersprache wurde das Internet.
Auch Internet-Programme müssen kompakt sein.
Vor allem die Gegenspieler von Microsoft gebrauchen im Zusammenhang mit Windows gern den Begriff
Fatware, denn in viele Programme werden doppelt und dreifach Standardbibliotheken eingebunden, die die
Programme aufblähen. In Java gibt es ein Standard-API, dessen Klassen auf dem lokalen Rechner liegen,
ein kleines Java-Applet kann so auch mit wenigen hundert Bytes auskommen, wogegen z.B. ein leeres
Delphi- oder C++-Programm kaum unter 100k groß ist.
Außerdem braucht man einen sicheren Schutz gegen Viren oder das Ausspionieren des Rechners.
Java-Programme werden vor der Ausführung überprüft, dadurch können z.B. keine Informationen an
fremde Rechner geschickt werden und der Rechner kann durch fehlerhafte Programme nicht abstürzen.
Fehleranfällige und überflüssige Elemente wie Pointer, Operatorüberladung, Speicherfreigabe oder die
Benutzung beliebiger Zahlen als Booleantypen wurden eliminiert, was zu einheitlicheren Programmen und
leichterer Pflege führt.
Der Name Java entstand in einer Brainstorming-Session bei Sun.
Er geht auf das Slangwort für Kaffee in den USA zurück, welches Hauptexportgut der Insel Java ist. Es ist
ein Anspielung auf das heiße und aromatische Getränk, welches Programmierer gern und viel trinken.
Sun: "Write once, run anywhere, on anything, safely."
Java ist portabel.
Ein kompiliertes Java-Programm besteht aus dem so genannten Bytecode mit den Befehlen eines virtuellen
Prozessors. Bytecode und Klassenformat sind vollkommen hardware-unabhängig. Die Java-Plattform
wurde schon von vielen Herstellern in ihre Betriebssysteme integriert. Zu nennen sind hier u.a. Linux,
Windows (ab Win95 OSR2), OS/2 4.0 und natürlich Sun Solaris.
Was brauche ich zur Java-Programmierung?
IVS, 2000
IVS-Java-Tutorium
Seite 3/20
Die folgenden Erklärungen gehen davon aus, dass sie das kostenlose JDK von JavaSoft
[http://www.javasoft.com] benutzen. Offizielle Distributionen gibt es für Win95/NT, Solaris und MacOS.
Das Entwicklerkit enthält den Compiler, das API (Application Programming Interface), einen
Appletviewer, Debugger und andere Werkzeuge. Zu allen Programmen und Klassen ist der Sourcecode
enthalten. Die aktuelle Version des Entwicklerkits ist 1.2. Auch die im HTML-Format vorliegende
Dokumentation wird unbedingt benötigt. Alles in allem nimmt das ganze einiges über 30 MB
Festplattenplatz ein. Wenn Sie nur auf die Version 1.0.2 zurückgreifen können, werden sich die meisten
Programme nicht übersetzen lassen.
Wer vorher mit Turbo Pascal o.ä. gearbeitet hat, wird eine integrierte Entwicklungsumgebung mehr
vermissen, als jemand der es gewöhnt ist, unter UNIX zu programmieren. Das JDK enthält den
Kommandozeilencompiler javac, der mit bestimmten Parametern, z.B. der Quelldatei aufgerufen werden
muss und eine .class-Datei erzeugt, bzw. eine Vielzahl von Fehlermeldungen erzeugt.
Die Quelldatei wird mit einem normalen Texteditor erzeugt. Es empfiehlt sich natürlich ein Editor, der
Autoindent (automatisches Einrücken) beherrscht, wie z.B. der von Turbo Pascal und auch Syntax
Highlighting (Schlüsselwörter sowie Kommentare und Zeichenketten werden farbig hervorgehoben) ist
ganz nützlich. Es gibt natürlich gerade für Windows 95 auch eine Menge integrierter Umgebungen, die
einen guten Editor besitzen und den Compiler automatisch aufrufen können. Zu nennen sind hier u.a. Jpad
[http://www.modelworks.com] und Kawa [http://www.fni.net/kawa], die beide als Shareware im Internet
zu haben sind.
Auch kommerzielle Programme werden angeboten, wie z.B. der Java Workshop von Sun, Visual J++ von
Microsoft, Borland’s OpenJ-Builder, Symantec Café und viele andere. Für den Anfang reichen aber ein
guter Editor und das JDK vollkommen.
Wenn Ihre Entwicklungsumgebung dies nicht per Mausklick für Sie tut, starten Sie das übersetzte
Programm durch Eingabe von „java name“. Im neuen Windows 95 (OSR2) ist Java schon eingebaut, der
Interpreter (mit schneller JIT-Compiler) heißt hier jview. Bisher wird aber nur Sprachversion 1.02
unterstützt. Unter Linux lassen sich die Programme direkt starten, bisher allerdings ebenfalls erst Version
1.02. Applets werden in eine HTML-Seite eingebettet und müssen mit einem Java-kompatiblen Browser
betrachtet werden.
Der Syntax für das Einbetten von Java-Applets ist folgender:
<APPLET
CODEBASE = codebaseURL
ARCHIVE = archiveList
CODE = appletFile ...or...
ALT = alternateText
// Pfad für Klassendateien
// jar-Archive, die Daten
// und Klassen enthalten
OBJECT = serializedApplet
// wenn Java abgescha ltet ist
NAME = appletInstanceName
WIDTH = pixels HEIGHT = pixels
ALIGN = alignment
VSPACE = pixels HSPACE = pixels
// Fenstergröße
// Ausrichtung
// Abstand
>
<PARAM NAME = appletAttribute1 VALUE = value>
// zu übergebende
// Parameter
<PARAM NAME = appletAttribute2 VALUE = value>
. . .
alternateHTML
// wenn Browser kein Java
// versteht
</APPLET>
Programmcode muss leicht lesbar und verständlich sein.
IVS, 2000
IVS-Java-Tutorium
Seite 4/20
Der Compiler sucht beim Übersetzen nach Tokens, dazwischen liegende Zeichen (Leerzeichen,
Zeilenumbrüche, ...) und Kommentare werden ignoriert. Nutzen Sie dies, um ihren Quellcode übersichtlich
zu gestalten. Rücken Sie dazu Blöcke ein, d.h. z.B. nach einer öffnenden Klammer rücken Sie die folgenden
Zeilen mit zwei Leerzeichen oder TAB ein, bis wieder eine schließende Klammer folgt. Dies erhöht die
Leserlichkeit drastisch. Weiterhin ist es üblich, Schleifenvariablen i,j,k,... bzw. counter oder ähnliches zu
nennen.
Im Gegensatz zu PASCAL ist Java case-sensitiv, d.h. der Compiler unterscheidet Groß- und
Kleinschreibung. Vergeben Sie Namen nicht nach Rechtschreibregeln, sondern nach der optimalen
Übersicht. Es empfiehlt sich, bei aus mehreren Wörtern zusammengesetzten Namen, den ersten klein und
die folgenden groß zu schreiben, z.B. printScreen(); oder ähnliches. Per Konvention beginnen
Variablennamen mit einem kleinen und Klassennamen mit einem großen Buchstaben. Beachten Sie jedoch,
dass Sie eine einmal gewählte Schreibweise im ganzen Programm beibehalten müssen. Eine häufige
Fehlerquelle ist auch das Benennen von Variablen mit reservierten Worten.
Java und Objektorientierung
Programmsprachen kann man zum Beispiel nach ihrer Entfernung von der Maschine einteilen.
Der schnellste und kompakteste Code ist zweifelsfrei durch Assemblerprogrammierung zu erreichen. Die
Maschine wird direkt programmiert, einzige Erleichterungen bieten Sprungziele, Makros und Trivialnamen
für Befehle.
Später entwickelten sich Interpretersprachen wie z.B. BASIC, die sehr weit von der Maschine entfernt
waren. Im Gegensatz zur Maschinensprache sind die Befehle hier sehr komplex, z.B. wird das „Bildschirm
löschen“-Kommando (Cls) intern in viele kleine Einzelaktionen zerlegt. Der Quelltext wird hier zur
Laufzeit Befehl für Befehl übersetzt und ausgeführt. Das führt oft zu inakzeptablen Laufzeiten.
Compiler setzen hier an. Der Quelltext wird schon vor der Laufzeit übersetzt und als Maschinenprogramm
gespeichert. Der Anwender hat mit dem Quelltext nichts zu tun und startet die Binärdatei. Das ist das heute
übliche Prinzip z.B. unter DOS oder Windows. Die übersetzten Programme sind natürlich längst nicht so
optimiert wie „handprogrammierte“ Maschinenprogramme, aber durch die Komplexität moderner
Prozessoren wie z.B. des Pentiums kann nur noch ein Compiler wissen, welcher Code wegen Branch
prediction, Register renaming, Cache-Größe und ähnlichem am schnellsten sein wird. Außerdem, wer will
schon in einem 60.000 Zeilen-Assemblercode einen Fehler suchen?
Objektorientierte Sprachen wie Java haben neue Konzepte zu bieten.
Das Ziel ist in erster Linie leicht zu wartender und pflegender Code. Dazu bedient man sich der Art wie
auch Menschen die Dinge um sich herum wahrnehmen. Ein elementarer Begriff ist der der Klasse. Klassen
enthalten wiederverwendbaren Code zur Erstellung von Objekten. Sie können entweder instantiiert, um
individuelle Objekte zu erzeugen oder in Subklassen erweitert werden. Dem menschlichen Verständnis
ähnlich ist nun z.B., dass man Objekten aufgrund der Superklassen (übergeordnete Klassen) von denen sie
abstammen, Eigenschaften zuordnen kann. Da z.B. ein VW Polo ein VW ist (von der Superklasse VW
abstammt), der wiederum ein Auto ist (von der Superklasse Auto abstammt), kann man sagen, dass ein
Polo vier Räder hat, da er diese Eigenschaft von der Superklasse Auto erbt. Ein Polo kann wiederum auch
aus verschiedenen Objekten zusammengesetzt sein (composite object), z.B. aus vier Rädern (Subsysteme).
Ein Beispiel für eine Subklasse ist z.B., dass man schon eine fertige Klasse besitzt, die ein Rechteck
behandelt, es z.B. zeichnet, seinen Flächeninhalt berechnet, usw. Will man nun auch farbige Rechtecke
zeichnen, kann man eine Subklasse von Rechteck anlegen, in der man die Methoden überschreibt, die
anders sind. Alle anderen werden geerbt. Ein Beispiel wäre z.B., die Zeichenmethode des farbigen
Rechtecks so zu implementieren, dass man die Systemfarbe ändert, dann die fertige Zeichenmethode von
Rechteck aufruft und die Systemfarbe danach wieder zurücksetzt.
IVS, 2000
IVS-Java-Tutorium
Seite 5/20
Die objektorientierte Programmierung beruht auf einer Hierarchie, in der Klassen nach unten hin immer
spezieller und nach oben immer abstrakter werden. Ein Objekt ist ein abstrakter Datentyp mit seinen
Methoden. Auf private Daten, Instanzvariablen (private Variablen) und private Methoden kann nicht
direkt, sondern nur über öffentlichen Methoden zugegriffen werden.
Dieses Prinzip nennt man Kapselung.
Stellen Sie sich eine Liste vor, die verschiedene Daten enthält. Sie verwalten z.B. Kundendaten.
Angenommen die Anzahl der Aufträge pro Kunde ist anfangs auf einen 8bit-Datentyp beschränkt und Sie
ändern diesen später in einen 16bit-Datentyp, so müssen Sie alle Funktionen, die auf die Liste zugreifen,
umschreiben. Haben Sie nun viele Programme, die dies tun, so können leicht Fehler entstehen.
In der objektorientierten Programmierung werden die Daten lokal zusammen mit dem Methoden in einer
Klasse zusammengefasst, die auf sie zugreifen. Um beispielsweise ein Listenelement zu entfernen, würden
Sie dem Objekt Liste den Auftrag delete(item) geben. Wie dies jedoch intern realisiert ist, ist für das
Hauptprogramm nicht ersichtlich. Ein einzelnes Element erhält man z.B. über den Aufruf der Methode
„objectAtIndex(index)“ der Klasse Liste. Direkt auf die Liste zuzugreifen, ist nicht möglich.
You must image a system as a collection of classes and methods that knows how to perform tasks.
Man kann Methoden in unterschiedlichen Klassen gleiche Namen geben.
So kann man komplizierte Methodennamen vermeiden. Dies entspricht auch der menschlichen
Wahrnehmung und wird Polymorphie genannt. Wenn man z.B. an einem Radio oder an einer Lampe den
Einschalter drückt, können intern ganz unterschiedliche Prozesse ausgelöst werden, dem Benutzer ist dies
aber egal, er will nur, dass das Gerät eingeschaltet wird. Was er damit auslöst, ist nur im Zusammenhang
mit dem jeweiligen Objekt eindeutig.
class Bildschirm {
Methode clear { Code für Bildschirm löschen; }
Methode write { Code zum auf den Bildschirm schreiben; }
}
Hauptprogramm {
ein Bildschirm-Objekt namens screen anlegen
dem screen sagen, er soll seine clear-Methode aufrufen
dem screen sagen, er soll seine write-Methode aufrufen (evtl. mit Parameter)
...
}
Blick in die Zukunft ...
Java schafft neue Vertriebsmöglichkeiten.
Die vier klassischen Begriffe was das Copyright betrifft, sind bislang Public domain (alle Rechte
aufgegeben), Freeware (kostenlose Weitergabe erlaubt), Shareware (kostenlose Testversion, bei intensiver
Nutzung muss Vollversion erworben werden) und Vollversion (entgeltlich erworben, Weitergabe verboten).
In Zukunft könnte es mit Java auch Software zum Mieten geben, bei der man für jede Nutzung bezahlen
muss.
Unix- und Internetfans wird der fehlende Sourcecode bei vielen Applets nicht gefallen, da dies mit einer
Philosophie kollidiert.
Eines von Suns Mottos ist „Think authors not publishers“.
IVS, 2000
IVS-Java-Tutorium
Seite 6/20
Man eliminiert den Mittelsmann zwischen Autor und Kunde. Oft fehlen Firmen Geld und Beziehungen,
Software weltweit bewerben und verkaufen zu können. Bisher! Im Internet kann sich jede Firma
präsentieren, Produkte und Service anbieten, ohne Mittelsmann. So werden auch viele zeitraubende
Vorgänge überflüssig und man kann Software direkt günstiger anbieten. Dies ist die Chance für den besten
Autor, zu gewinnen.
Java läuft überall.
Microsofts Philosophie war immer, dass die Anwendung auf ein Betriebssystem aufsetzt, das wiederum auf
eine bestimmte Hardware aufsetzt. In Zukunft könnten die Nutzer in die Situation kommen, wo es
genügend Software in Java gibt (jetzt existieren schon über eine halbe Million Programme) und man die
Hardware wählt, die diese Programme am schnellsten ausführt. Heute gibt es z.B. den RISC-PC von
Acorn, der extrem wenig Strom verbraucht, bei einer mit einem Pentium Pro vergleichbaren Leistung auch
mit 200 MHz nur Bruchteile kostet und eine der schnellsten Java-Plattformen ist. Er ist aber bisher für
Privatanwender weniger eine Alternative, da Allerweltssoftware auf dieser zum Intel x86 inkompatiblen
Architektur nicht lauffähig ist. Das könnte sich bald ändern. Es gibt sogar schon eine Java-Version von
Corel Office, der in den USA verbreitetsten Office-Software. Wer auf proprietäre (herstellerabhängige)
Software setzt, wird es also in Zukunft (hoffentlich) schwer haben.
Java hat die Macht, einiges zu verändern.
Sun hat schon die ersten Prozessoren auf dem Markt, die Java-Bytecode hardwaremäßig verarbeiten
können, Features wie Bilddekomprimierung und Speicherverwaltung bereits im Microcode enthalten und
sehr preisgünstig sind. Des Weiteren ist schon eine kleine Version des Chips um einen zweistelligen Faktor
schneller als ein Just in Time Compiler (JIT) auf einem schnellen Pentium. Die Chips heißen pico- micround Ultra-Java und sollen zwischen $25 und $100 kosten.
Sun: „The network is the computer“
JavaOS wird das Betriebssystem für Netzcomputer (NCs).
Sun vertreibt jetzt schon JavaStations, so genannte Zero administration clients, die ihr Betriebssystem und
alle Applicationen von einem Server laden und keine lokalen Massenspeicher oder leistungfähige
Prozessoren benötigen. Muss ein Gerät ausgetauscht werden, kann sofort weitergearbeitet werden. Neue
Updates des Betriebssystems oder von Applikationen werden automatisch von allen Clients genutzt. Da das
Einrichten und Verwalten (ganz zu Schweigen von den vielen Problemen) von Windows-Arbeitsrechnern
schon bei geringer Anzahl zur Sisyphusarbeit wird, sicher eine erfolgversprechende Sache.
Zuguterletzt ist es auch für den Programmierer eine Erleichterung, plattformunabhängig entwickeln zu
können.
Vorbei die Zeit in der man für ein paar unterstützte Plattformen in mühsamer Arbeit ein abstraktes
Klassenmodell bauen musste, für jede Plattform eigene Grafik-, Sound- und andere Routinen. Selbst mit
dem so portablen C++ kann das echt in Arbeit ausarten.
Die Programmiersprache Java
Werkzeuge des JDK
Sie erhalten immer eine Hilfe zu den Programmen, wenn Sie sie ohne Parameter aufrufen. Des Weiteren
befindet sich eine genaue Beschreibung aller Optionen und Programmfunktionen in der HTML-OnlineDokumentation. Die folgenden Informationen stellen nur eine kleine Übersicht dar.
Ein Programm mit der Endung „_g“ ist immer die ohne Optimierung compilierte und so besser debugbare
Version.
IVS, 2000
IVS-Java-Tutorium
Seite 7/20
Allgemeines:
javac- der Java-Compiler übersetzt die Java-Quelltexte in den Bytecode
Beispiel: javac -classpath src;src\old -d classes -O -deprecation test.java
kompiliert die Quelldatei test.java in src oder src\old, gibt Fehlermeldungen zu veralteten Aufrufen aus,
führt eine Optimierung durch und speichert die Klassendatei im Pfad classes.
java - der Java-Interpreter führt Programme im Bytecode aus.
Beispiel: java -cs ls cpp
führt das Programm „ls.class“ mit dem Parameter „cpp“ aus und übergibt an den java-Interpreter die
Option -cs.
javadoc - Generiert aus im Quellcode enthaltenen DocComments eine API-Dokumentation
Beispiel: javadoc -version -author -noindex -notree test.java
erzeugt eine Dokumentation zur Klasse test, @version- und @author-Tags werden hierbei berücksichtigt
und index.html und tree.html nicht erzeugt.
Neben normalem Text können DocComments auch besondere Tags enthalten.
@see Klasse#Methode
Hyperlink
@param Name Text
beschreibt Parameter einer Methode
@return Text
beschreibt Rückgabewert einer Methode
@exception Klasse Text
beschreibt Ausnahmebehandlung einer Methode
@author Text
Autor der Klasse
@deprecated
Klasse oder Methode als veraltet deklarieren
@version Text
Version bzw. Datum der Klasse
appletviewer - einfacher Applet-Anzeiger für Leute ohne Webbrowser
Beispiel: appletviewer test.java
lädt die HTML-Datei test.java und führt das darin mittels <APPLET>-Tag eingebettete Applet aus.
jdb - mit dem Java-Debugger „entwurmt“ man Programme
javah - Headerfile- und C-Stub-File-Generator für das Einbinden von C-Code
javap - der Java-Profiler disassembliert Klassendateien und zeigt den Bytecode an
RMI (Remote Method Invocation) Tools
rmic - generiert Stub- und Skelettklassen für Javaobjekte, die verteilte Programmierung benutzen
rmiregistry - wird für verteilte Programmierung benutzt
serialver - liefert die Seriennummer einer Klasse
Internationalization Tools
native2ascii - konvertiert Text ins Unicode-Format
JAR (Java Archiver) Tool
jar - Packer, der es erlaubt, mehrere Klassen und Ressourcen in einer Datei zu speichern
Digital Signing Tool
javakey - erzeugt digitale Unterschriften für Archive und verwaltet Schlüssel
IVS, 2000
IVS-Java-Tutorium
Seite 8/20
Unterschiede zu C und C++
Im Unterschied zu C unterstützt die Sprache JAVA nicht alle Standard-C-Operatoren.
Es gleichen sich jedoch die Vorrangs- und Assoziativitätsregeln. Java unterstützt jedoch beispielsweise
nicht den Operator sizeof. Da es auch keine Pointer gibt (statt dessen Referenzen), existieren auch der
Adress- und Pointeroperator nicht.
Neu ist beispielsweise, der „+“-Operator zum Verketten von Strings. Der instanceof-Operator liefert true
oder false je nachdem, ob ein Object eine Instanz einer angegebenen Klasse ist oder nicht.
Zum normalen >> (shift right) Operator kommt der >>>-Operator, der eine Zahl grundsätzlich als nicht
vorzeichenbehaftet behandelt.
Werden & und | (bitweises AND und OR) auf boolean-Typen angewandt, wirken Sie automatisch wie
logisches AND und OR, mit dem Unterschied, dass bei && und || der auf der rechten Seite stehende
Operand nicht mehr ausgeführt wird, sobald das Ergebnis der Auswertung des linken Operanden schon
feststeht. Boolean ist ein eigenständiger Typ, daher kann nicht jeder Typ als boolean-Typ verwendet
werden, sondern andere Typen müssen mittels Vergleichsoperationen umgewandelt werden.
In Java werden Zugriffe auf Felder über deren Grenzen hinaus nicht wie in C zugelassen, sondern erzeugen
Ausnahmen. Typen sind in Java streng definiert, im Gegensatz zu C, wo man nie weiß, ob beispielsweise
char auf dem aktuellen Compiler signed oder unsigned ist. Der Ausweg war oft, eigene Typen zu definieren
und dann immer den eigenen Typ, z.B. byte als unsigned char zu benutzen, was für Außenstehende zu
schwer lesbaren Programmen führte.
Java-Code ist generell sehr gut lesbar, denn durch klar definierte Typen (ein großes Manko von C++),
Unterbindung von Operator-Überladung, Pointerarithmetik und anderes (z.B. kann es nicht mehr passieren,
dass man bei if(a==0) ein Gleichheitszeichen vergisst), ist alles eindeutig interpretierbar.
Einige Eigenschaften von C++ wurden bei Java weggelassen.
• Operator-Overloading (+,-, ...)
• typedef Statements (eigene Typen, in Java statt dessen Objekte)
• Strukturen, Unions und Funktionen (keine globalen Funktionen)
• Präprozessor (z.B. #define,#ifdef ...)
• goto (dafür benannte Schleifenendziele, u.ä.)
• Zeiger (dafür Referenzen)
• Mehrfachvererbung (Ausnahme: Interfaces)
• Präprozessor (eigene Typen nur als Objekte, import statt #include)
Java bietet auch viel Neues.
• Thread-Modell (unabhängige Tasks innerhalb eines Programmes)
• Automatische Speicherverwaltung (kein explizites Freigeben mehr)
• dynamisches Laden und Binden (late binding)
• Sicherheitsmodell (Überprüfung vor Ausführung)
• portabel ohne Neucompilierung (Bytecode)
• UniCode-Zeichenketten sowie echte Strings und Felder
IVS, 2000
IVS-Java-Tutorium
Seite 9/20
Java – Kurzreferenz
Schlüsselwörter
Java kennt folgende reservierte Wörter, von denen noch nicht alle unterstützt werden:
abstract
boolean
break
byte
byvalue
case
cast
catch
char
class
const
continue
default
do
double
else
extends
false
final
finally
float
for
future
generic
goto
if
implements
import
inner
instanceof
int
interface
long
native
new
null
operator
outer
package
private
protected
public
rest
return
short
static
super
switch
synchronized
this
throw
throws
transient
true
try
var
void
volatile
while
Nicht unterstützt: byvalue, cast, const, future, generic, goto, inner,
operator, outer, rest, var
Kommentare
Java kennt drei Arten von Kommentaren
1. Die C Kommentarzeichen /* welche bis zum nächsten */ gelten.
Bsp: /* das ist ein C Kommentar */
2. Die C++ Kommentarzeichen // welcher am Ende der Zeile endet.
Bsp: // das ist ein C++ Kommentar, der am Ende der Zeile endet
3. Die Kommentarzeichen /** welche bis zum nächsten */ gelten. Das Utility javadoc kann aus diesen
Kommentaren Online-Hilfen im HTML Format generieren.
Konstanten
Konstanten werden die Schlüsselwörter static final vorgestellt. Bsp: die Zahl π in der Klasse Math ist
wie folgt deklariert: public static final double PI=3.14159;
Einfache Datentypen
Typ
boolean
char
byte
short
int
IVS, 2000
enthält
true oder
false
Unicode
Zeichen
signed
integer
signed
integer
signed
integer
Default
false
Grösse
1 Bit
Min Wert
false
Max Wert
true
\u0000
16 Bits
\u0000
\uFFFF
0
8 Bits
-128
127
0
16 Bits
-32768
32767
0
32 Bits
-2147483648
2147483647
IVS-Java-Tutorium
long
float
double
Seite 10/20
signed
0
integer
IEEE 754
0.0
floating point
IEEE 754
0.0
floating point
64 Bits
-9223372036854775808
9223372036854775807
32 Bits
±1.40239846E-45
±3.40282347E+38
64 Bit
±4.94065645841246544E-324
±1.79769313486231570E+308
Beachten Sie, dass Strings keine char-Felder, sondern vollwertige Objekte sind (siehe java.lang.String und
java.lang.StringBuffer). Spezielle oder nationale Codes können auch mit der Escape-Sequenz „\uxxxx“ im
UniCode-Format eingebunden werden, wobei „xxxx“ für eine 16bit-Hexadezimalzahl steht.
Escape-Sequenzen in Zeichenketten
Darstellung
\n
\r
\b
\t
\f
\’
\“
\\
\uXXXX
Bedeutung
new line
cariage return
backspace
tabulator
form feed
Hochkomma
Anführungszeichen
backslash
Unicode-Zeichen
Klassen
Die Klassendefinition sieht wie folgt aus:
class NameDerKlasse {
...
}
Beispiel:
class Figure {...}
Wird eine neue Subklasse programmiert, dann muss nach dem Namen das Schlüsselwort extends gefolgt
vom Namen der Superklasse folgen:
class NameDerSubklasse extends NamerDerSuperklasse {...}
Beispiel:
class Circle extends Figure {...}
Implementiert eine Klasse ein Interface, dann folgt nach dem Namen der Klasse das Schlüsselwort
implements gefolgt vom Namen des Interfaces:
class NameDerKlasse implements NameDesInterfaces {...}
Beispiel:
class computer implements Observer {...}
Methoden
Beispiel:
double doSomething(int n, double x) {...}
IVS, 2000
IVS-Java-Tutorium
Seite 11/20
Eine Methode besteht aus einem Rückgabewert (double), einem Methodennamen (doSomething), einer
Parameterliste (int n, double x) und einem Methodenkörper ({...}), der die eigentliche Funktionalität
enthält. Optional können weitere Modifier angegeben werden.
Klassenmethoden wird das Schlüsselwort static vorangestellt:
Beispiel:
Exponentialfunktion in der Klasse Math:
public static double exp(double x) {...}
Methoden, denen das Schlüsselwort void vorangestellt wird geben nichts zurück.
Objekt
Objekte werden mit new erzeugt.
Beispiel:
Figure fig;
fig = new Figure();
Erzeugt ein neues Figure-Objekt.
Modifier
Modifier beschreiben spezielle Eigenschaften von Klassen, Variablen, Methoden...
Die meisten von Ihnen existieren aus Sicherheitsgründen, aber viele haben auch einen starken Einfluss auf
Codegröße und Performance. Standardmäßig ist eine Variable im aktuellen Package zugänglich.
synchronized
Methoden, die Engpassstellen darstellen werden bei mehreren Threads nur exklusiv ausgeführt. So wird
verhindert, dass z.B. ein nur halb aktualisierter Eintrag in einer Datenbank gelesen wird.
final
Finale (endgültige) Variablen sind Konstanten. Finale Methoden können durch keine neue Implementation
in Subklassen mehr überschrieben werden und von finalen Klassen dürfen keine Subklassen mehr gebildet
werden. Da man z.B. finale Methoden in Subklassen nicht überschreiben kann, sollten Passwortabfragen
final deklariert werden, außerdem kann der Compiler finalen Code besser optimieren.
abstract
Abstrakte Klassen dürfen abstrakte (unvollständig implementierte) Methoden besitzen. Diese müssen dann
Subklassen implementieren. Abstrakte Klassen können nicht instantiiert werden.
static
static- Variablen (Klassenvariablen) und Methoden (implizit final!) gibt es im Gegensatz zu
Instanzvariablen nur je einmal pro Klasse und nicht je einmal pro Instanz. Static-Methoden können auch
nur mit static-Variablen und Methoden arbeiten.
public
Öffentliche Klassen, Methoden und Variablen sind überall zugänglich, also sowohl importiert als auch in
Subklassen.
private
IVS, 2000
IVS-Java-Tutorium
Seite 12/20
Diese Variable oder Methode ist nur innerhalb der aktuellen Klasse verfügbar und wird auch nicht
mitvererbt.
protected
Diese Variable oder Methode ist nur innerhalb der aktuellen Klasse und deren Subklassen verfügbar.
transient
Dieser Modifier wird derzeit noch nicht benutzt und in ist späteren Versionen für Low-Level-Funktionen
und Datenbankzugriffe gedacht.
volatile
Dieser Modifier kennzeichnet, dass eine Variable asynchron aktualisiert wird und überwacht Operationen
damit besonders.
threadsafe
Durch dieses Schlüsselwort weiß der Compiler, dass die Variable nicht von mehreren Threads gleichzeitig
manipuliert wird und wird versuchen, sie in einem Register statt einem Speicherplatz unterzubringen.
native
Eine solche Methode wird nicht in Java-Code, sondern in Assembler oder C implementiert (nicht portabel).
Siehe dazu die javah-Dokumentation.
Arrays
Beispiel:
double v[] = new double[10];
instanziert einen Array v mit 10 Elementen des Basistyps double. Mit a[0],..., a[9] kann auf
die einzelnen Felder des Arrays zugegriffen werden.
Allgemein:
Typ/Klasse VariablenNamen[] = new Typ/Klasse[Grösse];
Es ist ebenfalls möglich zuerst den Array zu deklarieren und die Grösse später festzulegen.
Beispiel:
double v[]; // deklariert einen Array
...
v = new double[10]; // alloziert 10 Elemente vom Typ double
Mehrdimensionale Arrays werden durch Anhängen von mehreren [] deklariert.
Beispiel:
double m[][] = new double[10][20];
deklariert einen 10x20 Array vom Typ double.
Allgemein:
Typ/Klasse VariablenNamen[][]..[] =
new Typ/Klasse[1 Dim.][2 Dim]..[n Dim];
oder
Typ/Klasse VariablenNamen[][]..[];
...
VariablenNamen = new Type/Klasse[1 Dim][2 Dim]...[n Dim];
IVS, 2000
IVS-Java-Tutorium
Seite 13/20
Alle Bereichsüberschreitungen bei Arrays werden überwacht. Die Länge eines Arrays kann jederzeit
abgefragt werden:
int arraylaenge = v.length;
IVS, 2000
IVS-Java-Tutorium
wichtige Operatoren
Operator
+ (Addition)
- (Subtraktion)
* (Multiplikation)
/ (Division)
% (Modulo)
<,<=,>=, > (arithmetisch)
== (Gleichheit)
!= (Ungleich)
&& (Boolean Und)
|| (Boolean OR)
= (Zuweisung)
Seite 14/20
Beispiel
a+b
a-b
a*b
a/b
a%b
a>b
a == b
a != b
(a > 5) && (b == 7)
(a != 2.0) || (b > 2.718)
a = 3.141;
Klasse/Typ
byte, short, int, long, float, double,
String
byte, short, int, long, float, double
byte, short, int, long, float, double
byte, short, int, long, float, double
byte, short, int, long
byte, short, int, long, float, double
alle
alle
boolean
boolean
alle
if Statement
if Statements werden gleich wie Pascal IF Statements programmiert, ausser dass die Bedingung
geklammert wird und BEGIN durch { und END durch } ersetzt werden.
Beispiel:
if (a > 5) {
System.out.println(“a grösser 5“);
} else {
System.out.println(“a ist kleiner oder gleich 5“);
}
Allgemein:
if (Bedingung) { // Code falls Bedingung erfüllt
...
} else { // Code falls Bedingung nicht erfüllt
...
}
if Statements können auch kaskadiert werden, wie das folgende Beispiel zeigt:
if ( (a > 5) && (b < -3) ) {
....
} else if (c == 7) {
...
} else {
...
}
while Statement
Beispiel:
i = 10;
while(i > 5) {
System.out.println(“i =“ + i);
i = i-1;
}
Gibt die Zahlen 10 9 8 7 6 auf den Bildschirm aus.
IVS, 2000
IVS-Java-Tutorium
Seite 15/20
Allgemein:
while (Bedingung) {
...
// Code falls Bedingung erfüllt
}
do while Statement
Das do while Statement funktioniert wie das Pascalkonstrukt REPEAT ... UNTIL.
Beispiel:
i = 10;
do {
System.out.println((“i =“ + i);
i = i-1;
} while(i > 5);
Gibt die Zahlen 10 9 8 7 6 5 auf den Bildschirm aus.
for Statement
Ähnlich dem FOR-Statement in Pascal. In Klammern stehen 3 Anweisungen:
Initialisierung ; Fortsetzungsbedingung ; Inkrement.
Beispiel:
for(i=0; i < v.length; i=i+1) {
v[i] = 1.0;
}
Setzt alle Felder des 1 dimensionalen Arrays v auf 1.0.
Allgemein:
for (Initialiserung; Fortsetzungsbedingung; Änderung der Laufvariable) {
... // Schleifencode
}
switch Statement
Beispiel:
switch (Scanner.nextCmd) {
case Scanner.Error: PrintError(); break;
case Scanner.Fire: Fire(); break;
default: Debug();
}
Entspricht dem Code
cmd = Scanner.nextCmd;
if (cmd == Scanner.Error) {
PrintError();
} else if (cmd == Scanner.Fire) {
Fire();
} else {
Debug();
}
Allgemein:
switch (Integerwert) {
case Wert1:
Code für Wert1;
break;
IVS, 2000
IVS-Java-Tutorium
Seite 16/20
case Wert2:
Code für Wert2;
break;
...
default:
Code für Default;
}
Soll derselbe Code für mehrere Bedingungen ausgeführt werden, dann können case Statements
hintereinander kaskadiert werden.
case Wert1:
case Wert2:
Code für Wert1 und Wert2
break;
Bemerkung: Falls Sie in einem switch Befehl einen Fehler vermuten, dann schauen Sie zuerst nach, ob Sie
alle notwendigen break Befehle eingegeben haben. Häufig ist das Vergessen dieses Befehles Ursache des
Fehlers. Fehlende break-Befehle haben zur Folge, dass der Code aller folgenden case-Statements
abgearbeitet wird; solange bis ein break erscheint.
IVS, 2000
IVS-Java-Tutorium
Seite 17/20
Unix-Kurzeinführung
Dateibezeichner
Ein Unix-Dateibezeichner besteht aus drei Teilen
• Pfad
• Dateiname
• Dateisuffix (Extension)
Beispiel:
/users/gruppe99/beispiel.txt
Unix Kommandos
pwd
gibt das aktuelle Arbeitsverzeichnis zurück
ls <pfad>
listet alle Dateinamen in dem Verzeichnis <pfad> oder im aktuellem
Verzeichnis, falls kein <pfad> angegeben wurde
cat <dat> | more
gibt die Datei <dat> seitenweise auf dem Bildschirm aus
cd <pfad>
wechselt das Arbeitsverzeichnis
rm <dat>
löscht unwiderruflich die Datei <dat>
cp <dat1> <dat2>
kopiert Inhalt der Datei <dat1> in <dat2>
mv <dat1> <dat2>
verschiebt die Datei <dat1> nach <dat2>
IVS, 2000
IVS-Java-Tutorium
Seite 18/20
Java Quiz
Versuchen Sie mit Hilfe der folgenden Fragen Ihre Java-Kenntnisse zu vervollständigen.
Multiple choice
Kreuzen Sie die korrekten Alternativen an. Es ist mindestens eine richtig.
Aufgabe 1.1: Welcher Befehl dient dazu, die fertig übersetzte Application „test“ auszuführen?
¨ javac test.java
¨ java test.class
¨ java test
¨ java TEST
Aufgabe 1.2: Was ist ein gültiger Dateiname für eine Quelldatei, die die öffentlich Klasse “Config“ enthält?
¨ test.java
¨ config.java ¨ Config.java ¨ Config.jav
¨ config.c
Aufgabe 1.3: Welches sind in Java gültige Bezeichner?
¨ störung
¨ _count
¨ double
¨ “var“
¨ counter
¨ f22 ¨ 2x
¨ $test$
¨ %init
Aufgabe 1.4: Welcher Ausdruck legt ein neues String-Objekt an?
¨ String st=“Dies ist ein Test.“;
¨ String st=new String(“Dies ist ein Test.“);
¨ String st=new String("ein "+"test"); ¨ String st;
¨ String st=null;
Aufgabe 1.5: Welcher Ausdruck legt eine Variable vom Typ int an?
¨ int i=new int(53);
¨ int i=25;
¨ int i=new int(4.2);
¨ int i=8+5;
¨ int i;
Aufgabe 1.6: Was sind gültige Datentypen in Java?
¨ int ¨ String
¨ File ¨ Double
¨ byte ¨ word¨ boolean
¨ char ¨ Integer
¨ long
Aufgabe 1.7: Welche der folgenden Schleifen wird genau zehnmal ausgeführt?
¨ for (int i=0; i<10; i++) {}
¨ int i=11; while (--i>0) {}
¨ for (int i=1; i<=10; i++) {}
¨ for (int i=1; i<10; i++) {}
¨ int j=11; do { j--; } while (j>1);
¨ for (int k=0; k<13; k++) { if (k==9) break; }
IVS, 2000
IVS-Java-Tutorium
Seite 19/20
Wahr oder falsch?
Entscheiden Sie sich, ob Sie den folgenden Aussagen zustimmen (þ), oder nicht (ý).
¨ Java ist eine Interpretersprache, d.h. der Quellcode wird während der Ausführung in Maschinenbefehle
umgesetzt.
¨ Java ist wie C++ eine objektorientierte, höhere Programmiersprache.
¨ Bei der Eingabe eines Java-Programmes muss man darauf achten, keine zusätzlichen Zeilenumbrüche
oder Leerzeichen zwischen den Befehlen einzufügen, da es sonst zu Fehlern kommen kann.
¨ Wenn die Kapazität eines „int“ (32 bit) nicht ausreicht, kann man mit der Vorsilbe „long“ einen 64 bit
„long int“ Datentypen vereinbaren.
¨ In Java kann man wegen der Einschränkungen des hier verwendeten ASCII-Zeichensatzes nicht alle
nationalen Sonderzeichen verwenden.
¨ Wenn ein Java-Programm keine „import“-Befehle enthält, benötigt es keine anderen Packages und kann
ohne die Standardklassen ausgeführt werden.
¨ Nach dem Übersetzen durch den Compiler wird das Java-Programm mit seinen Bibliotheken zu einer
ausführbaren Datei (z.B. „test.exe“) zusammengelinkt.
¨ Die in der Hauptklasse einer Application befindliche main-Methode muss zwingend als static deklariert
werden, damit sie trotz einer beliebigen Anzahl von Instanzen nur einmal existiert.
¨ In einer Klasse als „private“ deklarierte Methoden können ausschließlich von der Klasse selbst und
deren Subklassen, nicht aber von solchen, die eine Instanz der Klasse nutzen, aufgerufen werden.
¨ Eine Klasse kann nur dann gleichzeitig „abstract“ und „final“ sein, wenn in Subklassen keine ihrer
Methoden überschrieben wird.
¨ Der Ausdruck „i+=1“ ist identisch mit den Ausdrücken „i++“, „++i“ und „i=i+1“.
¨ Im Unterschied zu C++ sind Strings in Java keine aus chars zusammengesetzten Felder, sondern
vollwertige Objekte.
¨ Man kann Zeichenketten mit dem „+“-Operator verknüpfen.
¨ Greift man bei Feldern auf Elemente außerhalb des definierten Bereiches zu, kann das zu
unvorhergesehenen Resultaten führen.
¨ Mit Applications kann man weder Benutzeroberflächen noch Menüs, o.ä. darstellen.
¨ Applications können auf beliebige lokale oder Netzresourcen zugreifen, so weit der Benutzer den nötigen
Zugang dazu hat.
¨ Zur Ausführung von Applets benötigt man einen Java-kompatiblen WWW-Browser.
¨ Wird einer Methode eine Variable als Argument übergeben, so arbeitet diese mit einer lokalen Kopie der
Variable.
¨ Wenn die Variable „i“ vom Typ „int“ ist, erzeugt folgender Ausdruck einen Compilerfehler: „if(i);“.
¨ Eine Variable vom Typ „int“ kann verlustfrei in den Typ „float“ umgewandelt werden.
¨ Wenn man beim Aufruf einer Methode die Klammern hinter dem Namen weglässt, wird diese wie eine
Variable behandelt.
¨ Wenn eine Klasse eine Methode ihrer Superklasse überschreibt, kann sie auf die überschriebene
Methode der Superklasse nicht mehr zugreifen.
IVS, 2000
IVS-Java-Tutorium
Seite 20/20
¨ Wenn man vergisst, angeforderten Speicher bei Beenden eines Java-Programmes wieder freizugeben,
kann das System aufgrund der nicht zugeordneten Ressourcen instabil werden.
¨ Ein „switch“-Block führt je nach Inhalt einer beliebigen Variable unterschiedlichen Programmcode aus.
IVS, 2000
Herunterladen