2012-10-09 88 views
43

La pregunta es básicamente autoexplicativa. No he podido encontrar una API para matrices (aparte de esta Arrays, pero esto solo define un conjunto de funciones estáticas de ayuda para tratar las matrices reales). Si no hay clase para él, esto parece sugerir que una matriz no puede ser Object.¿Es una matriz un tipo primitivo o un objeto (o algo completamente diferente)?

Sin embargo, el hecho de que un array tiene campos públicos como length y métodos que se pueden invocar como .equals() y .clone() parecen sugerir (muy fuerte) todo lo contrario.

¿Cuál es la explicación de la presentación impar y el comportamiento de las matrices primitivas?

Como nota, traté de utilizar la característica Eclipse "Implementación abierta" en el método .clone() de una matriz en este momento, con la esperanza de que podría ver dónde y cómo se definió este método (ya que dijo int [] datos sobrescritos del objeto), pero en realidad causó toda mi Eclipse para congelar y accidente ...

Respuesta

48

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 superclase directa de estas clases son 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 subtipos de tiempo de compilación, si es A subtipo de B, A[] es subtipo de B[].

+0

¡Excelente respuesta! Ahora entiendo por qué no pude encontrar ninguna API ni nada. Es muy interesante que la JVM crea estas clases en tiempo de ejecución. Sin embargo, una última pregunta: si una matriz es miembro de una clase como cualquier otro objeto, ¿cómo funciona la inicialización? Si lo que dices es exacto y [] es solo parte del nombre de la clase, ¿por qué no se declaran utilizando un constructor, es decir, nuevo int [] (2) frente a nuevo int [2]? – asteri

+0

la sintaxis 'int [2]' era de C, que Java intentó estar cerca. – irreputable

+0

es más probable que exista un código especial en el jvm para manejar la inicialización de la matriz, que es bastante diferente a la instanciación de objetos estándar. – Matt

5

tan corta y sencilla, sí <Tipo> [] es un tipo de Object. Se extiende directamente desde Object según 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 se agrega al desorden cosas como: int[] no hereda de Object[]. Además, a diferencia de otros tipos Object, no hay constructores para los tipos de matriz. Respetan la palabra clave new, pero eso generalmente se asigna para el tamaño. Es un poco extraño, pero solo una de esas peculiaridades del lenguaje.

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

+0

Una matriz es un objeto ... pero int [] no hereda de Object? Esto me confunde. Y también estoy confundido por la ausencia de un constructor, ya que usamos 'new' ... ¿Cómo funciona esto? ¿Es básicamente una matriz primitiva un cruce entre un objeto y una primitiva cableada ...? – asteri

+1

no int [] no hereda de Object [].Como int [] y Object [], String [] ... todos diferentes porque todos heredan de Object, no Object []. Los genéricos ayudan a la hora de escribir métodos que toman matrices, así como la clase de utilidad Arrays que mencioné, pero esta rareza rara lleva a un código funky a veces para alinear los tipos –

+0

Si int [] no hereda de Object y int [] no es un primitivo, ¿qué es? ¿La máxima principal de Java (que todos los objetos se extienden 'Objeto') no es del todo cierta, y hay una categoría separada de objetos a los que pertenecen las matrices? – asteri

13

Consulte el siguiente código. Se compila: -

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 de objeto (O cualquier método para el caso) .. Por lo tanto, una matriz es esencialmente un Object. .

OK, aquí van: -

Desde el JLS Section 4.3: -

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, Section 10: -

En el lenguaje de programación Java, los arrays son objetos (§4.3.1), se crea de forma dinámica, 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í, desde el primer presupuesto, Array no es en realidad una clase .. Es otro tipo de .. Pero, esencialmente, las matrices son objetos, aunque no de alguna Class, pero son de tipo Array .. Así que se no son instancias de una clase, y pueden ser objeto de array se definen a ser creado de esa manera ..

+0

Soy consciente. He usado matrices antes. La pregunta simplemente vino a la mente cuando nos dimos cuenta de cuán diferentes se comportan las matrices que los objetos reales y regulares. Por ejemplo, en su declaración "nueva", no usa 'new int [2]()' ... porque no es un constructor real. ¿Por qué? ¿Dónde está la API? ¿Cuál es la explicación? Es menos simple de lo que lo haces. – asteri

+1

Y preferiría saber si a alguien no le gusta mi respuesta, para poder mejorarla, en lugar de solo ver los votos abajo en ella ... –

+0

@Jeff .. He editado mi publicación para que sea más sensata ... Puedes echarle un vistazo ... –

25

El Java Language Specification debería darle una idea:

La superclase directa de un tipo de matriz es objeto.

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

Moreover:

un objeto es una instancia de clase o una matriz.

Así que las matrices no son instancias y, por lo tanto, no es necesario un constructor para crearlas. En cambio, usa el Array Creation Expressions.

+0

Tal vez estoy pensando demasiado ... pero ¿cómo puede algo que no sea una clase o un miembro de una clase extender aún 'Objeto'? – asteri

+1

@Jeff Realmente no puedo responder eso. Tal vez [esto] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.7) ayude. Además, hay una respuesta interesante [aquí] (http://stackoverflow.com/questions/2267790/how-are-arrays-implemented-in-java). – Baz

+0

@Jeff 'int []' es una clase – irreputable

0

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 de verdad.

Más profundo, los tipos primitivos se pueden almacenar 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.

Cuestiones relacionadas