Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Exceptions
7 Generics<T>
8 Äußere.innere Klassen
9 Besondere Klassen der Java SE
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Bits und Bytes und Mathematisches
13 Datenstrukturen und Algorithmen
14 Threads und nebenläufige Programmierung
15 Raum und Zeit
16 Dateien, Verzeichnisse und Dateizugriffe
17 Datenströme
18 Die eXtensible Markup Language (XML)
19 Grafische Oberflächen mit Swing
20 Grafikprogrammierung
21 Netzwerkprogrammierung
22 Verteilte Programmierung mit RMI
23 JavaServer Pages und Servlets
24 Datenbankmanagement mit JDBC
25 Reflection und Annotationen
26 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort
Ihre Meinung?

Spacer
 <<   zurück
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
geb., mit DVD
1482 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1506-0
Pfeil 2 Sprachbeschreibung
  Pfeil 2.1 Elemente der Programmiersprache Java
    Pfeil 2.1.1 Token
    Pfeil 2.1.2 Textkodierung durch Unicode-Zeichen
    Pfeil 2.1.3 Literale
    Pfeil 2.1.4 Bezeichner
    Pfeil 2.1.5 Reservierte Schlüsselwörter
    Pfeil 2.1.6 Zusammenfassung der lexikalischen Analyse
    Pfeil 2.1.7 Kommentare
  Pfeil 2.2 Anweisungen formen Programme
    Pfeil 2.2.1 Was sind Anweisungen?
    Pfeil 2.2.2 Klassendeklaration
    Pfeil 2.2.3 Die Reise beginnt am main()
    Pfeil 2.2.4 Der erste Methodenaufruf: println()
    Pfeil 2.2.5 Atomare Anweisungen und Anweisungssequenzen
    Pfeil 2.2.6 Mehr zu print(), println() und printf() für Bildschirmausgaben
    Pfeil 2.2.7 Die API-Dokumentation
    Pfeil 2.2.8 Ausdrucksanweisung
    Pfeil 2.2.9 Erste Idee der Objektorientierung
    Pfeil 2.2.10 Modifizierer
  Pfeil 2.3 Datentypen, Typisierung, Variablen und Zuweisungen
    Pfeil 2.3.1 Primitive Datentypen im Überblick
    Pfeil 2.3.2 Variablendeklarationen
    Pfeil 2.3.3 Variablendeklaration mit Wertinitialisierung
    Pfeil 2.3.4 Zuweisungsoperator
    Pfeil 2.3.5 Wahrheitswerte
    Pfeil 2.3.6 Ganzzahlige Datentypen und Literale
    Pfeil 2.3.7 Das binäre (Basis 2), oktale (Basis 8), hexadezimale (Basis 16) Stellenwertsystem *
    Pfeil 2.3.8 Die Fließkommazahlen »float« und »double«
    Pfeil 2.3.9 Alphanumerische Zeichen
    Pfeil 2.3.10 Gute Namen, schlechte Namen
  Pfeil 2.4 Blöcke, Initialisierung und Sichtbarkeit
    Pfeil 2.4.1 Gruppieren von Anweisungen mit Blöcken
    Pfeil 2.4.2 Initialisierung von lokalen Variablen
    Pfeil 2.4.3 Sichtbarkeit und Gültigkeitsbereich
  Pfeil 2.5 Ausdrücke, Operanden und Operatoren
    Pfeil 2.5.1 Ausdrücke
    Pfeil 2.5.2 Arithmetische Operatoren
    Pfeil 2.5.3 Unäres Minus und Plus
    Pfeil 2.5.4 Zuweisung mit Operation
    Pfeil 2.5.5 Präfix- oder Postfix-Inkrement und -Dekrement
    Pfeil 2.5.6 Die relationalen Operatoren und die Gleichheitsoperatoren
    Pfeil 2.5.7 Logische Operatoren: Nicht, Und,Oder, Xor
    Pfeil 2.5.8 Der Rang der Operatoren in der Auswertungsreihenfolge
    Pfeil 2.5.9 Die Typanpassung (das Casting)
    Pfeil 2.5.10 Überladenes Plus für Strings
    Pfeil 2.5.11 Operator vermisst *
  Pfeil 2.6 Bedingte Anweisungen oder Fallunterscheidungen
    Pfeil 2.6.1 Die if-Anweisung
    Pfeil 2.6.2 Die Alternative mit einer if-else-Anweisung wählen
    Pfeil 2.6.3 Der Bedingungsoperator
    Pfeil 2.6.4 Die switch-Anweisung bietet die Alternative
  Pfeil 2.7 Schleifen
    Pfeil 2.7.1 Die while-Schleife
    Pfeil 2.7.2 Die do-while-Schleife
    Pfeil 2.7.3 Die for-Schleife
    Pfeil 2.7.4 Schleifenbedingungen und Vergleiche mit ==
    Pfeil 2.7.5 Ausbruch planen mit break und Wiedereinstieg mit »continue«
    Pfeil 2.7.6 »break« und »continue« mit Marken *
  Pfeil 2.8 Methoden einer Klasse
    Pfeil 2.8.1 Bestandteil einer Methode
    Pfeil 2.8.2 Signatur-Beschreibung in der Java-API
    Pfeil 2.8.3 Aufruf einer Methode
    Pfeil 2.8.4 Methoden ohne Parameter deklarieren
    Pfeil 2.8.5 Statische Methoden (Klassenmethoden)
    Pfeil 2.8.6 Parameter, Argument und Wertübergabe
    Pfeil 2.8.7 Methoden vorzeitig mit return beenden
    Pfeil 2.8.8 Nicht erreichbarer Quellcode bei Methoden
    Pfeil 2.8.9 Rückgabewerte
    Pfeil 2.8.10 Methoden überladen
    Pfeil 2.8.11 Vorgegebener Wert für nicht aufgeführte Argumente *
    Pfeil 2.8.12 Finale lokale Variablen
    Pfeil 2.8.13 Rekursive Methoden *
    Pfeil 2.8.14 Die Türme von Hanoi *
  Pfeil 2.9 Zum Weiterlesen


