Java Standard: Primitive Datentypen

Aus Wikibooks

Wechseln zu: Navigation, Suche
Wikibooks buchseite.svg Zurück zu Anwendungen, Applets, Midlets, Servlets, ... | One wikibook.svg Hoch zu Java Inhaltsverzeichnis | Wikibooks buchseite.svg Vor zu Datenstrukturen


Inhaltsverzeichnis

[Bearbeiten] Primitive Typen

Primitive Objekttypen sind in Java aus Performancegründen nicht als Klassen realisiert, wie es beispielsweise in Smalltalk der Fall ist. Das heißt insbesondere, dass an Objekte dieser Typen keine Nachrichten gesandt werden können, weil sie keine Methoden besitzen, um darauf reagieren zu können. Es existiert aber in der Klassen-Bibliothek des JRE für jeden primitiven Objekttypen eine Wrapper-Klasse, die einige Methoden zum Umgang mit diesen Objekten zur Verfügung stellt. Im Vergleich zu anderen Programmiersprachen wie C++ und Delphi gibt es keine unsigned Datentypen deren Wertebereiche mit 0 beginnen. Die folgende Tabelle listet die primitiven Objekttypen, die Java bereithält, auf:

Datentyp Größe¹ Wrapper-Klasse Wertebereich Beschreibung
boolean 8 bit java.lang.Boolean true / false Boolescher Wahrheitswert
char 16 bit java.lang.Character 0 ... 65.535 (z. B. 'A') Unicode-Zeichen (UTF-16)
byte 8 bit java.lang.Byte -128 ... 127 Zweierkomplement-Wert
short 16 bit java.lang.Short -32.768 ... 32.767 Zweierkomplement-Wert
int 32 bit java.lang.Integer -2.147.483.648 ... 2.147.483.647 Zweierkomplement-Wert
long 64 bit java.lang.Long -9.223.372.036.854.775.808 ...
9.223.372.036.854.775.807
Zweierkomplement-Wert
float 32 bit java.lang.Float +/-1,4E-45 ... +/-3,4E+38 Gleitkommazahl (IEEE 754)
double 64 bit java.lang.Double +/-4,9E-324 ... +/-1,7E+308 Gleitkommazahl doppelter Genauigkeit (IEEE 754)

¹: minimaler Speicherverbrauch

Wir werden uns jetzt die einzelnen Typen genauer ansehen.

[Bearbeiten] Integer-Typen

[Bearbeiten] char

Ein char besteht in Java aus zwei Bytes. Das ist notwendig, da ein char nicht wie z.B. in C nur einen Wertebereich von 0-255 abdeckt, sondern ein Unicode-Zeichen aufnehmen muss, welches aus zwei Bytes bestehen kann. Diese Art der Zeichendarstellung wird auch "UTF-16" genannt, weil 2 Bytes = 16 bit entsprechen. Als weitere Kodierungen gibt es noch "UTF-8" und "UTF-32", die hier aber nur Erwähnung finden sollen und auf die nicht näher eingegangen wird.

Mit dieser Datenbreite ist es möglich, auch mit asiatischen Zeichensätzen in Java zu arbeiten.

Ein Beispiel:

char ersterBuchstabe = 'A';
System.out.println("Der erste Buchstabe des Alphabets ist ein");
System.out.println(ersterBuchstabe);

Beachten Sie hierbei, dass ein char innerhalb der Java Virtual Machine als int betrachtet wird. Dies lässt sich leicht an folgendem Beispiel verdeutlichen:

System.out.println('A' + "ist der erste Buchstabe des Alphabets.");

[Bearbeiten] byte

Ein byte ist der kleinste nummerische Datentyp in Java. Ein byte repräsentiert ein Datenwort von 8 Bit, wobei (wie bei allen nummerischen primitiven Datentypen in Java) das oberste Bit als Vorzeichen interpretiert wird.

Es findet immer dort Anwendung wo Bitmanipulationen stattfinden, z.B. in MP3-Encodern/Decodern usw. Zur Bitmanipulation kommen wir später bei den Operatoren.

Ein Beispiel:

byte einByte = 127;
System.out.println("Das byte ist jetzt negativ:");
System.out.println(einByte << 1);

Wie Sie sicherlich bemerken, wenn Sie den Beispielcode in unser HelloWorld-Programm einfügen, ist der ausgegebene Wert negativ. Das ist wegen des Wertebereichs, den ein byte umfassen kann, der Fall. Wenn Ihre Ausgabe jedoch 254 und nicht -2 ausgibt, dann haben Sie eine neuere Compiler-Version die (einByte << 1) direkt in eine andere Variable umwandelt.

Wenn Sie sich jetzt über die eigenartige Konstruktion in Zeile 3 wundern, dies ist eine Bitmanipulation, bei der das Bit um 1 nach links verschoben wird. Was das genau bedeutet, wird, wie schon gesagt, später erklärt.

[Bearbeiten] short

Ein "short" besteht aus 2 Bytes und ist vorzeichenbehaftet, d.h. er kann Werte zwischen -32.768 und 32.767 aufnehmen. Er kann am besten für Konstanten (siehe final) oder für kurze Werte verwendet werden.

Ein Beispiel:

short ichBinKlein = 1;
short ichBinDasErgebnis = (short) (ichBinKlein + ichBinKlein);
System.out.println(ichBinDasErgebnis);

[Bearbeiten] int

Der Integer ist wohl der am häufigsten eingesetzte primitive Objekttyp. Er belegt 4 Bytes, was in der Regel für viele Anwendungsbereiche ausreicht.

