java.lang.Object o = 1; // perché questa compilazione?
-
23-09-2019 - |
Domanda
che stavo facendo uno di questi test Java on-line e mi è stato chiesto questa domanda:
D: Indicate corretta assegnazione:
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);
Si prega di provare voi stessi prima di andare oltre.
Beh, posso dire mi sono sbagliato, ho studiato ed ho trovato:
//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
Qualcuno può dire perché:
Object o = 1;
e Object o = "1";
compilare ed uscita 1 in entrambi i casi, questo sono io sconcertante.
Grazie
Soluzione
"1"
è un'istanza della classe String e String è una sottoclasse di classe Object in Java (come qualsiasi altra classe). 1
è inscatolato in un numero intero, anch'esso derivato da Object.
Altri suggerimenti
A causa "1"
è un'istanza di un String
, e dal momento che 1,5 1
è auto-boxable a un Integer
; entrambi i tipi sono sottotipi di Object
. Prima autoboxing è stato introdotto, Object o = 1;
non sarebbe la compilazione.
Per ottenere il massimo da questa esperienza di apprendimento, si deve essere consapevoli del metodo di Object
di getClass()
. Con l'aggiunta di System.out.println(o.getClass().getName())
, è anche possibile stampare il nome della classe che l'oggetto a cui si riferisce o
appartiene. Nel tuo caso, essi sono java.lang.String
(per (Object) "1"
) e java.lang.Integer
(per (Object) 1
).
Solo per il completamento, vorrei ricordare che ora è possibile anche fare Object o = false;
.
Bene, il primo caso "1" è una String
letterale, quindi una sottoclasse di oggetto, quindi assegnabile ad esso. Come una stringa, uscita 1 è relativamente semplice.
Nel secondo caso, l'auto-boxe si sta verificando. Integer
è una sottoclasse di oggetto, quindi assegnabile ad esso. Analogamente, l'uscita del 1 quindi perfettamente senso.
Questo perché o
è di tipo Object
. Ogni oggetto, in Java, estende la Object
di classe. Quindi ... quando si dice Object o = 1
, converte 1 fino a di int
a Integer
, che è un Object
. Analogamente, "1" è un String
che è un Object
. In entrambi i casi, chiamando su un System.out.println
Object
invoca il metodo Object
s toString
. In entrambi i casi, verrà stampata 1.
È possibile inserire Object o = anything;
dove anything
è un qualsiasi oggetto, perché tutte le classi derivano dalla classe Object
. Funziona con le primitive a causa della caratteristica autoboxing che è venuto in Java 1.5.