¿Hay alguna razón por la que una matriz en Java sea un objeto?En Java, ¿por qué los arrays son objetos? ¿Hay alguna razón específica?
Respuesta
Debido a que la especificación del lenguaje Java says so :)
En las matrices de lenguaje de programación Java son objetos (§4.3.1), se crean dinámicamente, y pueden ser destinados a variables de tipo Object (§ 4.3. 2). Todos los métodos de clase Object pueden invocarse en una matriz.
Así, a diferencia de C++, Java proporciona verdaderas matrices como objetos de primera clase:
- hay un miembro
length
. - Hay un método
clone()
que anula el método del mismo nombre en la claseObject
. - Más todos los miembros de la clase
Object
. - Se emite una excepción si intenta acceder a una matriz fuera de los límites.
- Las matrices se instancian en la memoria dinámica.
para que puedan obtener todos los beneficios de los mismos:
- GetHashCode()
- toString()
etc.
y matrices no son 'primitivos', por lo si no pueden ser primitivos, deben ser objetos.
En Java, las implementaciones predeterminadas 'hashCode' y' toString' se utilizan (a saber, el código hash de identidad y '[LFooBar; @ deadbeef') para las matrices, por lo que no son realmente muy útiles en general. :-P –
No estoy seguro de la razón oficial.
Sin embargo, tiene sentido para mí que sean objetos porque se pueden realizar operaciones en ellos (como tomar la longitud) y tiene más sentido apoyar estas operaciones como funciones miembro en lugar de introducir nuevas palabras clave. Otras operaciones incluyen clone(), las operaciones heredadas de objetos, etc. Las matrices también son hashable y potencialmente comparables.
Esto es diferente de C (y matrices nativas en C++), donde sus matrices son esencialmente punteros a una compensación de memoria.
En realidad, tomar la longitud de una matriz de Java no es una operación. La longitud es un miembro público del objeto. –
Eso es verdad. No estoy seguro de por qué no pusieron un final getLength() sobre ellos. – Uri
Las matrices no son comparables usando el orden natural, pero, por supuesto, es libre de escribir un 'Comparador' que funcione con ellas. –
Tener matrices ser objetos significa que puede hacer operaciones con ellos (por ejemplo, someArray.count ('foo')) en lugar de simplemente hacerlo contra ellos (por ejemplo, count (someArray, 'foo')), que conduce a una sintaxis más natural.
Excepto que en Java, las matrices no tienen ningún método adicional, excepto 'clone' (que tiene el tipo de retorno covariante correcto, es público y no tiene excepciones marcadas). También tienen un campo adicional, 'longitud '. Más allá de eso, no hay métodos adicionales o campos más allá de lo que se proporciona con 'Objeto' están disponibles. –
Otro punto es que los objetos son mutables y se pasan por referencia. En las matrices no hay campos/métodos que pueda usar para cambiar las "propiedades" de la matriz, pero puede cambiar los valores de los elementos. Y los beneficios de pasar arreglos por referencia son bastante obvios (aunque los programadores funcionales probablemente desearían que Java tuviera listas inmutables pasadas por valor).
Editar: se olvidó de mencionar. En el período anterior al autoboxing, fue útil poder almacenar matrices en colecciones, escribirlas en ObjectStreams, etc.
Quería hacerte un +1 para el pase por referencia, pero ¿por qué alguien querría pasar algo inmutable por valor? Un gran + con inmutabilidad es que puedes pasar por referencia sin miedo a los efectos secundarios. – ILMTitan
Pasar por valor no necesariamente significa copiar el valor. En realidad, en idiomas con Transparencia Referencial: http://en.wikipedia.org/wiki/Referential_transparency_%28computer_science%29 la distinción es irrelevante. – Dan
Este link explica por qué la matriz son objetos en Java (al comienzo del artículo).
Puede mejorar la respuesta citando las partes esenciales de ese artículo aquí porque a stackoverflow le gusta traer la información en el sitio, presumiblemente como un resaltado de partes relevantes y el archivo. – n611x007
Probablemente porque querían acercarse lo más posible a hacer de todo un objeto. Los tipos nativos están ahí para compatibilidad con versiones anteriores.
- 1. ¿Por qué los arrays de arrays (vectores) son tan lentos?
- 2. ¿Por qué los objetos Joda son inmutables?
- 3. ¿Qué son los objetos simulados en Java?
- 4. ¿Hay alguna buena razón por la cual los ternarios en C# son limitados?
- 5. ¿Hay alguna razón legítima para ocultar los métodos estáticos?
- 6. ¿Qué son los objetos inmutables?
- 7. ¿Qué son los objetos anclados?
- 8. ¿Qué son los objetos diferidos?
- 9. ¿por qué los objetos dict son inalterables en python?
- 10. ¿Hay alguna razón para precargar encajables de los recursos?
- 11. En Flash Player 10 con vectores, ¿por qué usarías Arrays?
- 12. ¿Hay alguna razón específica detrás de usar $ con la variable en jQuery
- 13. ¿Hay alguna razón por la cual MicrosoftAjax.js no esté minificado?
- 14. ¿Hay alguna razón para usar System.Uri?
- 15. ¿Hay alguna razón para lanzar una DivideByZeroException?
- 16. ¿Hay alguna razón de rendimiento para declarar los parámetros del método como definitivos en Java?
- 17. ¿Hay alguna razón para usar esto->
- 18. ¿Qué razón hay para que C# o Java tengan lambdas?
- 19. Solr eliminar no trabaja por alguna razón
- 20. ¿Por qué los objetos inmutables son seguros para subprocesos?
- 21. ¿Qué son los constructores implícitos en Java
- 22. ¿Hay alguna razón para preferir UTF-16 a UTF-8?
- 23. ¿Qué son los objetos de matrices vértice?
- 24. ¿Qué son los objetos de "primera clase"?
- 25. ¿Hay alguna razón para que un grupo de objetos no se trate como un singleton?
- 26. ¿Hay alguna razón negativa para usar una solución N-Tier?
- 27. ¿Qué se entiende por clases en sí mismas son objetos?
- 28. ¿Los objetos estáticos son únicos por usuario?
- 29. ¿Hay alguna razón para deshacerse de los métodos de incrustación de JavaScript en 2011?
- 30. ¿Hay alguna razón por la cual los desarrolladores de software no están externalizando la autorización?
Bueno, las matrices ciertamente no son primitivas. –
¿De qué fondo vienes? ¿DO? – hasen