Rheinwerk Computing - Zum Seitenanfang

2.3 Datentypen, Typisierung, Variablen und Zuweisungen  Zur nächsten ÜberschriftZur vorigen Überschrift

Java nutzt, wie es für imperative Programmiersprachen typisch ist, Variablen zum Ablegen von Daten. Eine Variable ist ein reservierter Speicherbereich und belegt – abhängig vom Inhalt – eine feste Anzahl von Bytes. Alle Variablen (und auch Ausdrücke) haben einen Typ, der zur Übersetzungszeit bekannt ist. Der Typ wird auch Datentyp genannt, da eine Variable einen Datenwert, auch Datum genannt, enthält. Beispiele für einfache Datentypen sind: Ganzzahlen, Fließkommazahlen, Wahrheitswerte und Zeichen. Der Typ bestimmt auch die zulässigen Operationen, denn Wahrheitswerte lassen sich nicht addieren, Ganzzahlen schon. Dagegen lassen sich Fließkommazahlen addieren, aber nicht Xor-verknüpfen. Da jede Variable einen vom Programmierer vorgegebenen festen Datentyp hat, der zur Übersetzungszeit bekannt ist und sich später nicht mehr ändern lässt, und Java stark darauf achtet, welche Operationen erlaubt sind, und auch von jedem Ausdruck spätestens zur Laufzeit den Typ kennt, ist Java eine statisch typisierte und streng (stark) typisierte Programmiersprache. [Während in der Literatur bei den Begriffen statisch getypt und dynamisch getypt mehr oder weniger Einigkeit herrscht, haben verschiedene Autoren unterschiedliche Vorstellungen von den Begriffen streng (stark) typisiert und schwach typisiert. ]


Hinweis In Java muss der Datentyp einer Variablen zur Übersetzungszeit bekannt sein. Das nennt sich dann statisch typisiert. Das Gegenteil ist eine dynamische Typisierung, wie sie etwa JavaScript verwendet. Hier kann sich der Typ einer Variablen zur Laufzeit ändern, je nachdem, was die Variable enthält.


Primitiv- oder Verweis-Typ

Die Datentypen in Java zerfallen in zwei Kategorien:

  • Primitive Typen. Die primitiven (einfachen) Typen sind die eingebauten Datentypen für Zahlen, Unicode-Zeichen und Wahrheitswerte.
  • Referenztypen. Mit diesem Datentyp lassen sich Objektverweise etwa auf Zeichenketten, Dateien oder Datenstrukturen verwalten.

Warum sich damals Sun für diese Teilung entschieden hat, lässt sich mit zwei Gründen erklären:

  • Zu der Zeit, als Java eingeführt wurde, kannten viele Programmierer die Syntax und Semantik von C(++) und ähnlichen imperativen Programmiersprachen. Zur neuen Sprache Java zu wechseln, fiel dadurch leichter, und es half, sich sofort auf der Insel zurechtzufinden. Es gibt aber auch Programmiersprachen wie Smalltalk, die keine primitiven Datentypen besitzen.
  • Der andere Grund ist die Tatsache, dass häufig vorkommende elementare Rechenoperationen schnell durchgeführt werden müssen und bei einem einfachen Typ leicht Optimierungen durchzuführen sind.

Wir werden uns im Folgenden erst mit primitiven Datentypen beschäftigen. Referenzen werden nur dann eingesetzt, wenn Objekte ins Spiel kommen. Die nehmen wir uns in Kapitel 3, »Klassen und Objekte«, vor.


Rheinwerk Computing - Zum Seitenanfang

2.3.1 Primitive Datentypen im Überblick  Zur nächsten ÜberschriftZur vorigen Überschrift

In Java gibt es zwei Arten eingebauter Datentypen:

  • arithmetische Typen (ganze Zahlen – auch integrale Typen genannt –, Fließkommazahlen nach IEEE 754, Unicode-Zeichen)
  • Wahrheitswerte für die Zustände wahr und falsch

