2.11 Wrapperklassen

Einleitung

Wir haben in einer der ersten Lektionen die acht primitiven Datentypen von Java kennengelernt. Diese primitiven Datentypen haben den Vorteil, dass der Umgang mit ihnen recht simpel ist.
Andererseits fallen sie aber auch ein wenig aus der Reihe. Schließlich sind dies die einzigen Datentypen, die nicht in Referenzvariablen abgelegt werden. Außerdem hat ein primitiver Datentyp den Nachteil, dass er keine eigenen Methoden wie etwa die Klasse String mitliefert.

Um diese Schieflage etwas gerade zu rücken, gibt es in Java die sogenannten Wrapperklassen (oder auch Hüllklassen).

Zu jedem primitiven Datentyp gibt es eine zugehörige Wrapperklasse. Eine Instanz so einer Klasse speichert einen Wert des entsprechenden primitiven Typs. Außerdem bieten diese Klassen einige nützliche zusätzliche Methoden.

Ein weiterer Vorteil dieser Wrapperklassen wird uns erst in einer späteren Lektion klar. Wir werden neben Arrays noch weitere Datenstrukturen kennenlernen, die flexibler sind als Arrays. Allerdings können diese nur Objekte aber keine primitiven Datentypen speichern. Die Wrapperklassen sorgen aber dann dafür, dass wir mit deren Hilfe beispielsweise auch int-Werte dort speichern können.

Die Wrapperklasse Integer

Beispiel zum Einstieg

Sehen wir uns ein kleines Beispiel für die Anwendung der zum primitiven Datentyp int gehörenden Wrapperklasse Integer an:

public class WrapperKlassen {

    public static void main(String[] args) {
       
        // Instanzen von Integer werden erzeugt:
        Integer meineInteger = new Integer(23);        
        Integer deineInteger = new Integer("45");
        
        // Man kann sie einfach ausgeben lassen:
        System.out.println(meineInteger);
        System.out.println(deineInteger);
        
        // Rechnungen funktionieren wie gewohnt:
        System.out.println(meineInteger+deineInteger);
        
        // Automtisches Umwandeln in int-Werte:
        int meineInt = meineInteger;
        int deineInt = deineInteger;
        
        // Automatisches Umwandeln in Integer-Objekte:
        Integer unsereInteger = meineInt+deineInt;      
        
        System.out.println(unsereInteger);
        
        // Mischen von int und Integer in einer Rechnung:
        System.out.println(meineInt-deineInteger);
    }
    
}

Wie wir sehen, können wir zwei verschiedene Konstruktoren verwenden: Der erste Konstruktor verlangt als Parameter einen int-Wert, der zweite einen String.

Die Ausgabe der Werte von Integer-Objekten und auch das Rechnen mit ihnen unterscheidet sich im Grunde nicht vom Umgang mit int-Variablen.

Außerdem sehen wir in diesem Beispiel auch, dass das Umwandeln von int-Werten in Integer-Objekte und umgekehrt automatisch funktioniert. Man spricht hier vom Autoboxing bzw. Autounboxing. Diese Namensgebung kommt daher, dass man sich vorstellt, dass der int-Wert in einem Integer-Objekt verpackt wird.
Dieses Autoboxing und Autounboxing sorgt auch dafür, dass wir bei Rechnungen int-Werte und Integer-Objekte mischen können.

Klassenmethoden und Konstanten

Das ist alles schön und gut, aber so recht sind die Vorteile einer Wrapperklasse momentan für uns noch nicht erkennbar. Daher sehen wir uns nun einige hilfreiche Klassenmethoden und Konstanten der Klasse Integer an. Dies ist nur eine Auswahl. Eine vollständige Aufzählung findest Du zum Beispiel hier auf der Website von Oracle. Du kannst sie Dir auch von Eclipse oder Netbeans anzeigen lassen, wenn Du Integer. eintippst.

public class WrapperKlassen {

    public static void main(String[] args) {

        // Aus einem String einen int-Wert machen:
        String meinString = "45";
        int meineInt = Integer.parseInt(meinString);
        System.out.println(2 * meineInt);
        // Ausgabe: 90

        // Maximum zweier int-Werte bestimmen:
        int maximum = Integer.max(23, 45);
        System.out.println(maximum);
        // Ausgabe: 45

        // int-Wert als Binaerzahl schreiben:
        String binear = Integer.toBinaryString(19);
        System.out.println(binear);
        // Ausgabe: 10011

        // int-Wert als Hexadezimalzahl schreiben:
        String hexa = Integer.toHexString(30);
        System.out.println(hexa);
        // Ausgabe: 1e

    }

}

Dass dies Klassenmethoden sind, erkennen wir daran, dass sie mit Integer. aufgerufen werden können.
Bei der Methode Integer.parseInt ist zu beachten, dass eine Exception ausgelöst werden kann – zum Beispiel, wenn man ein Wort in einen int-Wert umwandeln möchte.

Als Beispiele für Konstanten sehen wir uns die beiden an, an denen wir den größten und den kleinsten möglichen int-Wert ablesen können:

public class WrapperKlassen {

    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        // Ausgabe: 2147483647
        
        System.out.println(Integer.MIN_VALUE);
        // Ausgabe: -2147483648
    }

}

Übersicht der Wrapperklassen

Wie oben schon erwähnt gibt es zu jedem primitiven Datentyp eine Wrapperklasse. Die Namen sind dabei recht naheliegend:

Primitiver
Datentyp
Wrapper-
klasse
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character

Jede diese Klassen bietet – ähnlich wie Integer – einige nützliche Methoden und Konstanten. Beispielsweise besitzt bis auf Character jede der Klassen ein Gegenstück zur Methode Integer.parseInt zum Umwandeln eines geeigneten Strings in den entsprechenden primitiven Datentyp.

Die Klassen der Zahltypen besitzen auch alle die Konstanten MAX_VALUE und MIN_VALUE.

Die Klassen Float und Double besitzen zusätzliche die Konstanten

  • NaN („Not a Number“), die stellvertretend für das Ergebnis der Division von Null durch Null steht,
  • POSITIVE_INFINITY, die für das Ergebnis der Division einer positiven Zahl durch Null steht und
  • NEGATIVE_INFINTY, die für das Ergebnis der Division einer negativen Zahl durch Null steht.