MarktundTechnik Home-Page

Previous Page TOC Index Next Page See Page


3. Tag

Java-Grundlagen

von Laura Lemay

Am 1. und 2. Tag haben Sie allgemeine Dinge über die Java-Programmierung gelernt - was ein Java-Programm ist, wie ein ausführbares Applet aussieht und wie einfache Klassen angelegt werden. Den Rest dieser Woche lernen Sie Einzelheiten und befassen sich mit spezifischen Aspekten, wie die Java-Sprache aussieht.

Heute definieren Sie keine Klassen oder Objekte und machen sich auch keine Gedanken, wie diese innerhalb eines Java-Programms miteinander kommunizieren müssen. Statt dessen befassen Sie sich mit einfachen Java-Anweisungen. Das sind die grundlegenden Dinge, die in Java in einer Methodendefinition wie main()erreicht werden können.

Sie lernen heute folgendes:

Java ist C und C++ sehr ähnlich. Ein Großteil der Syntax ist Ihnen vertraut, wenn Sie in diesen Sprachen arbeiten. Sind Sie ein erfahrener C- oder C++-Programmierer, lohnt sich für Sie die Beachtung der Technischen Infos (wie diese hier), weil sie zusätzliche Informationen über die spezifischen Unterschiede zwischen diesen und anderen herkömmlichen Sprachen und Java liefern.

Anweisungen und Ausdrücke

Anweisungen sind in Java einfach und bilden jeweils eine einzelne Java-Operation. Nachfolgend Beispiele von einfachen Java-Anweisungen:

int i = 1;

import java.awt.Font;

System.out.println("This motorcycle is a "

   + color + " " + make);

m.engineState = true;

Anweisungen geben manchmal Werte aus, z. B. wenn Sie zwei Zahlen addieren oder prüfen, ob ein Wert einem anderen entspricht. Diese Arten von Anweisungen nennt man Ausdrücke. Diese werden heute noch diskutiert.

Wichtig für Java-Anweisungen ist, daß jede mit einem Semikolon endet. Vergessen Sie ein Semikolon, wird Ihr Java-Programm nicht kompiliert.

In Java gibt es auch Mischanweisungen bzw. Blöcke, die irgendwo in einer Anweisung stehen können. Blockanweisungen werden zwischen geschweiften Klammern ({}) gesetzt. Sie lernen in Kapitel 5 mehr über Blöcke.

Variablen und Datentypen

Variablen sind Stellen im Speicher, in denen Werte gespeichert werden können. Sie haben einen Namen, einen Typ und einen Wert. Bevor Sie eine Variable benutzen können, müssen Sie sie deklarieren. Danach können Sie ihr Werte zuweisen.

Java kennt drei Arten von Variablen: Instanzvariablen, Klassenvariablen und lokale Variablen.

Wie Sie gestern schon gelernt haben, werden Instanzvariablen zum Definieren von Attributen oder des Zustands eines bestimmten Objekts benutzt. Klassenvariablen sind mit Instanzvariablen vergleichbar, außer, daß ihre Werte auf alle Instanzen der jeweiligen Klasse (und die Klasse selbst) zutreffen, also nicht für jedes Objekt einen anderen Wert haben.

Lokale Variablen werden innerhalb von Methodendefinitionen deklariert und benutzt, z. B. für Indexzähler in Schleifen, als temporäre Variablen oder zum Aufnehmen von Werten, die Sie nur innerhalb einer Methodendefinition brauchen. Sie können auch in Blöcken ({}) benutzt werden. Diese Anwendung lernen Sie später in dieser Woche. Nach der Ausführung der Methode (oder des Blocks) hört die Variablendefinition und ihr Wert auf zu existieren. Sie benutzen lokale Variablen zum Speichern von Informationen, die in einer einzigen Methode benötigt werden, und Instanzvariablen zum Speichern von Informationen, die in mehreren Methoden eines Objekts benutzt werden.

Obwohl alle drei Variablenarten auf die gleiche Weise deklariert werden, unterscheidet sich der Zugriff auf Klassen- und Instanzvariablen und deren Zuweisung geringfügig von lokalen Variablen. Heute konzentrieren wir uns auf Variablen in Methodendefinitionen. Morgen lernen Sie den Umgang mit Instanz- und Klassenvariablen.

Im Gegensatz zu anderen Sprachen hat Java keine globalen Variablen, d. h. Variablen, die global für alle Teile eines Programms gelten. Instanz- und Klassenvariablen können benutzt werden, um globale Informationen zwischen Objekten auszutauschen. Da Java eine objektorientierte Sprache ist, sollten Sie in Objekten und deren Interaktion denken und weniger an Programme im herkömmlichen Sinn.

Variablen deklarieren

Um eine Variable in einem Java-Programm nutzen zu können, muß sie zuerst deklariert werden. Die Deklaration von Variablen besteht aus einem Typ und einem Namen:

int myAge;

String myName;

boolean isTired;

Variablendefinitionen können irgendwo in einer Methodendefinition stehen (d. h. überall, wo eine Java-Anweisung stehen kann). Üblicherweise werden sie aber am Anfang der Definition deklariert:

public static void main (String args[])   {

   int count;

   String title;

   boolean isAsleep;

...

}

Sie können Variablennamen gleichen Typs auch verketten:

int x, y, z;

String firstName, LastName;

Außerdem können Sie jeder Variablen bei der Deklaration einen Anfangswert zuweisen:

int myAge, mySize, numShoes = 28;

String myName = "Laura";

boolean isTired = true;

int a = 4, b = 5, c = 6;

