java.lang.Object o = 1; // Warum funktioniert das Kompilieren?
-
23-09-2019 - |
Frage
Ich war einer dieser Online-Java-Tests zu tun, und ich wurde diese Frage gestellt:
Frage: Geben Sie korrekte Zuordnung:
Long l = 1;
Double d = 1;
Integer i = 1;
String s = 1;
Object o = "1";
System.out.println(o);
o = 1;
System.out.println(o);
Bitte versuchen Sie sich, bevor Sie weiter gehen.
Nun, ich kann Ihnen sagen, dass ich es falsch, untersuchte ich es und gefunden:
//Long l = 1; //cannot widen and then box
Long ll = 1L;//no need to widen, just box
//Double d = 1;//cannot widen and then box
Double dd = 1d;//no need to widen, just box
Integer i = 1;//no need to widen, just box
//String s = 1;//cannot do implicit casting here
Object o = "1";//this compiles and is just plain weird
System.out.println(o);//output is 1
o = 1;//this also compiles and is also weird
System.out.println(o);//output is 1
Kann jemand sagen, warum:
Object o = 1;
und Object o = "1";
Kompilierung und Ausgang 1 in beiden Fällen, das ist mir rätselhaft.
Vielen Dank
Lösung
"1"
ist eine Instanz der Klasse String und String ist eine Unterklasse von Object-Klasse in Java (wie jede andere Klasse). 1
wird in eine Ganzzahl eingerahmt, die ebenfalls vom Objekt abgeleitet wird.
Andere Tipps
Da "1"
ist eine Instanz eines String
, und seit 1.5 1
ist auto-boxable zu einem Integer
; Beide Typen sind Subtypen von Object
. Vor dem Autoboxing eingeführt wurde, würde Object o = 1;
nicht kompiliert werden.
Um das Beste aus dieser Lernerfahrung zu erhalten, sollten Sie von Object
der getClass()
Methode bewusst sein. Durch die Zugabe von System.out.println(o.getClass().getName())
, können Sie auch den Namen der Klasse drucken, dass das Objekt bezeichnet durch o
gehört. In Ihrem Fall sind sie java.lang.String
(für (Object) "1"
) und java.lang.Integer
(für (Object) 1
).
Nur für den Abschluss, sollte ich erwähnen, dass Sie jetzt auch Object o = false;
tun.
Nun, der erste Fall „1“ ist ein String
wörtliche, so eine Unterklasse des Objekts, damit es belegbar. Als eine Zeichenkette ist es Leistung von 1 relativ einfach.
Im zweiten Fall, Auto-Box auftritt. Integer
ist eine Unterklasse des Objekts, daher zuordenbar es. In ähnlicher Weise macht die Ausgabe von 1 dann durchaus Sinn.
Das ist, weil o
vom Typ Object
ist. Jedes Objekt, in Java, erweitert die Klasse Object
. Also ... wenn Sie Object o = 1
sagen, wandelt es 1 von int
zu Integer
, was ein Object
ist. In ähnlicher Weise „1“ ist eine, die ein String
Object
ist. die System.out.println
s Object
Methode In beiden Fällen ruft Object
auf einem toString
Aufruf. In beiden Fällen wird es 1 gedruckt werden.
Sie können setzen Object o = anything;
wo anything
ist jedes Objekt, da alle Klassen aus der Object
-Klasse abgeleitet. Es arbeitet mit Primitiven wegen Autoboxing-Funktion, die 1,5 in Java kam.