In diesem Beitrag werden wir Wrapper-Klassen behandeln und eine kleine Einführung in dieses spannende Thema geben.
Wir stellen die Wrapper-Klassen am Beispiel der vordefinierten Klassen für das leere Objekt void und die 8 primitiven Datentypen in Java vor:
Datentyp | Größe [Bit] | Standardwert | Wertebereich | Wrapper-Klasse |
---|---|---|---|---|
boolean | 1 | false | true, false | java.lang.Boolean |
byte | 8 | 0 | -128 … +127 | java.lang.Byte |
short | 16 | 0 | -215 … 215-1 | java.lang.Short |
int | 32 | 0 | -231 … 231-1 | java.lang.Integer |
long | 64 | 0 | -263 … 263-1 | java.lang.Long |
float | 32 | 0.0 | ±1.2×10−38 … ±3.4×1038 | java.lang.Float |
double | 64 | 0.0 | ±2,2×10−308 … ±1.8×10308 | java.lang.Double |
char | 16 | \u0000 | ‚\u0000‘ … ‚\uFFFF‘ | java.lang.Character |
void | – | – | – | java.lang.Void |
Eine Wrapper-Klasse kapselt die jeweilige primitive Variable in einem sehr einfachen Objekt. Dabei stellt die Wrapper-Klasse einige Methoden für den Zugriff auf die primitive Variable und nützliche Funktionen zur Verfügung.
Wo werden Wrapper-Klassen in Java eingesetzt?
- In Datenbanken – Wenn der primitive Datentyp den Wert null zugewiesen bekommen soll, wird das Wrapper-Objekt auf null gesetzt.
- In Verbundklassen – Wenn beliebige Objekttypen abgelegt werden sollen, müssen anstelle der primitiven Datentypen ihre Wrapper-Klassen verwendet werden.
- In der Reflection-API – Für den Zugriff auf primitive Membervariablen und Methodenargumente verwendet die Reflection-API von Java die korrespondierenden Wrapper-Klassen.
Wie werden Wrapper-Klassen in Java instanziert?
In Java können Wrapper-Objekte auf drei verschiedene Arten instanziert werden. Wir stellen die unterschiedlichen Instanzierungsarten kurz vor und geben in dem unteren Quellcode einige Beispiele vor.
Wrapper-Objekte können folgendermaßen instanziert werden:
- Übergabe des Werts als primitiver Datentyp – Dem Konstruktor wird der primitive Wert übergeben. Der Konstruktor erzeugt dann ein Objekt des korrespondierenden Datentyps.
- Übergabe des Werts als String – Dem Konstruktor wird der Wert als String übergeben. Anschließend wird der übergebene String konvertiert und ein Objekt des korrespondierenden Datentyps erzeugt.
- Nutzen der valueOf-Fabrikmethode – Mit Hilfe der valueOf-Fabrikmethode wird ein Objekt des korrespondierenden Datentyps erzeugt. Die valueOf-Fabrikmethode ist so implementiert, dass zu gleichen primitiven Werten identische Instanzen ausgegeben werden. Somit werden überflüssige Objekte vermieden.
In der folgenden Java-Anwendung werden Instanzen der Integer-Klasse erzeugt. Um die Benutzung dieser Integer-Objekte zu veranschaulichen, werden verschiedene Berechnungen damit durchgeführt:
Beispielanwendung: Erzeugen von Wrapper-Objekten
/* * In der WrapperTest Klasse werden Instanzen der Integer-Klasse erzeugt */ public class WrapperTest { public static void main (String[] args) { int zahl = 500; String zahlString = "501"; Integer zahlInteger = new Integer(zahl); System.out.println("\n" + zahlInteger); System.out.println(zahlInteger.intValue()); Integer zahlInteger2 = new Integer(zahlString); System.out.println("\n" + zahlInteger2.intValue()); int neueZahl = zahlInteger2.intValue() + 99; System.out.println("\n" + neueZahl); String neuerString = zahlString + " und " + zahlInteger.toString(); System.out.println("\n" + neuerString); Integer zahlInteger3 = Integer.valueOf(zahl); System.out.println("\n" + zahlInteger3.intValue()); } }
In Zeile 13 wird das Integer-Wrapper Objekt zahlInteger , durch Übergabe eines int-Werts an den Konstruktor der Integer-Klasse, erzeugt. Anschließend wird das Objekt ausgegeben, sowie der innere Wert des Objekts mit der Methode intValue() abgefragt und ausgegeben.
In Zeile 17 wird das Integer-Wrapper Objekt zahlInteger2 , durch Übergabe eines String-Werts an den Konstruktor der Integer-Klasse, erzeugt. Anschließend wird der innere Wert des Objekts mit der Methode intValue() abgefragt und auf der Konsole ausgegeben.
In Zeile 20 werden der innere Wert des Objekts zahlInteger2 und die Zahl 99 addiert und das Ergebnis in der int-Variable neueZahl gespeichert. Anschließend wird der Inhalt der int-Variable neueZahl ausgegeben.
In Zeile 23 wird der innere Wert von zahlInteger in einen String umgewandelt. Dieser String wird dann mit dem String zahlString verkettet. Der verkettete String wird in der String-Variable neuerString gespeichert und anschließend auf der Konsole ausgegeben.
In Zeile 26 wird das Integer-Wrapper Objekt zahlInteger3 , durch Übergabe eines int-Werts an die statische Methode valueOf(int i), erzeugt. Anschließend wird der innere Wert des Objekts mit der Methode intValue() abgefragt und auf der Konsole ausgegeben.
Rückgabe des inneren Werts von Wrapper-Objekten
Wie bereits in den Erklärungen unter dem Quellcode zu lesen ist, kann der innere Wert von Wrapper-Objekten mit Hilfe der beiden Methoden toString() und intValue() (bei byte ist es byteValue() usw.) abgefragt werden.
Starten wir nun die Beispielanwendung. In der unteren Abbildung ist die Kommandozeilenausgabe des Programms dargestellt:
Mit Hilfe von Wrapper-Klassen Strings parsen
Wrapper-Klassen können aus Strings primitive Datentypen wie byte, short, int, long, double, float und boolean erzeugen. Dies geschieht mit Hilfe der statischen Methoden parseByte auf die über den jeweiligen Klassennamen zugegriffen wird, in diesem Fall wäre es bspw. Byte.parseByte("52")
.
In dem weiter unten stehenden Quellcode haben wir einige Beispiele angegeben, um zu zeigen wie mit Hilfe von Wrapper-Klassen Strings geparst werden.
Konstanten von Wrapper-Klassen in Java nutzen
In den sechs numerischen Wrapper-Klassen sind einige sehr nützliche Konstanten definiert. In jeder dieser sechs Wrapper-Klassen kann das kleinste bzw. größte Element des Wertebereichs mit den Konstanten MIN_VALUE und MAX_VALUE abgefragt werden.
Für die Wrapper-Klassen Float und Double sind zusätzlich die Werte:
- Minus Unendlich mit NEGATIVE_INFINITY
- Plus Unendlich mit POSITIVE_INFINITY
- und Undefiniert mit NEGATIVE_INFINITY definiert.
In der folgenden Java-Anwendung werden zuerst einige String-Objekte mit Hilfe der Wrapper-Klassen geparst. Anschließend werden die oben beschriebenen Konstanten der numerischen Wrapper-Klassen ausgegeben:
Beispielanwendung: Strings parsen mit Hilfe von Wrapper-Klassen
/* * Strings parsen mit Hilfe von Wrapper-Klassen und Konstanten der Wrapper-Klassen */ public class WrapperParser { public static void main (String[] args) { String intString = "501"; String byteString = "127"; String booleanString = "false"; String doubleString = "2014.2013"; int zahlInt = Integer.parseInt(intString); System.out.println("\n" + zahlInt); byte zahlByte = Byte.parseByte(byteString); System.out.println(zahlByte); // führt zur Laufzeit zu NumberFormatException "Value out of range." // byte zahlByte = Byte.parseByte(intString); boolean wertBoolean = Boolean.parseBoolean(booleanString); System.out.println(wertBoolean); double zahlDouble = Double.parseDouble(doubleString); System.out.println(zahlDouble + "\n"); // Konstanten in den Wrapper-Klassen System.out.println("Kleinste short Zahl: " + Short.MIN_VALUE); System.out.println("Groesste short Zahl: " + Short.MAX_VALUE + "\n"); System.out.println("Kleinste float Zahl: " + Float.MIN_VALUE); System.out.println("Groesste float Zahl: " + Float.MAX_VALUE); System.out.println("Undefiniert : " + Float.NaN); System.out.println("Minus unendlich : " + Float.NEGATIVE_INFINITY); System.out.println("Plus unendlich : " + Float.POSITIVE_INFINITY); } }
Der Quellcode dürfte ziemlich selbsterklärend sein.
Die Zeile 22 ist auskommentiert, da sie einen Laufzeitfehler auslösen würde. Tritt ein Fehler beim Parsen eines String-Objekts auf, wird eine NumberFormatException geworfen. In diesem Fall wäre die Ursache das Überschreiten des zulässigen Wertebereichs des byte-Datentyps („Value out of range.“).
Starten wir nun die Beispielanwendung. In der unteren Abbildung ist die Kommandozeilenausgabe des Programms dargestellt:
Der folgende Link führt zurück zu Variablen, Datentypen und Typumwandlung (type casting) in Java.
Zurück zum Java-Kurs geht es hier.
Comments 4
Pingback: Einführung in Java Design Patterns (Software Entwurfsmuster)
Pingback: Autoboxing und Autounboxing (automatische Ein- und Auspacken) in Java
Pingback: Klassen in Java: Die Grundlagen der objektorientierten Programmierung
Pingback: Variablen, Datentypen und Typumwandlung (type casting) in Java