2010-01-05 6 views

Respuesta

9

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 clase Object.
  • 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.
0

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.

+2

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 –

0

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.

+1

En realidad, tomar la longitud de una matriz de Java no es una operación. La longitud es un miembro público del objeto. –

+0

Eso es verdad. No estoy seguro de por qué no pusieron un final getLength() sobre ellos. – Uri

+0

Las matrices no son comparables usando el orden natural, pero, por supuesto, es libre de escribir un 'Comparador' que funcione con ellas. –

3

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.

+1

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. –

1

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.

+0

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

+0

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

1

Este link explica por qué la matriz son objetos en Java (al comienzo del artículo).

+0

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

1

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.

Cuestiones relacionadas