Die Objektklasse ist eine Superklasse für jede Klasse in Java. Jede Klasse sollte also die Eigenschaften oder das Verhalten der Object-Klasse enthalten.
Dann können wir Array von Objekten wie folgt deklarieren:
%Vor%Wenn Sie zu String kommen, warum ist die Deklaration falsch:
%Vor% new String[]{"s","s"}
ist vom Typ String[]
, nicht String
. T[]
ist keine Unterklasse von T
(es sei denn T
ist zufällig Object
).
Object[]
ist ein Untertyp von Object
, weshalb der erste funktioniert. Tatsächlich sind alle Array-Typen subtype of Object
, einschließlich, vielleicht überraschend, Arrays von Primitiven, wie int[]
, obwohl int
kein Object
(*) ist.
Sie könnten den ersten mit spezifischeren Typen schreiben:
%Vor%Sie können die zweite wie folgt schreiben:
%Vor% Übrigens demonstriert s2
, dass Arrays in Java kovariant sind. Das ist problematisch, da Sie legal schreiben können:
, das zur Laufzeit mit einem ArrayStoreException
fehlschlägt, da Sie Object
referenzen nicht in String[]
speichern können.
Dies ist einer der Gründe, warum Autoren wie Josh Bloch den Ratschlag "Listen an Arrays bevorzugen" (siehe Effektiver Java 2nd Ed Punkt 25) geben, da Java-Sammlungen wie List
nicht kovariant sind und so leidet nicht das gleiche Problem.
(*) Um die Verwirrung zu erhöhen, sind primitive Arrays keine Subtypen von Object[]
, da Primitive keine Subtypen von Object
sind. Zum Beispiel wäre es ein Fehler beim Kompilieren zum Schreiben:
Etwas verwirrend ist ein Object[]
ein ein Object
. (Zum einen kann Java Arrays der Länge Null implementieren und Arrays Funktionsrückgabewerte zulassen.)
Es ist also sinnvoll, eine Object[]
-Instanz einer Referenz vom Typ Object
type zuzuweisen.
Aber das Zuweisen einer String[]
-Instanz zu einer Referenz vom Typ String
macht nicht Sinn. (Beachten Sie aber, dass String[]
auch und Object
ist.)
Also
Object c = new Object[] {1,2,"22" };
Sinnvoll String s = new String[]{"s","s"};
Ist nicht sinnvoll Object s = new String[]{"s","s"};
Sinnvoll Sein grundlegendes Java-Prinzip, Everything ist ein Object
, somit können Sie Objektreferenz für alles wie
Object o = new AnyOtherClass()
Sie können die Referenz einer Klasse für ihre Unterklassen verwenden
List l = new Arraylist()
Aber String [] ist ein Array
und Array
ist kein Vorfahre von String
array ist eine Sammlung von Objekten oder eine Sammlung primitiver Datentypen, während string eine Folge von Zeichen ist. Wie Sie wissen, Objekt ist Super-Klasse von jeder anderen Klasse, weshalb Sie wie folgt tun:
Object c = new Object[] {1,2,"22" };
Die String-Klasse ist keine Super-Klasse des Array-Typs ... Sie können also nicht wie folgt vorgehen.
%Vor%hoffe, das wird dir helfen ...
ist gültig, da ein Array von Object
s immer noch ein Object
ist. Sie könnten angeben, dass c
auch ein Array von Object
s auf Deklarationsebene ist, wie folgt:
Allerdings
%Vor% ist nicht gültig, da ein Array von String
s kein String
ist. Sie müssen entweder Ihr Array in ein String
wie folgt umwandeln:
oder um es als Array zu speichern, wie folgt:
%Vor%Erstens enthält Array die Referenz von Werten, die sich in Heap befinden.
Zweitens ist die Objektklasse die Mutterklasse jeder anderen Klasse in Java.
So kann Objekt-Array jede Art von Referenzwert enthalten, aber String-Array wird nur Verweis von String-Datentyp enthalten und jede Referenz verweist auf separate Zeichenfolge (string[0]= "a",string[1]="stackOverFlow"...)
.
Drittens, Eine Zeichenfolge ist eine Zeichenfolge in Java.
Also kann ein Stachel-Array kein String sein, weil es sich nicht auf die Zeichenfolge bezieht, sondern auf den String-Typ von Objekten, die sich im Heap befinden.
Tags und Links java