Por que não há uma class java.lang.Array? Se uma matriz java é um object, não deve estender o object?

Aqui está a tree de pacotes java: http://docs.oracle.com/javase/7/docs/api/java/lang/package-tree.html

Eu li um tutorial sobre Java, que afirmou que em matrizes de Java são objects.

Onde está a class de array? Como é que podemos criar matrizes assim:

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

e os arrays herdarão methods do Object; por exemplo:

  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 

Oque esta acontecendo aqui?

EDITAR:

De acordo com as respostas, agora sei que é uma class final no pacote java.lang.reflect .

Eu criei agora um pacote java.lang.reflect no meu projeto Android e adicionei uma class chamada Array.java a ele. Para confirmar isso está no caminho da class original, o Eclipse me deu o erro “… já existe em path / to / android.jar”

Se eu escrever a mesma class que java.lang.reflect.Array mas mude o toString() … isso deve funcionar dentro do meu aplicativo, certo?

De JLS :

Cada matriz possui um object de class associado, compartilhado com todas as outras matrizes com o mesmo tipo de componente. [Isto] age como se: a superclass direta de um tipo de array fosse Object [e] todo tipo de array implementa as interfaces Cloneable e java.io.Serializable.

Isso é mostrado pelo seguinte código de exemplo:

 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 

onde a cadeia "[I" é a assinatura do tipo de tempo de execução para o object de class "array with component type int" .

E sim, uma vez que os tipos de matriz efetivamente estendem o object, você pode invocar toString () em arrayObject também ver o exemplo acima

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

Matrizes são um recurso de linguagem – eles têm uma syntax específica para declarar e acessar. E sua definição de class está escondida de você.

Eles têm uma representação na API refleciton – java.lang.reflect.Array

Btw, o campo de length não é herdado do Object . Os .getClass() , .toString() , etc. são herdados.

Ligeira elaboração do segmento de código acima:

 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 pode ser visto, “[I” é o nome da class que chamamos, em inglês, “array of int”. A class é uma class Java de “cidadania completa”, que responde a todos os methods de Object. A única diferença é que a new syntax é diferente e não suporta o newInstance() da class.

(As classs “[I”, “[C”, et al, são “pré-definidas” na JVM – não há arquivos .class correspondentes a elas. O Java também implicitamente criará, na mosca, o “[ MyJavaClass; “class se você tiver uma matriz de” MyJavaClass “no seu programa.)

Se uma matriz java é um object, não deve estender o Object?

Ele estende java.lang.Object.