¿Es una matriz un tipo primitivo o un objeto (o algo completamente diferente)?

La pregunta es básicamente autoexplicativa. No he podido encontrar una API para matrices (aparte de estas matrices , pero esto solo define un conjunto de funciones estáticas de ayuda para tratar con las matrices reales). Si no hay una clase para él, esto parece sugerir que una matriz no puede ser un Object .

Sin embargo, el hecho de que una matriz tenga campos públicos como la length y los métodos que puede invocar como .equals() y .clone() parecen sugerir (con mucha fuerza) todo lo contrario.

¿Cuál es la explicación para la presentación y el comportamiento extraños de las matrices primitivas?

Como nota, traté de usar la característica Eclipse “Implementación abierta” en el método .clone() de una matriz en este momento, con la esperanza de poder ver dónde y cómo se definió este método (ya que decía int [ ] lo anuló del objeto), pero en realidad causó que todo mi Eclipse se congelara y se bloquee …

Hay una clase para cada tipo de matriz, por lo que hay una clase para int[] , hay una clase para Foo[] . Estas clases son creadas por JVM. Puede acceder a ellos por int[].class , Foo[].class . La Object.class directa de estas clases es Object.class

 public static void main(String[] args) { test(int[].class); test(String[].class); } static void test(Class clazz) { System.out.println(clazz.getName()); System.out.println(clazz.getSuperclass()); for(Class face : clazz.getInterfaces()) System.out.println(face); } 

También hay una regla de subtipificación en tiempo de comstackción, si A es subtipo de B , A[] es subtipo de B[] .

La especificación del lenguaje Java debe darle una idea:

La superclase directa de un tipo de matriz es Object.

Cada tipo de matriz implementa las interfaces Cloneable y java.io.Serializable .

Por otra parte :

Un objeto es una instancia de clase o una matriz.

Por lo tanto, las matrices no son instancias y, por lo tanto, no es necesario un constructor para crearlas. En su lugar, utiliza las expresiones de creación de matrices .

Vea el código a continuación. Comstack: –

  int[] arr = new int[2]; System.out.println(arr.toString()); 

Ahora, en cualquier tipo primitivo, no se puede llamar a un método ( toString() ) definido en la clase Object (O, cualquier método para ese asunto) … Entonces, una matriz es esencialmente un Object

OK aquí tienes: –

De la Sección 4.3 de JLS :

Hay cuatro tipos de tipos de referencia: tipos de clase (§8), tipos de interfaz (§9), variables de tipo (§4.4) y tipos de conjunto (§10).

Y, Sección 10 : –

En el lenguaje de progtwigción Java, las matrices son objetos (§4.3.1), se crean dinámicamente y pueden asignarse a variables de tipo Objeto (§4.3.2). Todos los métodos de clase Object pueden invocarse en una matriz.

Entonces, desde la primera cita, Array no es realmente una clase … Es de otro tipo … Pero, esencialmente las matrices son objetos, aunque no de una Class , pero son de tipo Array . Por lo tanto, no son instancias de alguna clase. , y pueden ser objetos de la array se definen para ser creados de esa manera ..

Tan corto y simple, sí [] es un tipo de Object . Se extiende directamente desde Object como yo lo entiendo. Hay todos los métodos de Objeto en él, toString() , hashCode() , … Más una variable expuesta especial llamada length . La clase java.util.Arrays es una clase de utilidad para tratar con tipos de matrices. Es un poco confuso cuando agregas cosas como: int[] no hereda de Object[] . Además, a diferencia de otros tipos de Object , no hay constructores para tipos de matriz. Respetan la new palabra clave, pero eso generalmente se asigna para el tamaño. Es un poco extraño, pero solo una de esas peculiaridades del lenguaje.

Para responder la pregunta, sí, son un objeto.

Una matriz es un objeto contenedor que contiene un número fijo de valores de un solo tipo.

Ver http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

Solo esos varios tipos primitivos en Java como los conocemos. Básicamente, todavía tenemos varios pasos para crear una matriz, como declarar, construir o inicializar si es necesario, y eso significa que la matriz es un objeto en verdad.

Al profundizar, los tipos primitivos pueden almacenarse en la memoria con los valores originales, pero el objeto es una dirección (referencia). Entonces, podemos imaginar una paradoja, ¿cómo podríamos almacenar los valores originales en la memoria si la matriz es un tipo primitivo? Creo que es lo mismo que String, pero String es un objeto final para que puedas construir un objeto de una manera fácil, String s = “s”, como un tipo primitivo.

Intereting Posts