为什么没有java.lang.Array类? 如果一个java数组是一个Object,不应该扩展Object吗?

这里是java包树: http : //docs.oracle.com/javase/7/docs/api/java/lang/package-tree.html

我读了一篇关于Java的教程,其中说Java数组是对象。

数组类在哪里? 我们可以如何创build这样的数组:

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

数组将inheritanceObject的方法; 例如:

  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 

这里发生了什么?

编辑:

根据答案,我现在知道它是java.lang.reflect包中的final类。

我现在在我的Android项目中创build了一个java.lang.reflect包,并在其中添加了一个名为Array.java的类。 为了证实这是原来的类的方式,Eclipse给了我错误“…已经存在的path/到/ android.jar”

如果我写出与java.lang.reflect.Array相同的类,但更改toString()方法…这应该在我的应用程序的权利?

从JLS :

每个数组都有一个关联的Class对象,与所有其他具有相同组件types的数组共享。 [this]的作用如下:数组types的直接超类是Object [和]每个数组types实现接口Cloneable和java.io.Serializable。

这由以下示例代码显示:

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

打印:

 class [I class java.lang.Object 

其中string"[I"是types为"array with component type int"的类对象的运行时types签名"array with component type int"

是的,因为数组types有效地扩展了Object,所以你可以在arrayObject上调用toString()也可以看上面的例子

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

数组是一种语言function – 它们具有用于声明和访问的特定语法。 而他们的类定义对你来说是隐藏的。

它们在refleciton API中有一个表示 – java.lang.reflect.Array

顺便说一下, length字段不是从Objectinheritance的。 .getClass()等方法被inheritance。

对上述代码段进行细致的阐述:

 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()); } } 

结果:

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

可以看出,“I”是我们要叫的类的名字,英文是“int的数组”。 这个类是一个“完全公民”的Java类,它响应了Object的所有方法。 唯一的区别是new语法是不同的,它不支持Class的newInstance()方法。

(在JVM中,类“[I”,“[C”等是“预定义的” – 没有与它们对应的.class文件,Java也将隐式地创build“ MyJavaClass;“类,如果你的程序中有一个”MyJavaClass“数组。

如果一个java数组是一个Object,不应该扩展Object?

它确实扩展了java.lang.Object.