Ein Beispiel:

int a = 1;
int b = 1;
int c = a + b;
System.out.println("a mit dem Wert " + a + " plus B mit dem Wert " + b + " ergibt: C " + c);

[Bearbeiten] long

Ein long ist die erweiterte Form eines int. Im Gegensatz zum int hat dieser Datentyp 8 Bytes. Um eine Zahl als long zu markieren muss dieser ein L angehängt werden.

Ein Beispiel:

 long a = 10L;
 long b = 20;
 long c = a + b;
 System.out.println(a + " + " + b + " = " + c);
 // Output:
 // 10 + 20 = 30

Wie man hier sieht ist das L nicht zwingend notwendig. Es wird jedoch vor allem bei Parameterübergaben benötigt, da Java sonst eine Fehlermeldung zur Buildzeit ausgibt.

[Bearbeiten] Gleitkommatypen

Mit den Datentypen float und double können reelle Zahlen repräsentiert werden.

[Bearbeiten] float

Eine Variable vom Typ float speichert eine Gleitkommazahl mit einer Größe von 4 Byte. Die Genauigkeit liegt bei 7 signifikanten Stellen (single precision).

Um eine Zahl als float zu markieren muss ihr ein f angehängt werden. Geschieht dies nicht, so wird die Zahl als double interpretiert.

Ein Beispiel:

float a = 10;
float b = 3;
float c = a/b;
System.out.println(a + "/" + b + " = " + c);
// Output:
// 10/3 = 3.3333333

Dieses Beispiel zeigt gleichzeitig ein Problem mit Gleitkommazahlen, da hier (10/3)*3 ungleich 10 ist.

Noch ein Beispiel:

int a = Math.round(5.4); /* Fehler, da 5.4 als double die methode long Math.round(double) identifiziert. */
 
// Richtig ist:
int a = Math.round(5.4f);
// oder:
long a = Math.round(5.4);

[Bearbeiten] double

Der Typ double definiert eine Gleitkommavariable mit einer Größe von 8 Byte. Die Genauigkeit liegt bei 15 signifikanten Stellen (double precision).

Ein Beispiel:

double a = 5.4;
double b = 10.2;
double c = a + b;
System.out.println(a + " + " + b + " = " + c);
// Output:
// 5.4 + 10.2 = 15.6

[Bearbeiten] boolean

Ein boolean kann immer nur zwei Zustände annehmen: true oder false. Er repräsentiert einen Wahrheitswert, welcher auch nur zwei Zustände annehmen kann: wahr oder falsch (stimmt oder stimmt nicht, trifft zu oder trifft nicht zu).

In Java sind zwei Wörter, "true" und "false", dafür reserviert, die dies bei einer booleschen Variable bewirken. Das heißt, dass 0 für "false" steht und 1 für "true". Der Wert, den eine boolesche Variable in Java standardmäßig hat, ist "false".

Diese werden in Kontrollstrukturen, d.h. in if oder for verwendet, um einen Programmfluss durch Bedingungen zu steuern.

Ein Beispiel:

boolean istWahr = true;
 
if (istWahr) {
	// Mach irgendwas
}

[Bearbeiten] Casting in Java

Casting nennt man die Überführung eines Datentypen in einen Anderen. In C/C++ ist das Casting sehr wichtig und auch in Java sollte man verstehen, ob und wann gecastet werden muss. Wie man an der Tabelle zu Beginn dieser Seite sehen kann, gibt es verschiedene Basisdatentypen (boolean, Ganzzahl, Gleitkomma) mit verschiedener Größe (Bit). So sind z.B. int und byte beide Ganzzahl-Datentypen. int ist aber wesentlich mächtiger (hat mehr Bytes) als byte. Wie man sich jetzt einfach vorstellen kann ist es kein Problem vom kleineren Typ (byte) eine Zuweisung zum mächtigeren Typ (int) zu machen, da hier kein Verlust in der Genauigkeit oder der Darstellbarkeit auftreten kann. In diesem Fall nimmt unser Java-Laufzeitsystem ein implizites "automatisches" Casting vor. Anders herum ist es aber möglich mit int Zahlen zu beschreiben, die mit byte nicht mehr dargestellt werden können. Darum braucht man für diese Richtung (vom mächtigeren Typ zum kleineren Typ) ein explizites Casting. Dazu wird bei der Zuweisung der Zieldatentyp in Klammern vor den zuzuweisenden Wert gesetzt. Damit wird der zuzuweisende Wert zuerst in den gewünschten Datentyp umgewandelt und im zweiten Schritt dem Zieldatentypen zugewiesen. Dazu ein kleines Beispiel:

int  ii = 42;
byte bb = 100;
// implizites Casting ("automatisches Casting") weil int mächtiger als byte ist
ii = bb;
// explizites Casting ("direktes Casting") weil byte weniger mächtig als int ist
bb = (byte) ii;

Casting kann auch sehr effektiv genutzt werden, um z.B. die ASCII-Tabelle auszugeben. Dazu läßt man eine int-Variable von 0 bis 255 laufen und castet die jeweilige Zahl einfach nach char und erhält das entsprechende ASCII-Zeichen:

for(int i = 0; i < 256; i++) {
    System.out.println(i + " = " + (char) i);  // Ausgabe z.B. 97 = a
}

Wikibooks buchseite.svg Zurück zu Anwendungen, Applets, Midlets, Servlets, ... | One wikibook.svg Hoch zu Java Inhaltsverzeichnis | Wikibooks buchseite.svg Vor zu Datenstrukturen
Persönliche Werkzeuge