2010-02-27 31 views
5

Stavo facendo uno di questi test Java on-line e mi è stato chiesto questa domanda:java.lang.Object o = 1; // perché viene compilato?

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 vi 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";

compilazione e l'uscita 1 in entrambi i casi questo mi sta sconcertando

Grazie

risposta

9

"1" è un'istanza della classe String e String è una sottoclasse di Object in Java (come qualsiasi altra classe). 1 è inserito in un numero intero, anch'esso derivato da Object.

+0

Wow, grazie per la risposta, ma devo dirti che mi sento così stupido ora dovrei saperlo. – Ramo

+0

@Ramo: non mettere in discussione qualcosa che non sai sarebbe stupido :-) – Grundlefleck

1

Bene, il primo caso "1" è un valore letterale String, quindi una sottoclasse di oggetto, quindi assegnabile ad esso. Come stringa, l'output di 1 è relativamente semplice.

Nel secondo caso, si sta verificando il box automatico. Integer è una sottoclasse di oggetti, quindi assegnabile ad esso. Allo stesso modo, l'output di 1 ha perfettamente senso.

1

Questo perché o è di tipo Object. Ogni oggetto, in java, estende la classe Object. Quindi ... quando si dice Object o = 1, converte da 1 a da int a Integer, che è un Object. Allo stesso modo, "1" è un String che è un Object. In entrambi i casi, chiamando System.out.println su un Object si invoca il metodo toString s Object s. In entrambi i casi, verrà stampato 1.

1

È possibile inserire Object o = anything; dove anything è un qualsiasi oggetto poiché tutte le classi derivano dalla classe Object. Funziona con le primitive a causa della funzione di autoboxing disponibile in Java 1.5.

3

Perché "1" è un'istanza di String e dal 1.5 1 è auto-inscatola a un Integer; entrambi i tipi sono sottotipi di Object. Prima che fosse introdotta l'autoboxing, Object o = 1; non veniva compilato.

Per ottenere il massimo da questa esperienza di apprendimento, è necessario essere a conoscenza del metodo getClass()Object. Aggiungendo System.out.println(o.getClass().getName()), è anche possibile stampare il nome della classe a cui appartiene l'oggetto cui si riferisce o. Nel tuo caso, sono java.lang.String (per (Object) "1") e java.lang.Integer (per (Object) 1).

Solo per il completamento, devo dire che ora puoi anche fare Object o = false;.

Problemi correlati