2011-12-17 13 views
26

Aquí está el paquete java-árbol: http://docs.oracle.com/javase/7/docs/api/java/lang/package-tree.html¿Por qué no hay una clase java.lang.Array? Si una matriz de Java es un Objeto, ¿no debería extender Objeto?

leí un tutorial sobre Java, que declararon que en Java matrices son objetos.

¿Dónde está la clase de matriz? ¿Cómo podemos hacer matrices como esta:

byte[] byteArr = new byte[]; 
char[] charArr = new char[]; 
int[] intArr = new int[]; 

y las matrices heredarán métodos de Object; por ejemplo:

byte thisByte = 1; 
    byte thatByte = 2; 
    byte[] theseBytes = new byte[] {thisByte, thatByte}; 
    int inheritance = theseBytes.length; //inherited 'length' field and some methods 
    int wasntInWill = thatByte.length; //error 

¿Qué está pasando aquí?

EDIT:

De acuerdo con las respuestas, ahora sé que es una clase final en java.lang.reflect paquete.

He creado un paquete java.lang.reflect en mi proyecto de Android y he agregado una clase llamada Array.java. Para confirmar que esto está en el camino de la clase original, Eclipse me dio el error "... ya existe en path/to/android.jar"

Si escribo la misma clase que java.lang.reflect.Array pero modifico el método toString() ... esto debería funcionar dentro de mi aplicación ¿verdad?

+0

Las matrices son objetos, pero con una sintaxis de construcción ligeramente diferente a los objetos normales de Java –

+1

Incorrecto. No es una clase 'final' en 'java.lang.reflect' package '. – EJP

Respuesta

38

De JLS:

Cada matriz tiene un objeto de clase asociado, compartida con todos los demás matrices con el mismo tipo de componente. [Esto] actúa como si: la superclase directa de un tipo de matriz es Object [y] cada tipo de matriz implementa las interfaces Clonables y java.io.Serializable.

Esto se muestra en el siguiente código de ejemplo:

class Test { 
    public static void main(String[] args) { 
     int[] ia = new int[3]; 
     System.out.println(ia.getClass()); 
     System.out.println(ia.getClass().getSuperclass()); 
    } 
} 

que imprime:

class [I 
class java.lang.Object 

donde la cadena "[I" es la firma de tipo en tiempo de ejecución para el objeto de la clase "array with component type int" .

Y sí, ya que los tipos de matriz se extienden de manera efectiva del objeto, puede invocar toString() en ArrayObject ver también el ejemplo anterior

int arr[] = new arr[2]; 
arr.toString(); 
+0

Hola, gracias por la información. Edité mi pregunta para llegar a lo que realmente estaba buscando: cómo anular el método toString() para matrices. – Ozzy

+0

De nada, no tiene clase en su mano para cambiar, mejor cree un método util que acepte el objeto de matriz e imprímalo en la forma que desee –

+0

Sé que solo estoy tratando de ver si se puede hacer . Por supuesto que debería probarlo antes de preguntar eso, pero había una pequeña parte novata de mí que estaba preocupada de que explotara mi computadora. – Ozzy

8

Las matrices son una característica del lenguaje - que tienen una sintaxis específica para la declaración y el acceso. Y su definición de clase está oculta para ti.

Ellos tienen una representación en la API refleciton - java.lang.reflect.Array

Por cierto, el campo length no se hereda de Object. Los métodos .getClass(), .toString(), etc. se heredan.

+0

Oh tan java.lang.reflect.Array es la definición de la clase? Y sí, quise decir herencia de algún objeto de matriz (para probar que hay una clase de matriz en algún lugar) – Ozzy

+0

el campo 'longitud' no existe, no existe tal campo en ninguna matriz. Es solo una característica del lenguaje Java que representa el campo de código de operación 'ARRAYLENGTH'. Técnicamente, virtualmente cada impl. tiene ese campo en el encabezado del objeto, sin embargo. Las matrices implementan también 2 interfaces: 'Serializable' y' Clonable' y publica el método 'clone()'. – bestsss

+2

@Ozzy No, 'java.lang.reflect.Array' no es la definición de clase. Es una clase de reflexión de utilidad que no tiene más que métodos estáticos. – EJP

1

Si una matriz de java es un objeto, ¿no debería extender Object?

Se se extiende java.lang.Object.

+0

llega un poco tarde, ya encontré la clase (ver respuesta arriba) – Ozzy

+0

@downvoter Por favor explique la respuesta correcta. – EJP

+0

@Ozzy No encontraste la clase en ningún lado. No está definido en ningún lado. Ni siquiera es una sola clase. Hay uno para cada tipo primitivo, p. 'int []', y uno para cada tipo de objeto, p. 'Objeto [],' 'Cadena [],' etc. – EJP

5

elaboración Poca del segmento de código anterior:

public class ClassForName { 
    public static void main(String[] argv) throws ClassNotFoundException { 
     Class theClass = Class.forName("[I"); 
     System.out.println(theClass.getName()); 
     Class superClass = theClass.getSuperclass(); 
     System.out.println(superClass.getName()); 
    } 
} 

Resultados :

C:\JavaTools>java ClassForName 
[I 
java.lang.Object 

Como se puede ver, "[I" es el nombre de la clase que llamaríamos, en inglés, "array of int". La clase es una clase Java de "ciudadanía plena", que responde a todos los métodos de Object. La única diferencia es que la sintaxis new es diferente y no es compatible con el método newInstance() de Clase.

(Las clases "[I", "[C", et al, están "predefinidas" en la JVM - no hay archivos .class correspondientes. Java también creará implícitamente, sobre la marcha , la clase "[MyJavaClass;" si tiene una matriz de "MyJavaClass" en su programa.]

Cuestiones relacionadas