Hallo! Sie sind mit primitiven Typen bereits recht vertraut und haben viel mit ihnen gearbeitet.
Primitive haben in der Programmierung und insbesondere in Java viele Vorteile: Sie beanspruchen wenig Speicher, erhöhen dadurch die Effizienz des Programms und sind übersichtlich in Wertebereiche unterteilt. Beim Erlernen von Java haben wir jedoch wie ein Mantra mehr als einmal wiederholt: „
In Java ist alles ein Objekt .“ Aber Primitive sind eine direkte Widerlegung dieser Worte. Sie sind keine Objekte. Der Grundsatz „Alles ist ein Objekt“ ist also falsch? Nicht wirklich. In Java hat jeder primitive Typ seinen Zwillingsbruder,
die Wrapper-Klasse (
Wrapper
). Was ist ein Wrapper?
Ein Wrapper ist eine spezielle Klasse, die den Wert eines Grundelements in sich selbst speichert. Da es sich jedoch um eine Klasse handelt, kann sie eigene Instanzen erstellen. Sie speichern die notwendigen Grundwerte im Inneren, während sie echte Objekte sind. Die Namen der Wrapper-Klassen sind den Namen der entsprechenden Grundelemente sehr ähnlich oder stimmen vollständig mit ihnen überein. Daher wird es sehr einfach sein, sich an sie zu erinnern.
Wrapper-Klassen für primitive Datentypen |
Primitive Datentypen |
Wrapper-Klassen |
int |
Ganze Zahl |
kurz |
Kurz |
lang |
Lang |
Byte |
Byte |
schweben |
Schweben |
doppelt |
Doppelt |
verkohlen |
Charakter |
Boolescher Wert |
Boolescher Wert |
Wrapper-Klassenobjekte werden wie alle anderen erstellt:
public static void main(String[] args) {
Integer i = new Integer(682);
Double d = new Double(2.33);
Boolean b = new Boolean(false);
}
Mit Wrapper-Klassen können Sie die Nachteile primitiver Typen abmildern. Das offensichtlichste ist, dass
Grundelemente keine Methoden haben . Sie verfügen beispielsweise nicht über eine Methode
toString()
, sodass Sie beispielsweise keine Zahl
int
in eine Zeichenfolge umwandeln können. Aber mit einer Wrapper-Klasse
Integer
ist es einfach.
public static void main(String[] args) {
Integer i = new Integer(432);
String s = i.toString();
}
Auch bei der Rücktransformation wird es Schwierigkeiten geben. Nehmen wir an, wir haben eine Zeichenfolge, von der wir sicher wissen, dass sie eine Zahl enthält. Bei einem primitiven Typ
int
ist es uns jedoch nicht möglich, diese Zahl aus der Zeichenfolge abzurufen und sie tatsächlich in eine Zahl umzuwandeln. Aber dank Wrapper-Klassen haben wir jetzt diese Möglichkeit.
public static void main(String[] args) {
String s = "1166628";
Integer i = Integer.parseInt(s);
System.out.println(i);
}
Ausgabe: 1166628 Wir haben erfolgreich eine Zahl aus einer Zeichenfolge abgerufen und sie einer Referenzvariablen zugewiesen
Integer i
. Übrigens zu den Links. Sie wissen bereits, dass Parameter auf unterschiedliche Weise an Methoden übergeben werden: Grundelemente werden als Wert und Objekte als Referenz übergeben. Dieses Wissen können Sie bei der Erstellung Ihrer Methoden nutzen: Wenn Ihre Methode beispielsweise mit Bruchzahlen arbeitet, Sie aber die Logik der Referenzübergabe benötigen, können Sie
Double/Float
statt . Parameter an die Methode übergeben
double/float
. Darüber hinaus verfügen Wrapper-Klassen zusätzlich zu Methoden über statische Felder, die sehr praktisch sind. Stellen Sie sich zum Beispiel vor, dass Sie jetzt vor einer Aufgabe stehen:
Geben Sie die maximal mögliche Anzahl an die Konsole aus int
und dann die minimal mögliche Anzahl. Die Aufgabe scheint einfach zu sein, aber ohne Google wird man sie kaum schaffen. Und mit Wrapper-Klassen können Sie ganz einfach die folgenden „Alltagsprobleme“ lösen:
public class Main {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
}
}
Solche Felder ermöglichen es Ihnen, nicht von ernsteren Aufgaben abgelenkt zu werden. Ganz zu schweigen von der Tatsache, dass es beim Drucken der Zahl
2147483647 (das ist genau MAX_VALUE) nicht verwunderlich ist, dass man sich vertippt :) Darüber hinaus haben wir in einer der vorherigen Vorlesungen bereits darauf aufmerksam gemacht, dass Objekte
von Wrapper-Klassen sind unveränderlich (unveränderlich) .
public static void main(String[] args) {
Integer a = new Integer(0);
Integer b = new Integer(0);
b = a;
a = 1;
System.out.println(b);
}
Ausgabe: 0 Das Objekt, auf das die Referenz ursprünglich zeigte,
а
hat seinen Zustand nicht geändert, sonst
b
hätte sich auch der Wert geändert. Anstatt
String
den Status des Wrapper-Objekts zu ändern, wird wie bei ein völlig neues Objekt im Speicher erstellt. Warum haben sich die Entwickler von Java letztendlich dafür entschieden, primitive Typen in der Sprache beizubehalten? Da alles ein Objekt sein sollte und wir bereits Wrapper-Klassen haben, mit denen alles ausgedrückt werden kann, was Grundelemente ausdrücken, warum lassen wir sie nicht einfach in der Sprache und entfernen die Grundelemente? Die Antwort ist einfach: Leistung. Primitive Typen werden als primitiv bezeichnet, weil ihnen viele „schwere“ Objektmerkmale fehlen. Ja, ein Objekt verfügt über viele praktische Methoden, aber Sie benötigen sie nicht immer. Manchmal benötigen Sie einfach die Zahl 33 oder 2,62 oder den Wert
true
/
false
. In Situationen, in denen alle Vorteile von Objekten irrelevant sind und für die Funktion des Programms nicht benötigt werden, leisten Primitiven einen viel besseren Job.
Automatisches Ein- und Auspacken
Eines der Merkmale von Primitiven und ihren Wrapper-Klassen in Java ist Autoboxing/Autounboxing.
Lassen Sie uns dieses Konzept verstehen. Wie Sie und ich bereits zuvor erfahren haben, ist Java eine objektorientierte Sprache. Das bedeutet, dass alle in Java geschriebenen Programme aus Objekten bestehen. Primitive sind keine Objekte. Der Wrapper-Klassenvariablen kann jedoch ein Wert eines primitiven Typs zugewiesen werden. Dieser Vorgang wird
Autoboxing genannt
. Auf die gleiche Weise kann einer Variablen eines primitiven Typs ein Objekt einer Wrapper-Klasse zugewiesen werden.
Dieser Vorgang wird Autounboxing genannt . Zum Beispiel:
public class Main {
public static void main(String[] args) {
int x = 7;
Integer y = 111;
x = y;
y = x * 123;
}
}
In Zeile 5 weisen wir dem Grundelement x den Wert von y zu, das ein Objekt der Wrapper-Klasse ist
Integer
. Wie Sie sehen, sind hierfür keine weiteren Aktionen erforderlich:
Der Compiler weiß das int
und Integer
tatsächlich dasselbe . Das ist automatisches Entpacken. Das Gleiche passiert beim Autoboxing in Zeile 6: Dem Objekt y wird ganz einfach der Wert von Primitiven (x*123) zugewiesen. Dies ist ein Beispiel für Autopacking. Aus diesem Grund wird das Wort „auto“ hinzugefügt:
Um Objekten ihrer Wrapper-Klassen primitive Referenzen zuzuweisen (und umgekehrt), müssen Sie nichts tun, alles geschieht automatisch . Praktisch, oder? :) Ein weiterer sehr großer Komfort des automatischen Packens/Auto-Entpackens zeigt sich in der Funktionsweise der Methoden. Tatsache ist, dass
Methodenparameter auch dem automatischen Packen und Entpacken unterliegen . Und wenn einer von ihnen beispielsweise zwei Objekte als Eingabe verwendet
Integer
, können wir dort problemlos gewöhnliche Grundelemente übergeben
int
!
public class Main {
public static void main(String[] args) {
printNumber(7);
}
public static void printNumber(Integer i) {
System.out.println(„Sie haben eine Nummer eingegeben“ + i);
}
}
Ausgabe: Sie haben die Zahl 7 eingegeben. Es funktioniert umgekehrt:
public class Main {
public static void main(String[] args) {
printNumber(new Integer(632));
}
public static void printNumber(int i) {
System.out.println(„Sie haben eine Nummer eingegeben“ + i);
}
}
Ein wichtiger Punkt, den Sie beachten sollten:
Autoboxing und Unboxing funktionieren nicht für Arrays !
public class Main {
public static void main(String[] args) {
int[] i = {1,2,3,4,5};
printArray(i);
}
public static void printArray(Integer[] arr) {
System.out.println(Arrays.toString(arr));
}
}
Der Versuch, ein Array von Grundelementen an eine Methode zu übergeben, die ein Array von Objekten als Eingabe verwendet, führt zu einem Kompilierungsfehler. Lassen Sie uns abschließend noch einmal kurz die Primitiven und Wrapper-
Primitive vergleichen:
- einen Leistungsvorteil haben
Wrapper:
- Sie ermöglichen es Ihnen, den Grundsatz „Alles ist ein Objekt“ nicht zu verletzen, sodass Zahlen, Symbole und boolesche Werte wahr/falsch nicht aus diesem Konzept fallen
- Erweitern Sie die Möglichkeit, mit diesen Werten zu arbeiten, indem Sie praktische Methoden und Felder bereitstellen
- Erforderlich, wenn eine Methode ausschließlich mit Objekten arbeiten kann
GO TO FULL VERSION