Strings werden bevorzugt behandelt, sind aber lediglich Verweise auf Objekte. Die folgende Tabelle vermittelt dazu einen Überblick. Anschließend betrachten wir jeden Datentyp präziser.


Tabelle 2.6  Java-Datentypen und ihre Wertebereiche

Typ Belegung (Wertebereich)

boolean

true oder false

char

16-Bit-Unicode-Zeichen (0x0000 ... 0xFFFF)

byte

–2^7 bis 2^7 – 1 (–128 ... 127)

short

–2^15 bis 2^15 – 1 (–32.768 ... 32.767)

int

–2^31 bis 2^31 – 1 (–2.147.483.648 ... 2.147.483.647)

long

–2^63 bis 2^63 – 1 (–9.223.372.036.854.775.808 ... 9.223.372.036.854.775.807)

float

1,40239846E-45f … 3,40282347E+38f

double

4,94065645841246544E-324 ... 1,79769131486231570E+308


Es fällt bei den Ganzzahlen auf, dass es eine positive Zahl »weniger« gibt als negative.

Für float und double ist das Vorzeichen nicht angegeben, da die kleinsten und größten darstellbaren Zahlen sowohl positiv wie auch negativ sein können. Mit anderen Worten: Die Wertebereiche unterscheiden sich nicht – anders als etwa bei int – in Abhängigkeit vom Vorzeichen. Wer eine »klassische« Darstellung wünscht, kann sich das so verstellen: Der Wertebereich (vom double) ist 4,94065645841246544E-324 bis 1,79769131486231570E+308 bzw. mit dem Vorzeichen –4,94065645841246544E-324 bis –1,79769131486231570E+308. So könnten wir sagen, er reicht von etwa –4,9E-324 bis +1,8E+308. [Es gibt bei Fließkommazahlen noch »Sonderzahlen«, wie plus oder minus Unendlich, aber dazu später mehr. ]


Detailwissen Genau genommen sieht die Sprachgrammatik von Java keine negativen Zahlenliterale vor. Bei einer Zahl wie –1.2 oder –1 ist das Minus der unäre Operator und gehört nicht zur Zahl. Im Bytecode selbst sind die negativen Zahlen natürlich wieder abgebildet.


Die folgende Tabelle zeigt eine etwas andere Darstellung:


Tabelle 2.7  Java-Datentypen und ihre Größen und Formate

Typ Größe Format

Ganzzahlen

byte

8 Bit

Zweierkomplement

short

16 Bit

Zweierkomplement

int

32 Bit

Zweierkomplement

long

64 Bit

Zweierkomplement

Fließkommazahlen

float

32 Bit

IEEE 754

double

64 Bit

IEEE 754

Weitere Datentypen

boolean

1 Bit

true, false

char

16 Bit

16-Bit-Unicode


Zwei wesentliche Punkte zeichnen die primitiven Datentypen aus:

  • Alle Datentypen haben eine festgesetzte Länge, die sich unter keinen Umständen ändert. Der Nachteil, dass sich bei einigen Hochsprachen die Länge eines Datentyps ändern kann, besteht in Java nicht. In den Sprachen C(++) bleibt dies immer unsicher, und die Umstellung auf 64-Bit-Maschinen bringt viele Probleme mit sich. Bei der Betrachtung der Auflistung fällt auf, dass char 16 Bit lang ist.
  • Die numerischen Datentypen byte, short, int und long sind vorzeichenbehaftet, Fließkommazahlen sowieso. Dies ist leider nicht immer praktisch, aber wir müssen stets daran denken. Probleme gibt es, wenn wir einem Byte zum Beispiel den Wert 240 zuweisen wollen, denn der Wertebereich ist –128 bis 127. Ein char ist im Prinzip ein vorzeichenloser Ganzzahltyp.

Wenn wir also die numerischen Datentypen (lassen wir hier char außen vor) nach ihrer Größe sortieren wollten, könnten wir zwei Linien für Ganzzahlen und Fließkommazahlen aufbauen:

byte < short < int < long
float < double

In C# gibt es den Datentyp decimal, der mit 128 Bit (also 16 Byte) auch genügend Präzision bietet, um eine Zahl wie 0,000000000000000000000000001 auszudrücken.


Hinweis Die Klassen Byte, Integer, Long, Short, Character, Double und Float deklarieren die Konstanten MAX_VALUE und MIN_VALUE, die den größten und kleinsten zulässigen Wert des jeweiligen Wertebereichs bzw. die Grenzen der Wertebereiche der jeweiligen Datentypen angeben.

System.out.println( Byte.MIN_VALUE );       // –128
System.out.println( Byte.MAX_VALUE );       // 127
System.out.println( Character.MIN_VALUE );  // '\u0000'
System.out.println( Character.MAX_VALUE );  // '\uFFFF'
System.out.println( Double.MIN_VALUE );     // 4.9E-324
System.out.println( Double.MAX_VALUE );     // 1.7976931348623157E308


