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

时间:2011-12-17 17:19:22

标签: 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[];

并且数组将从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

这里发生了什么?

修改

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

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

如果我写出与java.lang.reflect.Array相同的课程,但更改了toString()方法......这应该适合我的申请?

4 个答案:

答案 0 :(得分:41)

来自JLS

  

每个数组都有一个关联的Class对象,与其他所有对象共享   具有相同组件类型的数组。 [This]就像:数组的直接超类   type是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());
    }
}

打印:

class [I
class java.lang.Object

其中字符串"[I"是类对象"array with component type int"的运行时类型签名。

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

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

答案 1 :(得分:9)

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

他们在反思API中有一个表示 - java.lang.reflect.Array

顺便说一句,length字段不是从Object继承的。 <{1}},.getClass()等方法是继承的。

答案 2 :(得分: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());
    }
}

结果:

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

可以看出,“[I”是我们要调用的类的名称,英文,“array of int”。该类是一个“完全公民”Java类,它响应Object的所有方法。唯一的区别是new语法不同,它不支持Class的newInstance()方法。

(类[I],“[C”,等等,在JVM中是“预定义的” - 没有与之对应的.class文件.Java也会隐式创建,动态, “[MyJavaClass;”类,如果你的程序中有一个“MyJavaClass”数组。)

答案 3 :(得分:2)

  

为什么没有数组类?

数组类,每个元素类型一个,在程序中使用。 JLS和JVM Spec都清楚地说明了动态创建了一个数组的类对象。 JLS #10.8 'Class Objects for Arrays'JVM Spec #5.3.3 'Creating Array Classes'

  

如果java数组是Object,则不应扩展Object?

它确实扩展了java.lang.Object. JLS#10.8明确指出'每个数组类型的直接超类都是Object。'