» Tutorial / Java Grundlagen / Datentypen

Im vorliegenden Kapitel dreht sich alles rund um die Datentypen von Java. Ein Datentyp definiert die Art der möglichen Inhalte einer Variable, legt deren Wertebereich und Verwendung fest. Java kennt mehrere verschiedene Datentypen wie Strings, sowie diverse Integer und Gleitkommatypen. Natürlich zählen auch benutzerdefinierte Klassen und Konstanten in diese Kategorie.

Datentypen und Variablen bilden zusammen eine feste Einheit, wobei das nächste Kapitel sich ausgiebig mit dem Thema der Variablen widmet.


» elementare Datentypen nach oben «

Java stellt dem Programmierer acht sogenannte elementare oder primitive Datentypen zur Verfügung. Sie bilden in diesem Sinne die kleinste Einheit, wenn es darum geht, eine Variable zu typisieren. Der Typ gibt dabei die Art der zu speichernden Daten an.

Alle elementaren Datentypen haben in Java eine feste Größe und einen exakt vorgeschriebenen Wertebereich. Diese Angaben sind auf allen Systemen exakt die gleichen, wobei sich eine bessere Portabilität und Stabilität ergibt. Des weiteren lassen sich die diversen Datentypen kategorisch einteilen.


» boolesche Datentypen

Es gibt einen booleschen Datentyp, welcher nur zwei Zustände kennt. Wahr oder falsch. Als feste Werte dienen dabei die Zustände True und False, welche als einzige mögliche Werte zuweisbar sind. Zahlen wie null oder eins sind in Java nicht mehr als Kriterium für boolesche Auswertungen zulässig.

Typ Byte
   
boolean1

» Integer

Bei Integern handelt es sich um Zahlenwerte ohne jegliche Kommastellen. Java stellt Ihnen insgesamt vier Integertypen zur Verfügung, alle mit einem unterschiedlichen Wertebereich.

Typ Byte
  
byte 1
short 2
int 4
long 8

» Fließkommazahlen

Als Integerwerte mit Nachkommastellen kennt Java ebenfalls zwei Typen. Beide verwenden einen unterschiedlich großen Wertebereich.

Typ Byte
  
float 4
double8

» Zeichen

Auch für die gängigen Zeichen stellt Java einen entsprechenden Datentyp vor. Im Gegensatz zu anderen Programmiersprachen ist hier allerdings eine Besonderheit zu entdecken. Der gesamte Java - Zeichensatz basiert bereits auf dem Unicode - Standard, welcher mit der doppelten Byteanzahl alle Zeichentypen der Welt darstellen kann.

Typ Byte
  
char 2

» benutzerdefinierte Datentypen nach oben «

Es gibt mehrere Möglichkeiten, auch eigene Datentypen zu definieren. Diese können jedoch nie den atomaren Status wie die primitiven Datentypen erreichen. Eigene Datentypen werden in Form von Klassen aufgebaut, welche wiederum die elementaren Datentypen von Java verwenden.

Kapitel zehn wird sich ausgiebig diesem Thema widmen.


» Konvertierung nach oben «

Das Ende dieses Kapitels widmet sich der Konvertierung der verschiedenen Datentypen untereinander. Dieser Aspekt ist in so fern wichtig, als dass oft Werte in eine andere Darstellungsweise umzurechnen sind. Aus Gründen der Vollständigkeit wird dieses Thema bereits hier besprochen, im nächsten Kapitel jedoch noch einmal praktisch aufgegriffen.

Das Konzept der Konvertierung ist von globalem Sprachinteresse. Auch in späteren Kapiteln wird dieser Teil der Sprachspezifikation erneut aufgegriffen, und zum aktuellen Thema passend, weiter vertieft werden.


» Standardkonvertierung

Java ist in der Lage, bereits beim Kompilieren die verschiedenen elementaren Datentypen unter Berücksichtigung ihrer Wertebereiche in einander umzuwandeln. Dabei folgt Java einem festen Schema, um Über- und Unterläufe zu vermeiden.

Eine Konvertierung ist daher implizit nur von einem Datentyp kleineren Wertebereichs in einen Typ höheren Wertebereichs möglich, da ansonsten bei zu großen Werten signifikante Stellen verloren gehen würden. Die folgende Graphik verdeutlicht diese Hierarchie.

Hierarchie der Standardkonvertierung

Es ist erkennbar, dass sich nicht alle Datentypen einreihen. Boolesche Datentypen zum Beispiel lassen sich nicht in einen Wert übertragen. Der umgekehrte Weg der Konvertierung wird von Java bereits als Fehler erkannt und daher nicht implizit durchgeführt. Java wählt immer den nächsthöheren Datentyp.

Letztlich ist die Frage zu klären, wann die eigentliche Konvertierung überhaupt durchgeführt wird. Die Antwort beschränkt sich in der Regel auf die folgenden drei Fälle.
  • bei Zuweisungen, wenn der Typ der Variable und der des Ausdrucks nicht identisch sind
  • bei Auswertungen arithmetischer Ausdrücke, wenn die Operanden unterschiedliche Typen haben
  • beim Aufruf von Methoden, wenn die Typen der aktuellen Parameter nicht mit den formalen Parametern übereinstimmen
Hier nimmt einem der Compiler bereits viel Arbeit ab. Er erkennt automatisch die verwendeten Datentypen und führt selbständig neue ein, sobald ein Wertebereich durch eine Operation überschritten wird. Details finden Sie in den Kapiteln zum Thema der Klassen und Operatoren.

Möchte man dennoch die Konvertierung erzwingen, so muss dies über einen expliziten Cast erfolgen.

» explizites Casting

Auch für die explizite Konvertierung des Programmierers gibt es drei Gründe, in der sie definitif erforderlich ist.
  • wenn größere Datentypen in kleinere Datentypen zu konvertieren sind
  • wenn Klassenhierarchien ineinander umgewandelt werden sollen
  • wenn bei der Standardkonvertierung größere Sprünge gemacht werden sollen
Einmal übernimmt der Programmierer die Verantwortung, wenn größere Datentypen in kleinere Einheiten umgewandelt werden sollen. Auch muss er sich der Gefahr des Verlustes von signifikanten Stellen des Wertes bewusst sein. Des weiteren basieren alle Java - Klassen auf einem komplexen Hierarchiegefüge, wobei ebenfalls spezielle Konvertierungsregeln zu beachten sind. Mehr dazu in den entsprechenden Kapiteln. Der letzte Punkt betrifft die Tatsache, dass es möglich ist, einen kleineren Datentyp sofort in einen viel größeren umzuwandeln, ohne dabei bestimmte Zwischentypen mitnehmen zu müssen.

Syntaktisch wird eine explizite Konvertierung durchgeführt, indem der neue Datentyp in Klammern dem entsprechenden Datentyp vorangestellt wird.


(Typ) Variable;
    

Das folgende Bespiel demonstriert die explizite Konvertierung einer Ganzzahl in einen Zeichentyp. Zu beachten ist die entsprechende Verwendung des Konvertierungsoperators.


public class MyClass
{
  public static void main(String[] args)
  {
     int i =      33;  System.out.println(i);		
    char c = (char)i;  System.out.println(c);
  }
}
    

33
!
    

« Kapitel Kapitelübersicht nach oben Kapitel »