Rheinwerk Computing - Zum Seitenanfang

2.3.2 Variablendeklarationen  Zur nächsten ÜberschriftZur vorigen Überschrift

Mit Variablen lassen sich Daten speichern, die vom Programm gelesen und geschrieben werden können. Um Variablen zu nutzen, müssen sie deklariert (definiert [In C(++) bedeuten Definition und Deklaration etwas Verschiedenes. In Java kennen wir diesen Unterschied nicht und betrachten daher beide Begriffe als gleichwertig. Die Spezifikation spricht nur von Deklarationen. ] ) werden. Die Schreibweise einer Variablendeklaration ist immer die gleiche: Hinter dem Typnamen folgt der Name der Variablen. Sie ist eine Anweisung und wird daher mit einem Semikolon abgeschlossen. In Java kennt der Compiler von jeder Variablen und jedem Ausdruck genau den Typ.

Deklarieren wir ein paar (lokale) Variablen in der main()-Methode:

Listing 2.5  FirstVariable.java

public class FirstVariable
{
   public static void main( String[] args )
  {
    String  name;                // Name
    int     age;                 // Alter
    double  income;              // Einkommen
    char    gender;              // Geschlecht (f oder m)
    boolean isPresident;         // Ist Präsident (true oder false)
  }
}

Der Typname ist entweder ein einfacher Typ (wie int) oder ein Referenztyp. Viel schwieriger ist eine Deklaration nicht – kryptische Angaben wie in C gibt es in Java nicht. [Das ist natürlich eine Anspielung auf C, in dem Deklarationen wie char (*(*a[2])())[2] möglich sind. Gut, dass es mit cdecl ein Programm zum »Vorlesen« solcher Definitionen gibt. ] Ein Variablenname (der dann Bezeichner ist) kann alle Buchstaben und Ziffern des Unicode-Zeichensatzes beinhalten, mit der Ausnahme, dass am Anfang des Bezeichners keine Ziffer stehen darf. Auch darf der Bezeichnername mit keinem reservierten Schlüsselwort identisch sein.


Rheinwerk Computing - Zum Seitenanfang

2.3.3 Variablendeklaration mit Wertinitialisierung  Zur nächsten ÜberschriftZur vorigen Überschrift

Den Variablen kann gleich bei der Deklaration ein Wert zugewiesen werden. Hinter einem Gleichheitszeichen steht der Wert, der oft ein Literal ist. Eine Zuweisung gilt nur für immer genau eine Variable:

Listing 2.6  Obama.java

public class Obama
{
  public static void main( String[] args )
  {
    String  name = "Barack Hussein Obama II";
    int     age = 48;
    double  income = 400000;
    char    gender = 'm';
    boolean isPresident = true;
  }
}

Werden mehrere Variablen gleichen Typs bestimmt, so trennt sie ein Komma.


Beispiel Deklaration mehrerer Variablen auf einen Schlag. x und y bleiben uninitialisiert:

double x, y,
       bodyHeight = 183;


Rheinwerk Computing - Zum Seitenanfang

2.3.4 Zuweisungsoperator  Zur nächsten ÜberschriftZur vorigen Überschrift

In Java dient das Gleichheitszeichen = der Zuweisung (engl. assignment). [Die Zuweisungen sehen zwar so aus wie mathematische Gleichungen, doch existiert ein wichtiger Unterschied: Die Formel a = a + 1 ist – zumindest im Dezimalsystem ohne zusätzliche Algebra – mathematisch nicht zu erfüllen, da es kein a geben kann, das a = a + 1 erfüllt. Aus Programmiersicht ist es in Ordnung, da die Variable a um eins erhöht wird. ] Der Zuweisungsoperator ist ein binärer Operator, bei dem auf der linken Seite die zu belegende Variable steht und auf der rechten Seite ein Ausdruck:

int a;
a = 12 * 3;

Erst nach dem Auswerten des Ausdrucks kopiert der Zuweisungsoperator das Ergebnis in die Variable. Gibt es Laufzeitfehler, etwa durch eine Division durch null, gibt es keinen Schreibzugriff auf die Variable.

Beispiel zur Variablendeklaration, -initialisierung und -ausgabe

Schreiben wir ein einfaches Programm, das zwei Variablen deklariert und zuweist. Die Variablenbelegung erscheint anschließend auf dem Bildschirm:

Listing 2.7  DiscoData.java

public class DiscoData
{
  public static void main( String[] args )
  {
    boolean hasVisitors;
    hasVisitors = true;
    int numberOfPersons = 102220;

    System.out.print( "Sind Personen in der Disko? " );
    System.out.println( hasVisitors );
    System.out.println( "Wie viele? " + numberOfPersons );
  }
}

