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

2022-09-01 00:34:15

下面是 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

这是怎么回事?

编辑:

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

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

如果我写出相同的类,但改变了方法...这应该在我的应用程序中工作,对吗?java.lang.reflect.ArraytoString()


答案 1

来自 JLS

每个数组都有一个关联的 Class 对象,该对象与具有相同组件类型的所有其他数组共享。[This] 的行为就像:数组类型的直接超类是 Object [并且] 每个数组类型都实现了可克隆和 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();

答案 2

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

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

顺便说一句,该字段不是从 继承的。、等方法被继承。lengthObject.getClass().toString()