LU08c - Typumwandlung (Casting)

Typumwandlung bedeutet, dass Sie einen Wert eines primitiven Datentyps einem anderen Datentyp zuweisen.

In Java gibt es zwei Arten von Typumwandlung:

Implizite Typumwandlung (automatisch) - Konvertierung eines kleineren Typs in einen größeren Typ byteshortcharintlongfloatdouble

Explizite Typumwandlung (manuell) - Konvertierung eines größeren Typs in einen Typ kleinerer Größe doublefloatlongintcharshortbyte

Die implizite Typumwandlung wird automatisch vorgenommen, wenn ein kleinerer Typ in einen größeren Typ umgewandelt wird:

private void run() {
    int myInt = 9;
    double myDouble = myInt; // Automatisches casting von int zu double
 
    System.out.println(myInt);      // Output: 9
    System.out.println(myDouble);   // Output: 9.0
  }

Die explizite Typumwandlung muss manuell vorgenommen werden, indem der neue Datentyp dem Wert in Klammern vorangestellt wird:

private void run() {
    double myDouble = 9.78;
    int myInt = (int) myDouble; // Manual casting: double to int
 
    System.out.println(myDouble);   // Outputs 9.78
    System.out.println(myInt);      // Outputs 9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
* Beispielanwendung implizite und explizite Typumwandlung in Java.
*/
 
public class TypumwandlungPrimitiv{
    public static void main(String[] args) {
 
        // Explizite Typumwandlung
        int valueInt     = 128;
        short valueShort = (short) valueInt;
 
        // Konvertierungsfehler, da Wertebereich von byte-Datentyp (-128, 127)
        byte valueByte   = (byte) valueInt;
 
        System.out.println("\nvalueInt:   " + valueInt);
        System.out.println("valueShort: " + valueShort);
        System.out.println("valueByte:  " + valueByte);
  
        // Implizite Typumwandlung
        valueShort = 2013;
        float valueFloat = valueShort;
 
        System.out.println("\nvalueShort: " + valueShort);
        System.out.println("valueFloat: " + valueFloat);
  
        // Konvertierungsfehler bei impl. Typumwandlung nach arithm. Ausdruck
        valueShort = 23;
        valueFloat = valueShort/2;
 
        System.out.println("\nvalueShort: " + valueShort);
        System.out.println("valueFloat: " + valueFloat);
 
        // kein Konvertierungsfehler da arithm. Ausdruck korrekt angegeben
        valueShort = 23;
        valueFloat = valueShort/2.0F;
 
        System.out.println("\nvalueShort: " + valueShort);
        System.out.println("valueFloat: " + valueFloat);
 
        // kein Konvertierungsfehler da arithm. Ausdruck durch explizite
        // Typumwandlung korrekt angegeben
        valueShort = 23;
        valueFloat = valueShort/(float)2;
 
        System.out.println("\nvalueShort: " + valueShort);
        System.out.println("valueFloat: " + valueFloat);    
    }
}

In Zeile 10 wird der Wert der Variable valueInt explizit in einen short-Datentypwert umgewandelt. Dies geschieht mit Hilfe des type-cast Operators, der in den Klammern vor der Variable steht: short valueShort = (short) valueInt;.

In Zeile 13 wird der Wert der Variable valueInt explizit in einen byte-Datentypwert umgewandelt. Wieder mit Hilfe des type-cast Operators , der in den Klammern vor der Variable steht: byte valueByte = (byte) valueInt;. Da der Wertebereich des byte-Datentyps nur von -128 bis +127 reicht, gehen bei der einschränkenden Konvertierung Informationen verloren und der in Variable valueInt gespeicherte Wert wird falsch interpretiert. Dadurch wird der ursprüngliche Wert (128) als -128 ausgegeben. Siehe Zeile 17.

In Zeile 21 wird der Wert der Variable valueShort implizit in einen float-Datentypwert umgewandelt. Dies wird automatisch vom Compiler ausgeführt, da es sich um eine erweiternde Konvertierung handelt: float valueFloat = valueShort;.

In Zeile 28 wird zuerst das Ergebnis des arithmetischen Ausdrucks berechnet. Da der zweite Operand (2) eine Ganzzahl ist, wird eine Ganzzahldivison durchgeführt, deren Ergebnis 4 beträgt. Anschließend führt der Compiler eine implizite Typumwandlung von int auf double durch und die Variable zahlFloat weist den Wert 4.0 auf. Das richtige Ergebnis ist jedoch 4.5.

Um diesen Konvertierungsfehler zu vermeiden, muss der zweite Operand als Gleitkommazahl gekennzeichnet werden. Entweder indem man statt der 2 eine 2.0F (wie in Zeile 35) schreibt oder indem man eine explizite Typumwandlung anweist (wie in Zeile 43).


© Kevin Maurizi

  • modul/archiv/m319/learningunits/lu08/lu08c-typecasting.txt
  • Last modified: 2023/11/13 08:56
  • by 127.0.0.1