Die Zeile hasVisitors = true ist eine Zuweisung und somit ein Ausdruck (genau genommen ein Zuweisungsausdruck), da sie einen Wert liefert. Zuweisungsausdrücke können mit einem Semikolon abgeschlossen werden und sind dann Zuweisungsanweisungen. In unserem Fall initialisiert eine Zuweisungsanweisung die Variable hasVisitors mit true. Steht auf der rechten Seite keine Variable, so steht dort ein Literal, eine Konstante, wie in unserem Fall true, oder eine Verknüpfung mit einem Operator. Wir erwähnten bereits, dass es für Wahrheitswerte nur die Literale true und false gibt.

Das obige Beispiel macht ebenfalls deutlich, dass Strings mit dem Plus aneinandergehängt werden können; ist ein Teil kein String, so wird er in einen String konvertiert.

Zuweisungen sind auch Ausdrücke

Zwar finden sich Zuweisungen oft als Anweisungen wieder, doch können sie an jeder Stelle stehen, an der ein Ausdruck erlaubt ist, etwa in einem Methodenaufruf wie print():

int a = 1;                          // Deklaration mit Initialisierung
a = 2;                              // Anweisung mit Zuweisung
System.out.println( a = 3 );        // Ausdruck mit Zuweisung. Liefert 3

Das Gleichheitszeichen dient in Java nur der Zuweisung; in anderen Programmiersprachen wird die Zuweisung durch ein anderes Symbol deutlich gemacht, etwa wie in Pascal mit :=. Um Zuweisungen von Vergleichen trennen zu können, definiert Java hier der C(++)-Tradition folgend einen binären Vergleichsoperator ==. Der Vergleichsoperator liefert den Ergebnistyp boolean:

System.out.println( a == 3 );       // Ausdruck mit Vergleich. Liefert true

Mehrere Zuweisungen in einem Schritt

Zuweisungen der Form a = b = c = 0; sind erlaubt und gleichbedeutend mit den drei Anweisungen c = 0; b = c; a = b;. Die explizite Klammerung a = (b = (c = 0)) macht noch einmal deutlich, dass sich Zuweisungen verschachteln lassen und Zuweisungen wie c = 0 Ausdrücke sind, die einen Wert liefern. Doch auch dann, wenn wir meinen, dass

a = (b = c + d) + e;

eine coole Vereinfachung im Vergleich zu

b = c + d;
a = b + e;

ist, sollten wir mit einer Zuweisung pro Zeile auskommen.

Die Reihenfolge der Auswertung zeigt anschaulich folgendes Beispiel:

int b = 10;
System.out.println( (b = 20) * b );    // 400

Rheinwerk Computing - Zum Seitenanfang

2.3.5 Wahrheitswerte  Zur nächsten ÜberschriftZur vorigen Überschrift

Der Datentyp boolean beschreibt einen Wahrheitswert, der entweder true oder false ist. Die Zeichenketten true und false sind reservierte Wörter und bilden neben konstanten Strings und primitiven Datentypen Literale. Kein anderer Wert ist für Wahrheitswerte möglich, insbesondere werden numerische Werte nicht als Wahrheitswerte interpretiert.

Der boolesche Typ wird beispielsweise bei Bedingungen, Verzweigungen oder Schleifen benötigt.


Rheinwerk Computing - Zum Seitenanfang

2.3.6 Ganzzahlige Datentypen und Literale  Zur nächsten ÜberschriftZur vorigen Überschrift

Java stellt vier ganzzahlige Datentypen zur Verfügung: byte, short, int und long. Die feste Länge von jeweils 1, 2, 4 und 8 Byte ist eine wesentliche Eigenschaft von Java. Ganzzahlige Typen (mit der Ausnahme von char, wenn wir diesen auch in die Reihe einordnen möchten) sind in Java immer vorzeichenbehaftet; einen Modifizierer unsigned wie in C(++) gibt es nicht. [In Java bilden long und short einen eigenen Datentyp. Sie dienen nicht wie in C(++) als Modifizierer. Eine Deklaration wie long int ist also falsch. Auf den iSeries-Servern von IBM – früher AS/400 – gibt es auch einen Datentyp unsigned long long int. ] Negative Zahlen werden durch Voranstellen eines Minuszeichens gebildet. Ein Pluszeichen für positive Zeichen ist möglich. int und long sind die bevorzugten Typen. byte kommt selten vor und short nur in wirklich sehr seltenen Fällen, etwa bei Feldern mit Bilddaten.

Ganzzahlen sind standardmäßig vom Typ »int«

Betrachten wir folgende Zeile, so ist auf den ersten Blick kein Fehler zu erkennen:

System.out.println( 123456789012345 );      // Fehler

Dennoch übersetzt der Compiler die Zeile nicht, da er ein Ganzzahlliteral ohne explizite Größenangabe als 32 Bit langes int annimmt. Die obige Zeile führt daher zu einem Compilerfehler, da unsere Zahl nicht im Wertebereich von –2147483648 … +2147483647 liegt, sondern weit außerhalb: 2147483647 < 123456789012345. Java reserviert also nicht so viele Bits wie benötigt und wählt nicht automatisch den passenden Wertebereich. [Allerdings ist das Compilerverhalten verwirrend, denn bei der Anweisung byte b = 12; »denkt« der Compiler ja auch nicht, dass 12 ein int ist. ]