Stehen in einer Zeile mit nur einem Initialisierer mehrere Variablen (wie im ersten der obigen Beispiele), trifft der Anfangswert nur auf die letzte Variable der Deklaration zu. Sie können einzelne Variablen und Initialisierer in der gleichen Zeile mit Kommas gruppieren, wie im letzten Beispiel oben.

Lokale Variablen müssen Werte haben, bevor sie benutzt werden können (Ihr Java-Programm wird nicht kompiliert, wenn es eine nicht zugewiesene lokale Variable enthält). Aus diesem Grund müssen lokalen Variablen immer Anfangswerte zugewiesen werden. Diese Einschränkung trifft auf die Deklaration von Instanz- und Klassenvariablen nicht zu (ihr Anfangswert hängt vom Variablentyp ab: null für Klasseninstanzen, 0 für numerische Variablen, '\0' für Zeichen und false für boolesche Variablen).

Variablennamen

In Java können Variablennamen mit einem Buchstaben, einem Unterstreichungsstrich (_) oder einem Dollarzeichen ($) beginnen. Sie dürfen nicht mit einer Zahl beginnen. Nach dem ersten Zeichen kann ein Variablenname jeden Buchstaben und jede Zahl enthalten. Symbole wie %, *, @ usw. sind in Java meist für Operatoren reserviert und sollten deshalb in Variablennamen nicht verwendet werden.

Darüber hinaus benutzt die Java-Sprache den Unicode-Zeichensatz. Unicode ist eine Zeichensatzdefinition, die nicht nur die Zeichen des ASCII-Zeichensatzes, sondern auch mehrere Millionen andere Zeichen zur Darstellung der meisten Landessprachen bietet. Das bedeutet, daß Sie akzentierte Zeichen und andere Sonderzeichen in Variablennamen benutzen können, sofern ihre Unicode-Zeichennummer über 00C0 liegt.

Die Unicode-Spezifikation ist ein zweibändiger Listensatz mit Tausenden von Zeichen. Wenn Sie Unicode nicht kennen oder glauben, keine Verwendung dafür zu haben, ist es besser, nur einfache Zahlen und Buchstaben in Variablennamen zu verwenden. Sie lernen später mehr über Unicode.

In der Java-Sprache wird Groß- und Kleinschreibung beachtet, was bedeutet, daß sich großgeschriebene Buchstaben von kleingeschriebenen unterscheiden. Das heißt, daß die Variable X nicht gleich x und rose nicht Rose oder ROSE ist. Denken Sie daran, wenn Sie Ihre eigenen Java-Programme schreiben oder Java-Code lesen, den andere Leute geschrieben haben.

Java-Variablen haben grundsätzlich aussagefähige Namen, die oft aus mehreren zusammengesetzten Wörtern bestehen. Das erste Wort ist klein geschrieben, während alle ohne Leerzeichen folgenden Wörter mit großem Anfangsbuchstaben geschrieben werden:

Button theButton;

long reallyBigNumber;

boolean currentWeatherStateOfPlanetXShortVersion;

Variablentypen

Zusätzlich zum Variablennamen muß jede Variablendeklaration einen Typ haben, der bestimmt, welche Werte die Variable annehmen kann. Der Variablentyp kann

sein. Sie lernen in Kapitel 5, wie Array-Variablen deklariert und benutzt werden.

Die acht primitiven Datentypen handhaben übliche Typen für Ganzzahlen, Gleitpunktzahlen, Zeichen und boolesche Werte (true oder false). Man nennt sie primitiv, weil sie im System integriert und keine eigentlichen Objekte sind. Deshalb ist ihre Verwendung effizienter. Beachten Sie, daß diese Datentypen maschinenunabhängig sind, was bedeutet, daß ihre Größe und Merkmale in allen Ihren Java-Programmen konsistent sind.

In Java gibt es vier Ganzzahlentypen mit je einem anderen Wertebereich (siehe Tabelle 3.1). Alle können entweder positive oder negative Zahlen aufnehmen. Welchen Typ Sie für Ihre Variablen wählen, hängt vom Wertebereich ab, den eine Variable aufnehmen soll. Wird ein Wert zu groß für den Variablentyp, wird er abgeschnitten.


Typ

Größe

Bereich

Byte

Short

Ganzzahl

Long

8 Bits

16 Bits

32 Bits

64 Bits

-127 bis 127

-32.768 bis 32.767

-2.147.483.648 bis 2.147.483.647

-9223372036854775808 bis 922337203685477807

Tabelle 3.1: Ganzzahlentypen


Gleitpunktzahlen werden für Zahlen mit einem Dezimalteil benutzt. In Java entsprechen die Gleitpunktzahlen IEEE 754 (einer internationalen Norm zur Definition von Gleitpunktzahlen und Arithmetik). Ferner gibt es zwei Gleitpunkttypen: float (32 Bits, einzelne Genauigkeit) und double (64 Bits, doppelte Genauigkeit).

Der Typ char wird für einzelne Zeichen benutzt. Da Java den Unicode-Zeichensatz verwendet, hat der Typ char eine Genauigkeit von 16 Bits.

Der Typ boolean kann den Wert true oder false haben. Im Gegensatz zu anderen C-ähnlichen Sprachen ist boolean keine Zahl und kann auch nicht als solche behandelt werden. Alle Tests von booleschen Variablen sollten auf true oder false prüfen.

Zusätzlich zu den acht grundlegenden Datentypen können Variablen in Java auch so deklariert werden, daß sie eine Instanz einer bestimmten Klasse aufnehmen:

String LastName;

Font basicFont;

OvalShape myOval;

Jede dieser Variablen kann nur Instanzen der jeweiligen Klasse aufnehmen. Wenn Sie neue Klassen erstellen, können Sie Variablen deklarieren, die Instanzen dieser Klassen (und ihrer Subklassen) enthalten.

Java hat keine typedef-Anweisung (wie C und C++). Um neue Typen in Java zu deklarieren, deklarieren Sie eine neue Klasse. Dann können Variablen als Typ dieser Klasse deklariert werden.

Werte für Variablen zuweisen

Nachdem Sie eine Variable deklariert haben, können Sie ihr einen Wert zuweisen, indem Sie den Zuweisungsoperator = verwenden:

size = 14;

tooMuchCaffiene = true;

Kommentare

In Java gibt es drei Arten von Kommentaren: mehrzeilige Kommentare stehen zwischen /* und */, wie in C oder C++. Der gesamte Text zwischen den zwei Begrenzern wird ignoriert:

/*   Ich weiß nicht, wie der nächste Teil zustandegekommen ist. Ich habe bis spät

in die Nacht gearbeitet und er ergab sich einfach so. Vielleicht haben Elfen

das für mich gemacht.

*/

Kommentare können nicht verschachtelt werden. Außerdem kann innerhalb eines Kommentars kein anderer Kommentar stehen.

