数组是基元类型还是对象(或完全是其他对象)?

2022-08-31 16:53:20

这个问题基本上是不言自明的。我无法找到数组的API(除了这个数组,但这只是定义了一堆用于处理实际数组的静态帮助器函数)。如果没有它的类,这似乎表明数组不能是 .Object

但是,数组具有公共字段(如公共字段和可以调用的方法)的事实似乎(非常强烈地)暗示了完全相反的情况。length.equals().clone()

对于基元数组的奇怪表示和行为,解释是什么?

请注意,我刚才试图在数组的方法上使用“开放实现”Eclipse功能,希望我能够查看此方法的定义位置和方式(因为它说int[]从Object中覆盖了它),但它实际上导致我的整个Eclipse冻结并崩溃.......clone()


答案 1

每个数组类型都有一个类,因此 有一个类 ,有一个类 用于 。这些类由 JVM 创建。您可以通过 、 访问它们。这些类的直接超类是int[]Foo[]int[].classFoo[].classObject.class

public static void main(String[] args)
{
    test(int[].class);
    test(String[].class);
}

static void test(Class clazz)
{
    System.out.println(clazz.getName());
    System.out.println(clazz.getSuperclass());
    for(Class face : clazz.getInterfaces())
        System.out.println(face);
}

还有一个编译时子类型规则,如果 是 的子类型,则为 的子类型。ABA[]B[]


答案 2

Java语言规范应该给你一个想法:

数组类型的直接超类是 Object。

每个数组类型都实现接口和 。Cloneablejava.io.Serializable

此外

对象是类实例或数组。

因此,数组不是实例,因此您不需要构造函数来创建它们。而是使用数组创建表达式