Der Datentyp »long«

Dass eine Zahl long ist, muss ausdrücklich angegeben werden. Dazu wird an das Ende von Ganzzahlliteralen vom Typ long ein »l« oder »L« gesetzt. Um die Zahl 123456789012345 gültig ausgeben zu lassen, müssen wir Folgendes schreiben:

System.out.println( 123456789012345L );

Tipp Das kleine »l« hat sehr viel Ähnlichkeit mit der Ziffer Eins. Daher sollte bei Längenangaben immer ein großes »L« eingefügt werden.



Frage Was gibt die folgende Anweisung aus?

System.out.println( 123456789 + 5432l );

Der Datentyp »byte«

Ein byte ist ein Datentyp mit einem Wertebereich von –128 bis +127. Eine Initialisierung wie

byte b = 200;      // Fehler

ist also nicht erlaubt, da 200 > 127 ist. Somit fallen alle Zahlen von 128 bis 255 (8016 – FF16) raus. In der Datenverarbeitung ist das Java-byte, weil es ein Vorzeichen trägt, nur mittelprächtig brauchbar, da insbesondere in der Dateiverarbeitung Wertebereiche von 0 bis 255 gewünscht sind.

Java erlaubt zwar keine vorzeichenlosen Ganzzahlen, aber mit zwei Schreibweisen lassen sich doch Zahlen wie 200 in einem byte speichern.

byte b = (byte) 200;
byte b = 200y;                // Erst ab Java 7

Der Java-Compiler nimmt dazu einfach die Bitbelegung von 200 und interpretiert das oberste dann gesetzte Bit als Vorzeichenbit. Bei der Ausgabe fällt das auf:

byte b = (byte) 200;
System.out.println( b );      // –56

Die Schreibweise mit dem hinten angesetzten »y« oder »Y« ist erst seit Java 7 möglich.

Der Datentyp »short« *

Der Datentyp short ist selten anzutreffen. Mit seinen 2 Byte kann er einen Wertebereich von –32.768 bis +32.767 darstellen. Das Vorzeichen »kostet« wie bei den anderen Ganzzahlen 1 Bit, sodass nicht 16 Bit, sondern nur 15 Bit für Zahlen zu Verfügung stehen. Allerdings gilt wie beim byte, dass auch ein short ohne Vorzeichen auf zwei Arten initialisiert werden kann:

short s = (short) 33000;
short s = 33000s;             // Erst in Java 7
System.out.println( s );      // –32536

Im zweiten Fall ist die Syntax neu in Java 7.


Rheinwerk Computing - Zum Seitenanfang

2.3.7 Das binäre (Basis 2), oktale (Basis 8), hexadezimale (Basis 16) Stellenwertsystem *  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Literale für Ganzzahlen lassen sich in vier unterschiedlichen Stellenwertsystemen angeben. Das natürlichste ist das Dezimalsystem (auch Zehnersystem genannt), bei dem die Literale aus den Ziffern »0« bis »9« bestehen. Zusätzlich existieren die Binär- (erst ab Java 7), Oktal- und Hexadezimalsysteme, die die Zahlen zur Basis 2, 8 und 16 schreiben. Bis auf Dezimalzahlen beginnen die Zahlen in anderen Formaten mit einem besonderen Präfix.


Tabelle 2.8  Die Stellenwertsysteme und ihre Schreibweise

Präfix Stellenwertsystem Basis Darstellung von 1

0b oder 0B

binär

2

0b1 oder 0B1

0

oktal

8

01

kein

dezimal

10

1

0x oder 0X

hexadezimal

16

0x1 oder 0X1


