¿Por qué no hay una clase java.lang.Array? Si una matriz de Java es un Objeto, ¿no debería extender Objeto?

Aquí está el árbol de paquetes java: http://docs.oracle.com/javase/7/docs/api/java/lang/package-tree.html

Leí un tutorial sobre Java que decía que en las matrices de Java hay objetos.

¿Dónde está la clase de matriz? ¿Cómo podemos hacer arreglos como este?

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 

¿Que está pasando aqui?

EDITAR:

Según las respuestas, ahora sé que es una clase final en el paquete java.lang.reflect .

Ahora 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 cambio el método toString() … esto debería funcionar dentro de mi aplicación ¿no?

De JLS :

Cada matriz tiene un objeto Class asociado, compartido con todas las 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 Cloneable y java.io.Serializable.

Esto se muestra con 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 de tiempo de ejecución para el objeto de clase "array with component type int" .

Y sí, dado que los tipos de matriz extienden efectivamente Object, puede invocar toString () en arrayObject y ver también el ejemplo anterior.

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

Las matrices son una función de idioma: tienen una syntax específica para declarar y acceder. Y su definición de clase está oculta para ti.

Tienen una representación en el refleciton API – java.lang.reflect.Array

Por cierto, el campo de length no se hereda de Object . Los .getClass() , .toString() , etc. son heredados.

Ligera elaboración 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 new syntax es diferente y no es compatible con el método newInstance() de Class.

(Las clases “[I”, “[C”, et al, están “predefinidas” en la JVM – no hay archivos de clase correspondientes a ellas. Java también creará implícitamente, sobre la marcha, el “[ MyJavaClass; “clase si tiene una matriz de” MyJavaClass “en su progtwig).

Si una matriz de Java es un Objeto, ¿no debería extender Object?

Extiende java.lang.Object.