Für eine einzelne Kommentarzeile werden doppelte Schrägstriche (//) benutzt. Der gesamte Text bis zum Zeilenende wird dann ignoriert:

int vices = 7; // Sind das wirklich nur sieben?

Die letzte Kommentarart beginnt mit /** und endet mit */. Das sind spezielle Kommentare, die für das javadoc-System benutzt werden. Javadoc dient zum Erzeugen von API-Dokumentation aus dem Code. Sie lernen in diesem Buch nichts über javadoc. Sie finden hierüber Informationen in der Dokumentation, die Sie mit dem Sun Java Developer's Kit erhalten haben, oder in der Java Home-Page von Sun (http://java.sun.com).

Literale

Literale dienen zum Bezeichnen einfacher Werte in einem Java-Programm.

Literal ist ein Fachbegriff für Programmiersprachen, der im wesentlichen bedeutet, daß Sie das erhalten, was Sie eingeben. Wenn Sie in einem Java-Programm 4 tippen, erhalten Sie automatisch eine Ganzzahl mit dem Wert 4. Geben Sie 'a' ein, erhalten Sie ein Zeichen mit dem Wert a.

Literale sind größtenteils selbsterklärend, jedoch gibt es in Java ein paar Sonderfälle für unterschiedliche Arten von Zahlen, Zeichen, Zeichenketten und boolesche Werte.

Zahlenliterale

Es gibt mehrere Ganzzahlenliterale. 4 ist beispielsweise ein dezimales Ganzzahlliteral vom Typ int (obwohl Sie ihm einer Variablen vom Typ byte oder short zuweisen können, weil sie klein ist und damit in solche Typen paßt). Ein dezimales Ganzzahlintegral, das größer ist als int, erhält automatisch den Typ long. Sie können long auch eine kleinere Zahl aufzwingen, indem Sie L oder 1 an diese Zahl anhängen (4L ist z. B. eine lange Ganzzahl mit dem Wert 4). Negativen Ganzzahlen wird ein Minuszeichen vorangestellt, z. B. -45.

Ganzzahlen können auch oktal oder hexadezimal ausgedrückt werden: Eine führende 0 zeigt an, daß eine Zahl oktal ist, z. B. 0777 oder 0004. Ein führendes 0x (oder 0X) bedeutet, daß die Zahl hexadezimal ist (0xFF, 0XAF45). Hexadezimale Zahlen können normale Ziffern (0-9) und groß- oder kleingeschriebene Hexzeichen (a-f oder A-F) enthalten.

Gleitpunktliterale bestehen normalerweise aus zwei Teilen: der Ganzzahl und dem Dezimalteil, z. B. 5.677777. Gleitpunktliterale ergeben Gleitpunktzahlen vom Typ double, ungeachtet der Genauigkeit der Zahl. Sie können der Zahl den Typ float aufzwingen, indem Sie den Buchstaben f (oder F) an die Zahl anhängen, z. B. 2.56F.

Mit dem Buchstaben e oder E, gefolgt von dem Exponenten (der eine negative Zahl sein kann), können Sie in Gleitpunktliteralen Exponenten verwenden, z. B. 10e45 oder .36E-2.

Boolesche Literale

Boolesche Literale haben die Schlüsselwörter true und false. Diese Schlüsselwörter können überall dort benutzt werden, wo Sie sie brauchen, um einen Test auszuführen, oder auch als einzig mögliche Werte für boolesche Variablen.

Zeichenliterale

Zeichenliterale werden durch ein einzelnes Zeichen, das zwischen einzelnen Anführungszeichen steht, ausgedrückt: 'a', '#', '3' usw. Die Zeichen werden als Unicode-Zeichen mit 16 Bits gespeichert. Tabelle 3.2 führt die speziellen Codes auf, die nichtdruckbare Zeichen darstellen, und Zeichen aus dem Unicode-Zeichensatz. Der Buchstabe d in Oktal-, Hex- oder Unicode-Escape stellt eine Zahl oder eine hexadezimale Ziffer dar (a-f oder A-F).


Escape

Bedeutung

\n

\t

\b

\r

\f

\\

\'

\"

\ddd

\xdd

\uddd


Neue Zeile

Tab

Rückschritt (Backspace)

Wagenrücklauf (Return)

Formularvorschub (Formfeed)

Backslash

Einzelnes Anführungszeichen

doppeltes Anführungszeichen

Oktal

Hexadezimal

Unicode-Zeichen

Tabelle 3.2: Escape-Zeichen

Für C- und C++-Programmierer ist interessant, daß Java keine Zeichencodes für \a (Glocke) und \v (vertikaler Tab) beinhaltet.

Zeichenkettenliterale

Mehrere Zeichen zusammen bilden eine Zeichenkette (String). In Java sind Zeichenketten Instanzen der Klasse String. Zeichenketten sind keine einfachen Zeichen-Arrays wie in C oder C++, obwohl sie viele arrayähnliche Merkmale aufweisen (z. B. können Sie ihre Länge testen und einzelne Zeichen hinzufügen und löschen). Da String-Objekte in Java echte Objekte sind, umfassen sie Methoden, die es Ihnen ermöglichen, Zeichenketten sehr einfach zu kombinieren, zu testen und zu ändern.

Zeichenkettenliterale bestehen aus mehreren Zeichen zwischen doppelten Anführungszeichen:

"Hi, I am a string literal."

"" //Leere Zeichenkette

Zeichenketten können Konstanten wie neue Zeile, Tab und Unicode-Zeichen enthalten:

"A string with a \t tab in it"

"Nested strings are \"strings inside of\" other strings"

"This string brought to you by Java\u2122"

Im letzten Beispiel produziert der Unicode-Code für \u2122 ein Warenzeichensymbol (`).

Nur aus dem Grund, daß Sie ein Zeichen durch ein Unicode-Escape darstellen können, bedeutet nicht, daß das jeweilige Zeichen auf Ihrem Rechner angezeigt werden kann. Der Rechner oder das Betriebssystem unterstützt eventuell nicht Unicode, oder der verwendete Font hat kein Bild für dieses Zeichen. Unicode-Escapes bieten in Java lediglich eine Möglichkeit, Sonderzeichen für Systeme, die Unicode unterstützen, zu codieren.

Wenn Sie in Ihrem Java-Programm ein Zeichenkettenliteral benutzen, erstellt Java automatisch eine Instanz der Klasse String, für die Sie einen Wert vergeben. Zeichenketten sind in dieser Hinsicht ungewöhnlich. Die anderen Literalen verhalten sich nicht so (keiner der primitiven Grundtypen ist ein Objekt). Beim Erstellen eines neuen Objekts ist es normalerweise nötig, explizit eine neue Instanz einer Klasse anzulegen. Sie lernen mehr über Zeichenketten, die String-Klasse und was Sie mit Zeichenketten alles machen können, später in der heutigen Lektion und morgen.

Ausdrücke und Operatoren

Ausdrücke sind in Java die einfachste Form von Anweisungen, die etwas bewirken.

Ausdrücke sind Anweisungen, die einen Wert ausgeben. Operatoren sind spezielle Symbole, die üblicherweise in Ausdrücken verwendet werden.

Arithmetik und Überprüfungen auf Gleichheit und Größe sind übliche Beispiele von Ausdrücken. Da sie einen Wert ausgeben, können Sie das Ergebnis einer Variablen zuweisen oder den Wert in anderen Java-Anweisungen testen.

Operatoren beinhalten in Java Arithmetik, verschiedene Zuweisungsarten, Inkrement und Dekrement und logische Operationen. Dies alles wird in diesem Abschnitt erklärt.

Arithmetik

Java umfaßt für grundlegende Arithmetik fünf Operatoren (siehe Tabelle 3.3).


Operator

Bedeutung

Beispiel

+

-

*

÷

%

Addition

Subtraktion

Multiplikation

Division

Modulus

3 + 4

5 - 7

5 * 5

14 ÷ 7

20 % 7
Tabelle 3.3: Arithmetische Operatoren

Jeder Operator hat zwei Operanden, je einen auf jeder Seite des Operators. Der Subtraktionsoperator (-) kann auch zum Verneinen eines einzelnen Operanden benutzt werden.

Die Division einer Ganzzahl ergibt eine Ganzzahl. Da Ganzzahlen keine Dezimalbrüche haben müssen, wird ein eventueller Rest ignoriert. Der Ausdruck 31 ÷ 9 ergibt z. B. 3 (9 ist in 31 nur dreimal vorhanden).

Der Modulus (%) gibt den Rest aus, nachdem die Operanden gleichmäßig dividiert wurden. 31 % 9 ergibt z. B. 4, weil 9 in 31 dreimal enthalten ist, so daß 4 übrigbleibt.

Beachten Sie, daß sich aus Ganzzahlen bei den meisten Operationen entweder der Typ int oder long ergibt, ungeachtet des Originaltyps des Operanden. Lange Ergebnisse erhalten den Typ long, alle anderen int. Arithmetische Operatoren, bei denen ein Operand eine Ganzzahl und ein anderer ein Gleitpunkt ist, führen zu einem Gleitpunktergebnis. (Falls Sie an den Einzelheiten interessiert sind, wie Java numerische Typen von einem Typ in einen anderen umwandelt, sehen Sie in der Java Language Specification nach. Dort steht mehr drin, als ich hier abdecken kann.)

Listing 3.1: Einfache Arithmetik

1:   class ArithmeticTest {

2:   public static void main (String[] args) {

3:      short x = 6;

4:      int y = 4;

5:      float a = 12.5f;

6:      float b = 7f;

7:

8:      System.out.println("x is " + x + ", y is " + y);

9:      System.out.println("x + y = " + (x + y));

10:      System.out.println("x - y = " + (x - y));

11:      System.out.println("x / y = " + (x / y));

12:      System.out.println("x % y = " + (x % y));

13:

14:      System.out.println("a is " + a + ", b is " + b);

15:      System.out.println("a / b = " + (a / b));

16:      }

17:

18:   }


x is 6, y is 4

x + y = 10

x - y = 2

x / y = 1

x % y = 2

a is 12.5, b is 7

a / b = 1.78571

In dieser einfachen Java-Anwendung (beachten Sie die main()-Methode) definieren Sie anfänglich vier Variablen in Zeilen 3 bis 6: x und y, die Ganzzahlen (Typ int) sind, und a und b, die Gleitpunktzahlen (Typ float) sind. Beachten Sie, daß der Standardtyp für Gleitpunktliterale (z. B. 12.5) double ist. Deshalb müssen Sie ein f nach jeder Zahl (Zeilen 5 und 6) eingeben, damit diese Zahlen den Typ float erhalten.

Der Rest des Programms führt lediglich einige mathematische Aufgaben mit Ganzzahlen und Gleitpunktzahlen aus und zeigt die Ergebnisse an.

Eine Sache ist an diesem Programm noch interessant: die Methode System.out.println(). Sie sind dieser Methode an den ersten Tagen schon begegnet, haben aber nicht gelernt, was es damit auf sich hat. Die Methode System.out.println() gibt lediglich eine Nachricht an die Standardausgabe Ihres Systems aus - auf dem Bildschirm, in einem speziellen Fenster oder in eine Logdatei, je nach System und Entwicklungsumgebung (JDK von Sun gibt am Bildschirm aus). Die Methode System.out.println() hat ein einzelnes Argument - eine Zeichenkette -, Sie können aber + benutzen, um Werte zu verketten, wie Sie später noch lernen.

Zuweisungen

Die Zuweisung von Variablen ist eine Form des Ausdrucks. Da ein Zuweisungsausdruck einen Wert ergibt, können Sie sie wie folgt verketten:

x = y = z = 0;

In diesem Beispiel haben alle drei Variablen den Wert 0.

Die rechte Seite eines Zuweisungsausdrucks wird immer bewertet, bevor die Zuweisung wirksam wird. Das bedeutet, daß Ausdrücke wie x = x + 2 zum richtigen Ergebnis führen. 2 wird zum Wert von x hinzuaddiert, dann wird dieser neue Wert x erneut zugewiesen. Das ist eine der üblichen Operationen, so daß Java mehrere Operatoren hat, um dafür Kurzformen zu verwenden, die aus C und C++ entlehnt sind. Tabelle 3.4 zeigt diese Kurzoperatoren für Zuweisungen.


Ausdruck

Bedeutung

x += y

x -= y

x *= y

x ÷= y

x = x + y 

x + x - y

x = x *y

x = x ÷ y

Tabelle 3.4: Zuweisungsoperatoren

Wenn Sie sich auf komplizierte Nebenwirkungen von Unterausdrücken auf einer Seite dieser Zuweisungen verlassen, entsprechen die Kurzausdrücke eventuell nicht ganz den ausgeschriebenen Gegenstücken. Weitere Informationen über sehr komplexe Ausdrücke, Bewertungsreihenfolgen und Nebenwirkungen finden Sie in der Java Language Specification.

Inkrement- und Dekrementausdrücke

Wie in C und C++ werden die Operatoren ++ und - - benutzt, um einen Wert um 1 zu erhöhen oder zu verringern. x++ erhöht z. B. den Wert von x um 1 auf die gleiche Weise wie der Ausdruck x = x + 1. x-- senkt den Wert von x um 1.

Diese Inkrement- und Dekrement-Operatoren können vorangestellt oder hinten angefügt werden. Das bedeutet, daß ++ oder - - vor oder nach dem zu erhöhenden oder zu senkenden Wert stehen kann. Bei einfachen Inkrement- und Dekrement-Operationen ist das nicht wichtig. In komplexen Zuweisungen, in denen das Ergebnis eines Inkrement- oder Dekrementausdrucks zugewiesen wird, gibt es einen Unterschied.

Betrachten wir beispielsweise folgende zwei Ausdrücke:

y = x++;

y = ++x;

Diese zwei Ausdrücke führen aufgrund der vorangestellten und nachgestellten Operatoren zu unterschiedlichen Ergebnissen. Mit den nachgestellten Operatoren (x++ oder x--) erhält y den Wert von x vor der Erhöhung von x. Mit den vorangestellten Operatoren wird der x-Wert y erst nach der Erhöhung zugewiesen. Wie das alles funktioniert, geht aus dem Beispiel in Listing 3.2 hervor.

Listing 3.2: Vorangestellte und nachgestellte Inkrement-Operatoren testen

1:   class PrePostFixTest {

2:

3:   public static void main (String args[]) {

4:      int x = 0;

5:      int y = 0;

6:

7:      System.out.println("x and y are " + x + " and " + y );

8:      x++;

9:      System.out.println("x++ results in " + x);

10:      ++x;

11:      System.out.println("++x results in " + x);

12:      System.out.println("Resetting x back to 0.");

13:      x = 0;

14:      System.out.println(" - - - - - - -");

15:      y = x++;

16:      System.out-println("y = x++ (postfix) results in:");

17:      System.out.println("x is " + x);

18:      System.out.println("y is " + y);

19:      System.out.println("- - - - - - -");

20:

21:      y = ++x;

22:      System.out.println("y = ++x (prefix) results in:");

23:      System.out.println("x is " + x);

24:      System.out.println("y is " + y);

25:      System.out.println("- - - - - - -");

26:

27:   }

28:

29:   }

x and y are 0 and 0

x++ results in 1

++x results in 2

Resetting x back to 0.

- - - - - - -

y = x++ (postfix) results in:

x is 1

y is 0

- - - - - - -

y = ++x (prefix) results in:

x is 2

y is 2

- - - - - - -

Im ersten Teil dieses Beispiels haben Sie x mit den Inkrement-Operatoren prefix und postfix erhöht. Beide Male wird x jeweils um 1 erhöht. In dieser einfachen Form funktioniert nur prefix oder nur postfix auf die gleiche Weise.

Im zweiten Teil dieses Beispiels verwenden Sie den Ausdruck y = x++, in dem der Inkrement-Operator postfix benutzt wird. In diesem Ergebnis wird der Wert von x erhöht, nachdem der Wert y zugewiesen wurde. Folglich wird y zuerst dem Originalwert von x (0) zugewiesen, dann wird x um 1 erhöht.

Im dritten Teil wird der prefix-Ausdruck y = ++x verwendet. Hier verläuft die Prozedur umgekehrt: x wird erhöht, bevor sein Wert y zugewiesen wird. Da x aus dem vorherigen Schritt 1 ist, wird sein Wert auf 2 erhöht, dann wird dieser Wert y zugewiesen. Sowohl x als auch y ergeben zum Schluß 2.

Vom technischen Gesichtspunkt ist diese Beschreibung nicht ganz richtig. In Wirklichkeit bewertet Java immer alle Ausdrücke rechts neben einem Ausdruck vollständig, bevor der Wert einer Variablen zugewiesen wird. Deshalb ist das Konzept der »Zuweisung von x auf y vor der Erhöhung von x« nicht ganz korrekt. Java merkt sich den Wert von x, bewertet (inkrementiert) x und weist den Originalwert von x dann y zu. Diese Unterscheidung ist in einfachen Fällen weniger wichtig, kann aber in komplexen Ausdrücken mit Nebenwirkungen das Verhalten des Ausdrucks insgesamt ändern. In der Java Language Specification finden Sie viele Einzelheiten über die Bewertung von Ausdrücken in Java.

Vergleiche

Java hat mehrere Ausdrücke zum Testen von Gleichheit und Größe. Alle diese Ausdrücke ergeben einen booleschen Wert (d. h. true oder false). Die Vergleichsoperatoren sind in Tabelle 3.5 aufgeführt:


Operator

Bedeutung

Beispiel

==

!=

<

>

<=

>=

Gleich

Nicht gleich

Kleiner als

Größer als

Kleiner gleich

Größer gleich

x = = 3

x != 3

x < 3

x > 3

x <= 3

x >= 3

Tabelle 3.5: Vergleichsoperatoren

Logische Operatoren

Ausdrücke, die boolesche Werte ergeben (wie beispielsweise die Vergleichsoperatoren), können mit logischen Operatoren, die die logischen Kombinationen AND, OR, XOR und das logische NOT darstellen, kombiniert werden.

Für AND-Kombinationen wird & oder && benutzt. Der Ausdruck ist nur wahr, wenn beide Operanden auch wahr sind. Ist ein Ausdruck falsch, ist der gesamte Ausdruck falsch. Der Unterschied zwischen den zwei Operatoren liegt in der Bewertung des Ausdrucks. Mit & werden beide Seiten des Ausdrucks ungeachtet des Ergebnisses bewertet. Mit && wird der ganze Ausdruck als falsch ausgegeben, wenn die linke Seite des Ausdrucks falsch ist, und die rechte Seite des Ausdrucks wird nicht bewertet.

Für OR-Ausdrücke wird oder verwendet. OR-Ausdrücke ergeben wahr, wenn einer oder beide Operanden ebenfalls wahr sind. Sind beide Operanden falsch, ist der Ausdruck falsch. Wie bei & und && bewertet das einzelne beide Seiten des Ausdrucks ungeachtet des Ergebnisses. Mit gibt der Ausdruck wahr aus, und die rechte Seite wird nie bewertet, wenn der linke Ausdruck wahr ist.

Der XOR-Operator ^ gibt nur wahr aus, wenn seine Operanden unterschiedlich sind (einer ist wahr, der andere falsch), andernfalls ist er falsch (auch wenn beide Operanden wahr sind).

Im allgemeinen werden nur && und häufig als logische Kombinationen benutzt. &, und ^ werden häufiger für bitweise logische Operationen verwendet.

Für NOT wird der Operator ! mit einem einzigen Ausdrucksargument benutzt. Der Wert des NOT-Ausdrucks ist die Verneinung des Ausdrucks. Wenn x wahr ist, ist !x falsch.

Bitweise Operatoren

Nachfolgend eine kurze Zusammenstellung der bitweisen Operatoren in Java. Sie stammen alle aus C und C++ und werden zur Durchführung von Operationen auf einzelne Bits in Ganzzahlen verwendet. In diesem Buch wird auf bitweise Operationen nicht eingegangen. Das ist ein Thema, das in Büchern über C oder C++ besser abgedeckt ist. Tabelle 3.6 faßt die bitweisen Operatoren zusammen.


Operator 

Bedeutung

&

¦

^

<<

>>

>>>

~

<<=

>>=

>>>=

x&=y

x¦=y

x^=y

Bitweises AND

Bitweises OR

Bitweises XOR

Verschiebung nach links

Verschiebung nach rechts

Verschiebung nach rechts,Füllnullen

Bitweises Komplement

Verschiebung nach links, Zuweisung (x = x << y)

Verschiebung nach rechts, Zuweisung (x = x >> y)

Shift rechts, Füllnullen, Zuweisung (x = x >>> y)

AND-Zuweisung (x = x & y)

OR-Zuweisung (x + x ¦ y)

NOT-Zuweisung (x = x ^ y)

Tabelle 3.6: Bitweise Operatoren

Operatorpräzedenz

Durch die Operatorpräzedenz wird die Reihenfolge vorgegeben, in der Ausdrücke bewertet werden. Dadurch kann in manchen Fällen der Gesamtwert eines Ausdrucks ermittelt werden. Betrachten wir als Beispiel folgenden Ausdruck:

y = 6 + 4 ÷ 2

Je nach dem, ob der Ausdruck 6 + 4 oder 4 ÷ 2 zuerst bewertet wird, kann der Wert von y 5 oder 8 ergeben. Die Operatorpräzedenz gibt die Reihenfolge vor, in der Ausdücke bewertet werden, so daß das Ergebnis eines Ausdrucks vorhergesagt werden kann. Im allgemeinen werden Inkremente und Dekremente vor arithmetischen Ausdrücken, arithmetische Ausdrücke vor Vergleichen und Vergleiche vor logischen Ausdrücken bewertet. Zuweisungsausdrücke werden zuletzt bewertet.

Tabelle 3.8 zeigt die spezifische Präzedenz der verschiedenen Operatoren in Java. Die Operatoren oben in der Tabelle werden zuerst bewertet. Operatoren in der gleichen Zeile haben die gleiche Rangfolge und werden von links nach rechts bewertet, je nach dem, wie sie im Ausdruck erscheinen. Beim Ausdruck y = 6 + 4 ÷ 2 wissen Sie jetzt anhand der Tabelle, daß die Division vor der Addition bewertet wird, deshalb ergibt sich für y ein Wert von 8:

Operator

Anmerkungen

. [] () Mit Klammern ( ) werden Ausdrücke gruppiert. Der Punkt (.) dient zum Zugriff auf Methoden und Variablen in Objekten und Klassen (wird morgen behandelt). [] wird für Arrays benutzt (wird später in dieser Woche diskutiert).
++ -- ! ~ instanceof Gibt je nach dem, ob das Objekt eine Instanz einer benannten Klasse oder einer Superklasse dieser Klasse ist, wahr oder falsch aus (wird morgen behandelt)
new (Typ)Ausdruck Der new-Operator wird zum Erstellen neuer Instanzen von Klassen benutzt. ( ) dient in diesem Fall zum Abbilden eines Wertes auf einen anderen Typ (darüber lernen Sie morgen mehr).
* ÷ % Multiplikation, Division, Modulus
+ - Addition, Subtraktion
<< >> >>> Bitweise Verschiebung nach links oder rechts
< > Relationale Vergleichstests
= = != Gleichheit
& AND
^ XOR
¦ OR
&& Logisches AND
¦¦ Logisches OR
?: Kurzcode für if...then...else (wird am 5.Tag behandelt)
* += -= *=÷=&= ^= &= ¦= <<= >>= >>>= verschiedene Zuweisungen

Tabelle 3.7: Operatorpräzedenz

Sie können die Reihenfolge, in der Ausdrücke bewertet werden, jederzeit ändern, indem Sie die zuerst zu bewertenden Ausdrücke zwischen Klammern setzen. Sie können Klammern verschachteln, um sicherzustellen, daß Ausdrücke in der gewünschten Reihenfolge bewertet werden (der innerste in Klammern stehende Ausdruck wird zuerst bewertet). Die folgenden Ausdrücke ergeben einen Wert von 5, weil der Ausdruck 6 + 4 zuerst bewertet wird, dann wird das Ergebnis dieses Ausdrucks (10) durch 2 geteilt:

y = (6 + 4) / 2

Klammern sind auch in Fällen nützlich, in denen die Reihenfolge eines Ausdrucks nicht ganz klar ist, d. h. sie machen den Code übersichtlicher. Das Einfügen von Klammern kann nicht schaden, deshalb können Sie reichlich davon Gebrauch machen, um die Bewertung von Ausdrücken übersichtlicher zu gestalten.

Zeichenkettenarithmetik

Ein besonderer Ausdruck in Java ist die Verwendung des Additionsoperators (+) zum Erstellen und Verketten von Zeichenketten (Strings). In den meisten bisherigen Beispielen haben Sie zahlreiche Zeilen gesehen, die in etwa so aussehen:

System.out.println(name + " is a " + color " beetle");

Die Ausgabe dieser Zeile (auf dem Standard-Ausgabegerät) ist eine einzelne Zeichenkette. Die Werte der Variablen (hier name und color) stehen innerhalb der Zeichenkette an den richtigen Stellen. Was also passiert hier?

In Zeichenketten und anderen Objekten erstellt der + Operator eine einzelne Zeichenkette, die die Verkettung aller Operanden beinhaltet. Ist einer der Operanden in der Zeichenverkettung keine Zeichenkette, wird er automatisch in eine Zeichenkette konvertiert, so daß es einfach ist, diese Arten von Ausgabezeilen zu erstellen.

Ein Objekt oder Typ kann in eine Zeichenkette konvertiert werden, wenn Sie die Methode toString() implementieren. Alle Objekte haben eine Standard-Zeichenkettendarstellung (Name der Klasse, gefolgt von Klammern), jedoch wird toString() von den meisten Klassen verborgen bzw. überschrieben, um eine aussagefähigere druckbare Darstellung zu liefern.

Die Zeichenverkettung vereinfacht den Aufbau von Zeilen wie im vorherigen Beispiel. Um eine Zeichenkette zu erstellen, fügen Sie einfach alle Teile, d. h. die Beschreibungen und die Variablen, zusammen und geben sie auf der Standardausgabe, z. B. am Bildschirm oder in einem Applet, aus.

Der Operator +=, den Sie schon gelernt haben, funktioniert ebenfalls bei Zeichenketten. Betrachten wir folgenden Ausdruck:

myName += " Jr.";

Dieser Ausdruck entspricht:

myName = myName + " Jr.";

genauso wie bei Zahlen. In diesem Fall wird der Wert von myName (der John Smith oder etwas ähnliches mit Jr. am Ende (John Smith Jr.) sein kann) geändert.

Zusammenfassung

Wie Sie in den ersten zwei Lektionen gelernt haben, besteht ein Java-Programm vorwiegend aus Klassen und Objekten. Klassen und Objekte bestehen ihrerseits aus Methoden und Variablen, während Methoden aus Anweisungen und Ausdrükken bestehen. Anweisungen und Ausdrücke haben Sie in der heutigen Lektion gelernt. Das sind die grundlegenden Bausteine, die es Ihnen ermöglichen, Klassen und Methoden zu erstellen und zu einem ausgewachsenen Java-Programm zusammenzusetzen.

Heute haben Sie auch Variablen gelernt, wie sie deklariert und wie ihnen Werte zugewiesen werden. Literale zum einfachen Erstellen von Zahlen, Zeichen und Zeichenketten. Operatoren für arithmetische Operationen, Tests und andere einfache Operationen. Mit dieser Basissyntax können Sie morgen lernen, wie man mit Objekten arbeitet und einfache nützliche Java-Programme schreibt.

Am Ende dieser Zusammenfassung finden Sie in Tabelle 3.8 eine Zusammenstellung aller Operatoren, die Sie heute gelernt haben, damit Sie sie jederzeit übersichtlich nachschlagen können.


Operator

Bedeutung

+

-

*

÷

%

<

>

<=

>=

= =

!=

&&

¦¦

!

&

¦

^

<<

>>

>>>

~

=

++

­

+=

-=

*=

÷=

%=

&=

¦=

<<=

>>=

>>>=

Addition

Subtraktion

Multiplikation

Division

Modulus

Kleiner als

Größer als

Kleiner gleich

Größer gleich

Gleich

Nicht gleich

Logisches AND

Logisches OR

Logisches NOT

AND

OR

XOR

Verschiebung nach links

Verschiebung nach rechts

Verschiebung nach rechts, Füllnullen

Komplement

Zuweisung

Inkrement

Dekrement

Addition und Zuweisung

Subtraktion und Zuweisung

Multiplikation und Zuweisung

Division und Zuweisung

Modulus und Zuweisung

AND und Zuweisung

OR und Zuweisung

Verschiebung nach links und Zuweisung

Verschiebung nach rechts und Zuweisung

Verschiebung nach, Füllnullen und Zuweisung

Tabelle 3.8: Zusammenstellung aller Operatoren


Fragen und Antworten

F: Ich habe nichts darüber gelesen, wie man Konstanten definiert.

A: Sie können in Java lokale Konstanten oder nur Konstanteninstanzen und Klassenvariablen erstellen. Das alles lernen Sie in der morgigen Lektion.

F: Was passiert, wenn man eine Variable als Ganzzahltyp deklariert und ihr dann eine Zahl zuweist, die über den Wertebereich der Variablen hinausreicht?

A: Vom logischen Gesichtspunkt müßte man annehmen, daß die Variable einfach in den nächstgrößeren Typ konvertiert wird, das ist aber nicht der Fall. Was wirklich passiert, nennt man Overflow (Überlauf). Das bedeutet, daß Zahlen, die über den Bereich der Variablen hinausreichen, auf die kleinstmögliche negative Zahl des jeweiligen Typs gekürzt werden, dann beginnt die Zählung wieder rückwärts hin zu Null.

Da dies zu verwirrenden (und falschen) Ergebnissen führen kann, muß man sicherstellen, daß für alle Zahlen der richtige Ganzzahltyp deklariert wird. Besteht auch nur der geringste Verdacht, daß sich durch eine Zahl mit dem jeweiligen Typ ein Überlauf ergibt, verwendet man sicherheitshalber den nächstgrößeren Typ.

F: Wie kann man den richtigen Typ für eine bestimmte Variable ermitteln?

A: Wenn Sie die Grundtypen (int, float, boolean) verwenden, besteht keine Möglichkeit. Sie können aber den Wert durch Casting (das lernen Sie morgen) in einen anderen Typ konvertieren.

Falls Sie mit Klassentypen arbeiten, können Sie den Operator instanceof verwenden. Auch hierüber lernen Sie morgen mehr.

F: Warum werden in Java so viele Kurzcodes für arithmetische und Zuweisungsoperatoren verwendet? Der Code wird dadurch doch unübersichtlich.

A: Die Java-Syntax basiert auf C++ und damit auf C. Eines der impliziten Ziele von C ist die Fähigkeit, mit minimalem Tippaufwand leistungsstarke Ergebnisse zu erzielen. Deshalb sind Kurzcodes üblich.

Es gibt keine Regel, die besagt, daß Sie diese Kurzformen für Operatoren in Ihren eigenen Programmen verwenden müssen. Wenn Sie finden, daß ausgeschriebener Code übersichtlicher ist, brauchen Sie die Kurzcodes nicht zu verwenden.


Copyright ©1996 Markt&Technik
Buch- und Software- Verlag GmbH
Alle Rechte vorbehalten. All rights reserved.

Schreiben Sie uns!

Previous Page TOC Index Next Page See Page