Ein hexadezimaler Wert beginnt mit »0x« oder »0X«. Da zehn Ziffern für 16 hexadezimale Zahlen nicht ausreichen, besteht eine Zahl zur Basis 16 zusätzlich aus den Buchstaben »a« bis »f« (beziehungsweise »A« bis »F«). [Da »b«/»B« ein gültiges Hexadezimalzeichen ist, kann es (leider) nicht als Suffix für ein Byte gelten. Für bytes musste der zweite Buchstabe aus Bytes herhalten: »y«. So ist 0xby eindeutig. ] Das Hexadezimalsystem heißt auch Sedezimalsystem. [Das Präfix »octo« bei »Oktalsystem« stammt aus dem Lateinischen. Das Wort »Hexadezimal« enthält zwei Bestandteile aus zwei verschiedenen Sprachen: »hexa« stammt aus dem Griechischen und »decem« (zehn) aus dem Lateinischen. Die alternative Bezeichnung Sedezimalzahl bzw. sedezimal (engl. sexadecimal – nicht sexagesimal, das ist Basis 60) ist rein aus dem Lateinischen abgeleitet, aber im Deutschen unüblich. Über den Ursprung des Wortes »Hexadezimal« finden Sie mehr unter http://en.wikipedia.org/wiki/Hexadecimal#Etymology. ]

Ein oktaler Wert beginnt mit dem Präfix »0«. Mit der Basis 8 werden nur die Ziffern »0« bis »7« für oktale Werte benötigt. Der Name stammt aus dem lateinischen »octo«, was auf Deutsch »acht« heißt. Das Oktalsystem war früher eine verbreitete Darstellung, da nicht mehr einzelne Bits solo betrachtet werden mussten, sondern 3 Bits zu einer Gruppe zusammengefasst wurden. In der Kommunikationselektronik ist das Oktalsystem noch weiterhin beliebt, spielt aber sonst keine Rolle.

Für Dualzahlen (also Binärzahlen zur Basis 2) wurde eine neue Notation in Java 7 eingeführt. Das Präfix ist »0b« oder »0B«. Es sind nur die Ziffern »0« und »1« erlaubt.


Beispiel Gib Dezimal-, Binär, Oktal- und Hexadezimalzahlen aus:

System.out.println( 1243 );         // 1243
System.out.println( 0b10111011 );   // 187
System.out.println( 01230 );        // 664
System.out.println( 0xcafebabe );   // –889275714
System.out.println( 0xC0B0L );      // 49328

In Java-Programmen sollten Oktalzahlen mit Bedacht eingesetzt werden. Wer aus optischen Gründen mit der 0 eine Zahl linksbündig auffüllt, erlebt eine Überraschung:

int i = 118;
int j = 012;                        // Oktal 012 ist dezimal 10


Rheinwerk Computing - Zum Seitenanfang

2.3.8 Die Fließkommazahlen »float« und »double«  Zur nächsten ÜberschriftZur vorigen Überschrift

Für Fließkommazahlen (auch Gleitkommazahlen genannt) einfacher und erhöhter Genauigkeit bietet Java die Datentypen float und double. Die Datentypen sind im IEEE-754-Standard beschrieben und haben eine Länge von 4 Byte für float und 8 Byte für double. Fließkommaliterale können einen Vorkommateil und einen Nachkommateil besitzen, die durch einen Dezimalpunkt (kein Komma) getrennt sind. Ein Fließkommaliteral muss keine Vor- oder Nachkommastellen besitzen, sodass auch Folgendes gültig ist:

double d = 10.0 + 20. + .11;

Hinweis Der Datentyp float ist mit 4 Byte, also 32 Bit, ein schlechter Scherz. Der Datentyp double geht mit 64 Bit ja gerade noch, wobei in Hardware eigentlich 80 Bit üblich sind.


Der Datentyp »float« *

Standardmäßig sind die Literale vom Typ double. Ein nachgestelltes »f« (oder »F«) zeigt an, dass es sich um ein float handelt.


Beispiel Gültige Zuweisungen für Fließkommazahlen vom Typ double und float:

double pi = 3.1415, delta = .001;
float  ratio  = 4.33F;

Auch für den Datentyp double lässt sich ein »d« (oder »D«) nachstellen, was allerdings nicht nötig ist, wenn Literale für Kommazahlen im Quellcode stehen; Zahlen wie 3.1415 sind automatisch vom Typ double. Während jedoch bei 1 + 2 + 3.0 erst 1 und 2 als int addiert werden, dann in double und anschließend auf 3.0 addiert werden, würde 1D + 2 + 3.0 gleich mit der Fließkommazahl 1 beginnen. So ist auch 1D gleich 1.0.


Frage Was ist das Ergebnis der Ausgabe?

System.out.println( 20000000000F == 20000000000F+1 );
System.out.println( 20000000000D == 20000000000D+1 );

Tipp: Was sind die Wertebereiche von float und double?


Noch genauere Auflösung bei Fließkommazahlen *

Einen höher auflösenden beziehungsweise präziseren Datentyp für Fließkommazahlen als double gibt es nicht. Die Standardbibliothek bietet für diese Aufgabe in java.math die Klasse BigDecimal an, die in Kapitel 12, »Bits und Bytes und Mathematisches«, näher beschrieben ist. Das ist sinnvoll für Daten, die eine sehr gute Genauigkeit aufweisen sollen, wie zum Beispiel Währungen. [Einige Programmiersprachen besitzen für Währungen eingebaute Datentypen, wie LotusScript mit Currency, das mit 8 Byte einen sehr großen und genauen Wertebereich abdeckt. Erstaunlicherweise gab es einmal in C# den Datentyp currency für ganzzahlige Währungen. ]


Rheinwerk Computing - Zum Seitenanfang

2.3.9 Alphanumerische Zeichen  Zur nächsten ÜberschriftZur vorigen Überschrift

Der alphanumerische Datentyp char (von engl. character, Zeichen) ist 2 Byte groß und nimmt ein Unicode-Zeichen auf. Ein char ist nicht vorzeichenbehaftet. Die Literale für Zeichen werden in einfache Hochkommata gesetzt. Spracheinsteiger verwechseln häufig die einfachen Hochkommata mit den Anführungszeichen der Zeichenketten (Strings). Die einfache Merkregel lautet: ein Zeichen – ein Hochkomma, mehrere Zeichen – zwei Hochkommata (Gänsefüßchen).


Beispiel Korrekte Hochkommata für Zeichen und Zeichenketten:

char   c = 'a';
String s = "Heut' schon gebeckert?";

Da der Compiler ein char automatisch in ein int konvertieren kann, ist auch int c = 'a'; gültig.

Escape-Sequenzen/Fluchtsymbole

Um spezielle Zeichen, etwa den Zeilenumbruch oder Tabulator, in einen String oder char setzen zu können, stehen Escape-Sequenzen [Nicht alle aus C stammenden Escape-Sequenzen finden sich auch in Java wieder. Es gibt kein '\a' (Alert), '\v' (vertikaler Tabulator) und kein '\?' (Fragezeichen). ] zur Verfügung.


Tabelle 2.9  Escape-Sequenzen

Zeichen Bedeutung Umschreibung

\uXXXX

Unicode-Zeichen. X steht für ein Hexadezimalzeichen.

\b

Rückschritt (Backspace)

\u0008

\n

Zeilenschaltung (Newline)

\u000a

\f

Seitenumbruch (Formfeed)

\u000c

\r

Wagenrücklauf (Carriage return)

\u000d

\t

horizontaler Tabulator

\u0009

\"

doppeltes Anführungszeichen

\u0022

\'

einfaches Anführungszeichen

\u0027

\\

Backslash

\u005c



Beispiel Zeichenvariablen mit Initialwerten und Sonderzeichen:

char theLetterA  = 'a',
     singlequote = '\'',
     newline     = '\n';

Die Fluchtsymbole sind für Zeichenketten die gleichen. Auch dort können bestimmte Zeichen mit Escape-Sequenzen dargestellt werden:

String s        = "Er fragte: \"Wer lispelt wie Katja Burkard?\"";
String filename = "C:\\Dokumente\\Siemens\\Schweigegeld.doc";


Rheinwerk Computing - Zum Seitenanfang

2.3.10 Gute Namen, schlechte Namen  topZur vorigen Überschrift

Für die optimale Lesbarkeit und Verständlichkeit eines Programmcodes sollten Entwickler beim Schreiben einige Punkte berücksichtigen:

  • Ein konsistentes Namensschema ist wichtig. Heißt ein Zähler no, nr, cnr oder counter? Auch sollten wir korrekt schreiben und auf Rechtschreibfehler achten, denn leicht wird aus necessaryConnection dann nesesarryConnection. Variablen ähnlicher Schreibweise, etwa counter und counters, sind zu vermeiden.
  • Abstrakte Bezeichner sind ebenfalls zu vermeiden. Die Deklaration int TEN = 10; ist absurd. Eine unsinnige Idee ist auch die folgende: boolean FALSE = true, TRUE = false;. Im Programmcode würde dann mit FALSE und TRUE gearbeitet. Einer der obersten Plätze bei einem Wettbewerb für die verpfuschtesten Java-Programme wäre uns gewiss …
  • Unicode-Sequenzen können zwar in Bezeichnern aufgenommen werden, doch sollten sie vermieden werden. In double übelkübel, \u00FCbelk\u00FCbel; sind beide Bezeichnernamen gleich, und der Compiler meldet einen Fehler.
  • 0 und O und 1 und l sind leicht zu verwechseln. Die Kombination »rn« ist schwer zu lesen und je nach Zeichensatz leicht mit »m« zu verwechseln. [Eine Software wie Mathematica warnt vor Variablen mit fast identischem Namen. ] Gültig – aber böse – ist auch: int ínt, ìnt, înt; boolean bôõleañ;

Bemerkung In China gibt es 90 Millionen Familien mit dem Nachnamen Li. Das wäre so, als ob wir jede Variable temp1, temp2 … nennen würden.


Eclipse
Ist ein Bezeichnername unglücklich gewählt (pneumonoultramicroscopicsilicovolcanoconiosis ist schon etwas lang), so lässt er sich problemlos konsistent umbenennen. Dazu wählen wir im Menü RefactorRename – oder auch kurz Alt + Umschalt + R ; der Cursor muss auf dem Bezeichner stehen. Eine optionale Vorschau (engl. preview) zeigt an, welche Änderungen die Umbenennung nach sich ziehen wird. Neben Rename gibt es auch noch eine andere Möglichkeit. Dazu lässt sich auf der Variablen mit Strg + 1 ein Popup-Fenster mit Local Rename öffnen. Der Bezeichner wird selektiert und lässt sich ändern. Gleichzeitig ändern sich alle Bezüge auf die Variable mit.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
 <<   zurück
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Java SE Bibliotheken






 Java SE Bibliotheken


Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Einstieg in Eclipse






 Einstieg in
 Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in
 Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2011
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: 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.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern