Hüllklassen in Java
Diese Lektion wird derzeit gerade überarbeitet (Stand 2018). Sie kann daher derzeit noch unpassende Inhalte enthalten.
Hüllobjekte und Hüllklassen
Ein Hüllobjekt ist ein Objekt, dessen hauptsächliche Bedeutung darin gesehen wird, einen bestimmten Inhalt (einen Wert eines elementaren Typs oder ein Objekt) zu enthalten und zu repräsentieren. Das Hüllobjekt kann in bestimmten Fällen direkt oder nach einer entsprechenden Umwandlung für den enthaltenen Inhalt stehen.
Die Bezeichnung „Hüllobjekt“ wurde gewählt, weil Hüllobjekte ihren Inhalt „einhüllen“. Man sagt auch, daß ein Hüllobjekt den von ihm dargestellten Inhalt verpacke.
- Ein Hüllobjekt
.-----------------------------.
| Objekt |
| .-------------------------. |
| | Inhalt | |
| '-------------------------' |
'-----------------------------'
Eine Klasse, deren Objekte Hüllobjekte sind, nennt man auch eine Hüllklasse.
Man verwendet solche Hüllobjekte beispielsweise, wenn man Werte elementarer Typen als Objekt repräsentieren muß, etwa weil eine Zahl an einer Stelle verwendet werden soll, an der nur Objekte erlaubt sind.
Spezielle Hüllklassen für elementare Werte sind in Java allerdings nur deshalb nötig, weil die Sprache nicht rein objektorientiert ist, sondern neben den Objekten auch noch Werte elementarer Typen enthält.
Dadurch wird die Sprache leider verkompliziert, weil zur Darstellung eines Wertes nun zwei verschiedenen Typen in Frage kommen: Es muß jeweils gewählt werden, ob ein elementarer Typ oder ein entsprechender Hülltyp verwendet wird, es sind gelegentlich Umwandlungen zwischen beiden Arten der Darstellung nötig und auch das Lernen wird aufwendiger, da unterschiedliche Regeln für beide Arten der Darstellung erlernt werden müssen.
Wertsemantik und Referenzsemantik
Ein Unterschied zwischen Werten elementarer Typen und Exemplaren ihrer Klassen ist Semantik der Identität (Lehre von der Bedeutung der Identität).
Zwei gleiche Werte sind natürlich gleich. Allerdings können zwei verschiedene Exemplare einer Hüllklasse den gleichen Wert darstellen, anders gesagt: zu gleichen Werten können unterschiedliche Exemplare gehören. Um die Werte zu vergleichen muß dann die Operation »equals( Object )« verwendet werden, da der Operator »==« die Referenzen vergleicht.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.Integer p = new java.lang.Integer( 0 );
final java.lang.Integer q = new java.lang.Integer( 0 );
java.lang.System.out.println( 0 == 0 );
java.lang.System.out.println( p == q );
java.lang.System.out.println( p.equals( q )); }}transcript
true
false
true
Die technisch einfachere und eindeutig definierte Relation ist die durch den Operator »==« getestet Gleichheit. Diese stimmte jedoch nicht immer mit dem überein, was man sich unter „Gleichheit“ vorstellt.
Daher wird das Gleichwertigkeitsprädikat »equals« für einen Typ so definiert, daß es vergleicht, ob zwei Objekte den gleichen Wert enthalten. Wann zwei Objekte als gleichwertig angesehen werden, ist ein Frage der Übereinkunft (Konvention, Gewohnheit). Technisch kann das Prädikat »equals« eigentlich willkürlich definiert werden.
Daß zwei Referenzausdrücke den gleichen Wert (die gleiche Referenz, das gleiche Objekt ) haben, wird mit dem Prädikat »==« notiert. Daß zwei Objekte „den gleichen Wert enthalten “ oder „gleichwertig sind“ wird mit dem Prädikat "equals" notiert. Zwei verschiedene Objekte können einander gleichwertig sein.
Zwei verschiedene Objekte kann man mit zwei Flaschen Wein vergleichen. Zwei verschiedene Flaschen können den gleichen Wein enthalten und das gleiche Etikett haben. Wenn man eine davon kaufen will, ist die andere genauso akzeptabel, da man sie ohnehin nicht unterscheiden kann. Sie sind dann gleichwertig, aber nicht gleich, da es ja immer noch zwei verschiedene Flaschen sind.
Ermittlung des Namens des eingehüllten Typs
Auch für den Typ »double«, den Typ »boolean« und den Typ »char« gibt es jeweils eine Hüllklasse, nämlich die Klasse »java.lang.Double«, »java.lang.Boolean« beziehungsweise »java.lang.Character«.
Wenn ein Zeichenfolgenobjekt mit dem Text »Hallo!« benötigt wird, kann das Literal »"Hallo!"« verwendet werden, ohne daß ein Exemplarerzeugungsausdruck benötigt wird.
java.lang.System.out.println( Integer.TYPE.getName() );
»int.class« hat den gleichen Wert wie »Integer.TYPE«, es ist eine Repräsentation des elementaren Typs »int« durch ein Objekt.