2009-12-16 5 views

Respuesta

26

Debido al autoboxing. 5 no es un objeto por lo que se envuelve en un objeto (Integer en este caso), y Integer es un Number.

+1

Para comprobar esto por sí mismo sólo tiene que añadir System.out.println (n.getClass() getName().); – Buhb

+0

La pregunta era principalmente sobre clases abstractas. – whiskeysierra

+1

No, se trataba de "cómo funciona' Number n = 5; 'si' Number' es abstracto? "Consulte más arriba para ver cómo funciona. :) – Bombe

4

Fundamentalmente, es porque Number es una clase abstracta - no es ningún constructor que corresponde a Number(5), e incluso si había aún así no sería capaz de crear una instancia de la clase directamente porque es abstracto.

Como explica Bombe, en su segundo caso realmente está creando un objeto Integer * - que, como una subclase de Number, se puede asignar a dicha variable. Y como es una clase concreta, puedes crear una instancia.

* Aunque en la práctica es en realidad más equivalente a Integer.valueOf(5), que en Sun JRE no creará un objeto Integer adicional sino que usará una versión combinada (como el patrón Flyweight).

+0

¿por qué debe ser una clase estática? –

+0

+1 tu respuesta es mucho mejor que la de Bombe, ni siquiera usó la palabra resumen en su respuesta, de eso se trataba la pregunta – whiskeysierra

+0

@Carlos - Quise decir * clase concreta *, no estática; He solucionado este error tipográfico ("thinko"?), Gracias por señalarlo. AFAIK no existe una clase estática per se (ignorar las clases internas estáticas que son una cosa separada). –

-2

No debería ser. el autoboxing es un gran error.

+4

Tendría que estar en desacuerdo. int es el error. El lenguaje sería más simple, todo se definió como un Entero (o Largo o cualquier subclase de Número). Luego, permita que el compilador lo optimice en una primitiva (o cualquier primitiva). Por supuesto, tendría que manejar == de manera sensata . – MrJacqes

3

Es similar a cómo funcionaría el siguiente:

List bob = new ArrayList(); 

List es una interfaz, por lo que no puede crear una instancia directamente. Sin embargo, puede declarar una variable de tipo Lista y luego asignarle un objeto concreto que implemente esa interfaz. En la misma línea, puede declarar una variable de tipo Número y luego asignarle cualquier objeto de valor que sea una instancia concreta de ese tipo. Lo que han hecho con el código funcional es, para todos los efectos (debido a autoboxing):

Number n = new Integer(5); 
Cuestiones relacionadas