Die Klasse »java.lang.Integer« in Java
Objekte zur Wertrepräsentation
»java.lang.Integer«-Objekte stellen Zahlen als Objekte dar.
Man verwendet »java.lang.Integer«-Objekte, wenn ein Objekt erwartet wird, aber eine Zahl angegeben werden soll.
Die Klasse »java.lang.Integer« erlaubt es, solche ganze Zahlen, die auch mit dem Typ »int« dargestellt werden können, als Objekte der Klasse »java.lang.Integer« darzustellen, was den Vorteil hat, daß die so dargestellten Zahlen dann an Stellen verwendet werden können, an denen ein Objekt erwartet wird, und zu einer einheitlicheren Behandlung von Werten führen kann.
Man kann »java.lang.Integer« auch mit »java.awt.geom.Point2D.Double« vergleichen: Beides sind Klassen von Objekten, die Zahlen enthalten, allerdings enthält »java.lang.Integer« nur eine Zahl, und diese ist vom Typ »int«, während »java.awt.geom.Point2D.Double« zwei Zahlen enthält, die vom Typ »double« sind. Außerdem sind die Zahlen in einem java.awt.geom.Point2D.Double-Objekt veränderlich – im Gegensatz zu der Zahl in einem java.lang.Integer-Objekt.
Unveränderbarkeit
Wie auch Objekte der Klasse »java.lang.String« sind Objekte der Klasse »java.lang.Integer« unveränderlich. Das heißt: Wenn ein Objekt der Klasse »java.lang.Integer« einmal einen bestimmten Zahlenwert darstellt, dann stellt es diesen für immer dar.
Aussprache von »int«
Wir hatten schon früher empfohlen, den Typ »int« nicht wie das Wort “integer ” auszusprechen. Dies ist auch deshalb nicht empfehlenswert, da mit der Aussprache “integer ” auch die Klasse »java.lang.Integer« gemeint sein könne.
Die Methode »valueOf«
Die statische Methode »valueOf( int )« der Klasse »java.lang.Integer« ergibt eine Referenz auf ein Objekt der Klasse »java.lang.Integer«, welches den Argumentwert repräsentiert.
Der Ausdruck »java.lang.Integer.valueOf( 4 )« liefert beispielsweise eine Referenz auf ein Objekt der Klasse »java.lang.Integer«, welches den int-Wert 4 repräsentiert. Diese Referenz kann man verwenden, wenn die Zahl 4 angegeben werden soll, aber eine Referenz erwartet wird. Dann wäre das Numerale »4« ja nicht zulässig. Man kann »java.lang.Integer.valueOf( 4 )« als eine Referenzdarstellung oder Objektdarstellung des Wertes 4 ansehen, also als eine Darstellung des Wertes 4 durch eine Referenz beziehungsweise durch ein Objekt.
Man kann sich vorstellen, daß ein Objekt der Klasse »java.lang.Integer« einen int-Wert enthält.
- Ein Objekt der Klasse »java.lang.Integer« mit dem int-Wert »4«
.-----------------------------.
| java.lang.Integer |
| .-------------------------. |
| | int 4 | |
| '-------------------------' |
'-----------------------------'Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 4 );
java.lang.System.out.println( java.lang.Integer.valueOf( 4 )); }}transcript
4
4
Das obige Programm liefert mit der Ausgabe schon ein Indiz dafür, daß die beiden unterschiedlichen Ausdrücke beide dieselbe Zahl‑4 repräsentieren.
Die Methode »valueOf« kann keine Methode eines Exemplars der Klasse sein, weil die Existenz eines Exemplars für sie noch nicht vorausgesetzt werden soll. Daher ist dies eine statische Klassenmethode (sie setzt lediglich die Existenz der Klasse »java.lang.Integer« voraus).
Der Parameter »object« des folgenden Programms kann eine Referenz auf ein Objekt aufnehmen. Durch Darstellung der Zahl 4 mit Hilfe eines Objektes kann dieser Parameter auch mit einer Darstellung des Wertes 4 als Argumente initialisiert werden.
Main.java
public final class Main
{ public static void println( final java.lang.Object object )
{ java.lang.System.out.println( object ) } public static void main( final java.lang.String[] args )
{ println( java.lang.Integer.valueOf( 4 )); }}transcript
4
Literalanaloga
Die meisten Klassentypen haben keine Literale, also durch die Sprache festgelegte kurze Schreibweisen ihrer Werte. Die valueOf-Ausdrücke spielen bei Typen ohne Literalen teilweise eine Rolle, die mit der von Literalen bei den elementaren Typen vergleichbar ist. Der Ausdruck »4« steht für den Wert »4« des Typs »int«. Der Ausdruck »java.lang.Integer.valueOf( 4 )« steht für eine Referenz auf eine Darstellung des Wertes »4« mit dem Typ »java.lang.Integer«. Um den „Wert »4« der Klasse »java.lang.Integer« zu schreiben, verwendet man eben den Ausdruck »java.lang.Integer.valueOf( 4 )«, so wie man das Numeral »4« verwendet, um den Wert »4« des elementaren Typs »int« zu schreiben.
Die Methode »equals«
Die Methode »equals« wird bei vielen Objekten verwendet, um eine für diese Objekte gewünschte Form von Gleichheit ausdrücken zu können. Bei Objekten der Klasse »java.lang.Integer« ist dies die Gleichheit der dargestellten Werte. Verschiedene Objekte können denselben Wert darstellen (haben).
Das folgende Programm zeigt, daß »a« und »b« in der Methode »main(java.lang.String[])« zwei verschiedene Objekte sind, die aber denselben Zahlenwert darstellen.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.Object a = java.lang.Integer.valueOf( 2_000_000_001 );
final java.lang.Object b = java.lang.Integer.valueOf( 2_000_000_001 ); java.lang.System.out.println( a == b );
java.lang.System.out.println( b == a );
java.lang.System.out.println( a.equals( b ));
java.lang.System.out.println( b.equals( a )); }}transcript
false
false
true
true
Der Operator »==« vergleicht die links und rechts von ihm angegebenen Referenzen, während die Methode »java.lang.Integer#equals(java.lang.Object)« beim Aufruf mit einem Objekt der Klasse »java.lang.Integer« als Argument vergleicht, ob der gleiche Wert repräsentiert wird.
Das folgende Programmbeispiel zeigt, daß es nicht ausgeschlossen ist, daß die Methode »java.lang.Integer.valueOf(int)« auch einmal bei mehreren Aufrufen mit dem gleichen Argumentwert das gleiche Objekt ergibt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.Object a = java.lang.Integer.valueOf( 2 + 1 );
final java.lang.Object b = java.lang.Integer.valueOf( 3 ); java.lang.System.out.println( a == b );
java.lang.System.out.println( b == a );
java.lang.System.out.println( a.equals( b ));
java.lang.System.out.println( b.equals( a )); }}transcript
true
true
true
true
Erzeugungen aus Zeichenfolgen
Die statische Methode »valueOf(java.lang.String)« der Klasse »java.lang.Integer« ergibt ein neues Exemplar der Klasse »java.lang.Integer«, das den Zahlenwert der Zeichenfolge des Argumentes darstellt, falls diese Zeichenfolge einen Text enthält, der eine Zahl (im Zehnersystem) darstellt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.Integer i4 = java.lang.Integer.valueOf( "4" );
java.lang.System.out.println( i4.equals( java.lang.Integer.valueOf( 4 ))); }}transcript
true
Statische Hilfsmethoden für den elementaren Typ »int«
Die Klasse »java.lang.Integer« enthält neben den Methoden für Objekte auch noch statische Methoden und Felder wie beispielsweise »java.lang.Integer.MAX_VALUE« und »java.lang.Integer.compare(int,int)«, die eigentlich zum elementaren Typ »int« gehören. Da elementaren Typen aber keine Methoden oder Felder enthalten können und jede Methode in Java in einem Referenztyp enthalten sein muß, hat man solche Methoden und Felder in die Klasse »java.lang.Integer« eingetragen. (Vielleicht wäre es übersichtlicher gewesen, solche Methoden in eine extra Klasse zu packen.)
Übungsfragen
? Gleichheit von java.lang.Integer-Objekten
Wenn man nur die oben in dieser Lektion gegebenen Informationen hat, was kann man dann über die Ausgabe des folgenden Programms sagen?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.Object a = java.lang.Integer.valueOf( 201 );
final java.lang.Object b = java.lang.Integer.valueOf( 201 ); java.lang.System.out.println( a == b ); }}
? Gleichheit von dargestellten Werten
Wenn man nur die oben in dieser Lektion gegebenen Informationen hat, was kann man dann über die Ausgabe des folgenden Programms sagen?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.Object a = java.lang.Integer.valueOf( 201 );
final java.lang.Object b = java.lang.Integer.valueOf( 201 ); java.lang.System.out.println( a.equals( b )); }}