Java/Datentypen

Aus ZUM-Unterrichten
Wechseln zu: Navigation, Suche

Einstieg

Unterrichtsidee
  • Gerade für Anfänger ist es sinnvoll, die Möglichkeiten der Programmiersprache zunächst nicht auszuschöpfen. Es genügen für Zahlen die Datentypen double und int für nahezu alle Anwendungen.
  • Thematisiert werden sollte das Verlassen des Gültigkeitsbereiches und die amerikanische Schreibweise ( . statt , ).
Regel: 
Es gilt die amerikanische Zahlennotation: 
Punkt statt Komma.
Die Zahl 7,34 wird in Java 7.34 geschrieben



Übung
  1. Welchen Datentypen würden Sie wählen:
    1. Simulation eines Thermometers
    2. „Was bin ich“-Fragen
    3. TOP 10 Chartposition
    4. Preise im Supermarkt
    5. Personalausweisnummer
  2. Was macht Java, wenn der Wertebereich einer Variable verlassen wird?
  3. Was macht Java, wenn man eine int Variable so dividiert, dass keine ganze Zahl herauskommt?
  4. Was macht Java, wenn man durch 0 dividieren möchte?


vgl. Java-Reader: Kapitel 3

Elementare numerische Datentypen in Java

Datentyp Größe Wrapper-Klasse Wertebereich Beschreibung
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 )
double 64 Bit java.lang.Double ±4,9E−324 ... ±1,7E+308 Gleitkommazahl doppelter Genauigkeit (IEEE 754)

nach Java-SyntaxWikipedia-logo.png

primitive Datentypen

Size (bits) Example Minimum Value Maximum Value Wrapper Objects
char 16 char c = 'A'; Unicode 0 Unicode 216-1 Character
short 16 short s = 65; -215 215-1 Short
int 32 int i = 65; -231 231-1 Integer
long 64 long l = 65l; -263 263-1 Long
float 32 float f = 65f; Float
double 64 double d = 65.55d; Double
byte 8 byte b = 65; -128 127 Byte
boolean 1 boolean b = true; Boolean
void -- -- -- -- Void

Casting in Java

Casting nennt man die Überführung eines Datentypen in einen Anderen. 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. 50 = a

Wikibooks Java Standard: Primitive Datentypen


Übung
  1. Nennen Sie günstige Anwendungsbeispiele für jeden primitiven Datentypen und grenzen Sie ihn von den anderen ab.
  2. Nennen Sie Beispiele, für die die Genauigkeit und der Wertebereich des Datentypen double nicht ausreicht. Wie könnte man dieses Problemn lösen?
  3. Erläutern Sie, wann Casting eingesetzt werden muss.
  4. Was passiert mit den Nachkommastellen, wenn man mit int-Variablen dividiert?
  5. Fortgeschrittene: Warum besitzt Java primitive Datentypen? Könnten diese nicht auch Klassen sein (wie z.B. String)?


Didaktische Reduktion

Didaktische Reduktion
Da die Anzahl der Möglichkeiten für Anfänger sehr hoch sind, könnte die Behandlung folgender Datentypen im Unterricht zunächst ausreichend sein.:
  • boolean, int, double, char, (ggf. Void)
  • String

Begründung: Es genügen für fast alle Beispiele im Unterricht ein Typ für Ganze- und einer für Dezimalzahlen. Auf Speicherplatz und Geschwindigkeit muss kaum Rücksicht genommen werden.

Hervorhebung
Eine entsprechende Tabelle
Size (bits) Example Minimum Value Maximum Value Wrapper Objects
char 16 char c = 'A'; Unicode 0 Unicode 216-1 Character
int 32 int i = 65; -231 231-1 Integer
double 64 double d = 65.55d; Double
boolean 1 boolean b = true; Boolean
void -- -- -- -- Void

Casting primitiver Datentypen in tabellarischer Übersicht

The following table shows the conversions between primitive types, it shows the casting operation for explicit conversions:

from char from short from int from long from float from double from byte from boolean
to char - (char) (char) (char) (char) (char) N/A
to short (short) - (short) (short) (short) (short) N/A
to int - (int) (int) (int) N/A
to long - (long) (long) N/A
to float - (float) N/A
to double - N/A
to byte (byte) (byte) (byte) (byte) (byte) (byte) - N/A
to boolean N/A N/A N/A N/A N/A N/A N/A -

nach: http://en.wikibooks.org/w/index.php?title=Java_Programming/Primitive_Types

Typumwandlung (typecasting) - Von double zu int zu String zu double

Die folgende Methode demonstriert, wie man in Java den Datentypen wechseln kann.

  public void demonstriereDatentypWechsel(double dezimalZahl) 
  {   
      int ganzeZahl;
      ganzeZahl=(int) dezimalZahl;
      double dezimalZahl2;
      dezimalZahl2=(double) ganzeZahl;
      String eigentlichKeineZahl;
      eigentlichKeineZahl=""+dezimalZahl2;
      dezimalZahl2=Double.parseDouble(eigentlichKeineZahl);
      ganzeZahl=Integer.parseInt(eigentlichKeineZahl);
  }


Siehe auch