2009-12-16 6 views

risposta

26

A causa di autoboxing. 5 non è un oggetto quindi è racchiuso in un oggetto (Integer in questo caso) e Integer è un Number.

+1

Per verificare da soli Just Add System.out.println (n.getClass() getName().); – Buhb

+0

La domanda era principalmente sulle classi astratte. – whiskeysierra

+1

No, si trattava di "come funziona' Number n = 5; 'funziona se' Number' è astratto? "Vedi sopra per come funziona. :) – Bombe

4

Fondamentalmente, è perché Number è una classe astratta - ci è nessun costruttore che corrisponde a Number(5), e anche se ci fosse ancora non sarebbe in grado di creare un'istanza della classe direttamente perché è astratta.

Come spiega Bombe, nel secondo caso si sta veramente creando un oggetto Integer * - che, come sottoclasse di Number, può essere assegnato a tale variabile. E siccome è una lezione concreta, puoi istanziarla.

* Anche se in pratica è in realtà più equivalente a Integer.valueOf(5), che su Sun JRE non creerà un oggetto Integer aggiuntivo ma utilizzerà una versione in pool (come il modello Flyweight).

+0

perché deve essere una classe statica? –

+0

+1 la tua risposta è molto meglio di quella di Bombe, non ha nemmeno usato la parola abstract nella sua risposta, ecco di cosa si trattava – whiskeysierra

+0

@Carlos - Intendevo * concreto * di classe, non statico; Ho corretto questo errore ("thinko"?), Grazie per averlo indicato. AFAIK non esiste una classe statica di per sé (ignorando le classi interne statiche che sono una cosa separata). –

-2

Non dovrebbe essere. l'autoboxing è un grosso errore.

+4

Non sarei d'accordo. int è l'errore. Il linguaggio sarebbe più semplice, tutto è stato definito come numero intero (o lungo o qualsiasi sottoclasse di numero). Quindi il compilatore lo ottimizza in un int (o qualunque primitiva). Ovviamente dovrebbe gestire == in modo sensato . – MrJacqes

3

E 'simile a come il seguente dovrebbe funzionare:

List bob = new ArrayList(); 

List è un'interfaccia, quindi non è possibile creare un'istanza direttamente. Tuttavia, è possibile dichiarare una variabile di tipo List e quindi assegnarvi un oggetto concreto che implementa tale interfaccia. Sulla stessa linea, è possibile dichiarare una variabile di tipo Numero e quindi assegnarvi qualsiasi oggetto valore che sia un'istanza concreta di quel tipo. Quello che hai fatto con il codice funzionale è, per tutti gli effetti (a causa di autoboxing):

Number n = new Integer(5); 
Problemi correlati