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

Ozz*_*zzy 37 java arrays object

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

我读了一篇关于Java的教程,该教程表明在Java数组中是对象.

数组类在哪里?为什么我们可以制作这样的数组:

byte[] byteArr = new byte[];
char[] charArr = new char[];
int[] intArr = new int[];
Run Code Online (Sandbox Code Playgroud)

并且数组将从Object继承方法; 例如:

    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
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

编辑:

根据答案,我现在知道它是一个包装finaljava.lang.reflect.

我现在已经java.lang.reflect在我的Android项目中创建了一个包,并为其添加了一个名为Array.java的类.为了确认这是原始类的方式,Eclipse给了我错误"...已存在于path/to/android.jar"

如果我写出同一个类,java.lang.reflect.Array但改变toString()方法......这应该在我的应用程序中正常工作吗?

Jig*_*shi 43

来自JLS:

每个数组都有一个关联的Class对象,与具有相同组件类型的所有其他数组共享.[This]就像:数组类型的直接超类是Object [和]每个数组类型实现接口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());
    }
}
Run Code Online (Sandbox Code Playgroud)

打印:

class [I
class java.lang.Object
Run Code Online (Sandbox Code Playgroud)

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

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

int arr[] = new arr[2];
arr.toString();
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 9

数组是一种语言功能 - 它们具有用于声明和访问的特定语法.他们的班级定义对你来说是隐藏的.

他们在refleciton API中有代表 - java.lang.reflect.Array

顺便说一下,这个length领域不是继承自的Object.的.getClass(),.toString()等方法继承.

  • @Bozho有没有计划解决这个问题?你已经有4.5年了. (6认同)
  • @Ozzy No,`java.lang.reflect.Array`不是类定义.它是一个实用程序反射类,只有静态方法. (3认同)
  • 只是为了使后一个角更加清晰。如果您执行Integer [] array = new Integer [0]; System.out.println(array.getClass());`,您应该看到该类是`class [Ljava.lang.String;`,而不是`java.lang.reflect.Array` (2认同)

Hot*_*cks 7

稍微详细说明上面的代码段:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

C:\JavaTools>java ClassForName
[I
java.lang.Object
Run Code Online (Sandbox Code Playgroud)

可以看出,"[I"是我们将要调用的类的名称,用英语表示,"int的数组".该类是一个"完全公民"Java类,它响应Object的所有方法.唯一的区别是new语法不同,它不支持newInstance()Class 的方法.

(类["I","[C"等]在JVM中是"预定义的" - 没有与它们对应的.class文件.Java也会在运行中隐式创建"[ MyJavaClass;"如果你的程序中有一个"MyJavaClass"数组,则为class.)