58

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

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

原始数组的奇怪表示和行为的解释是什么?

作为说明,我刚才尝试在.clone()数组的方法上使用“Open Implementation” Eclipse 功能,希望我能够查看该方法的定义位置和方式(因为它说 int[] overrode it from对象),但它实际上导致我的整个 Eclipse 冻结并崩溃......

4

7 回答 7

68

每种数组类型都有一个类,所以有一个类 for int[],还有一个类 for Foo[]。这些类是由 JVM 创建的。您可以通过int[].class,访问它们Foo[].class。这些类的直接超类是Object.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);
}

还有一个编译时子类型规则,如果A是 的子类型BA[]就是 的子类型B[]

于 2012-10-09T20:15:13.070 回答
28

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

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

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

此外

对象是类实例或数组。

所以数组不是实例,因此您不需要构造函数来创建它们。相反,您使用Array Creation Expressions

于 2012-10-09T19:28:05.977 回答
16

请参阅下面的代码。它编译:

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

现在,在任何原始类型上,您都不能调用toString()在 Object 类中定义的 method()(或者,任何相关的方法)......所以,数组本质上是一个Object.

好的,给你:

JLS 第 4.3 节

有四种引用类型:类类型(第 8 节)、接口类型(第 9 节)、类型变量(第 4.4 节)和数组类型(第 10 节)。

并且,第 10 节

In the Java programming language, arrays are objects (§4.3.1), are dynamically created, and may be assigned to variables of type Object (§4.3.2). All methods of class Object may be invoked on an array.

So, from the first quote, Array is not actually a class... It is another type. But, essentially arrays are objects, though not of some Class, but they are of Array type. So they are not instances of some class, and may be objects of array are defined to be created that way...

于 2012-10-09T19:15:59.973 回答
7

如此简短,是的 <Type>[] 是Object. Object据我了解,它直接延伸。上面有所有的 Object 方法toString(),, hashCode(), ... 加上一个特殊的暴露变量,称为length. 该类java.util.Arrays是用于处理数组类型的实用程序类。当您添加诸如: int[]不继承自Object[]. 此外,与其他Object类型不同,数组类型没有构造函数。他们尊重new关键字,但这通常是为了分配大小。这有点奇怪,但只是这些语言怪癖之一。

不过,要回答这个问题,是的,它们是一个对象。

于 2012-10-09T19:15:57.220 回答
3

数组是一个容器对象,它包含固定数量的单一类型的值。

请参阅http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

于 2012-10-09T19:10:37.047 回答
0

只有我们知道的 Java 中的这几种原始类型。基本上,我们仍然有几个步骤来创建一个数组,例如声明、构造或初始化(如果需要),这意味着数组确实是一个对象。

更深入一点,原始类型可以与原始值一起存储在内存中,但对象是地址(引用)。所以我们可以想象一个悖论,如果数组是原始类型,我们如何将原始值存储在内存中?我认为和String一样,但是String是一个final对象,这样你就可以用一种简单的方式构造一个对象,String s = "s",就像一个原始类型。

于 2012-10-09T19:49:01.427 回答
-1

它是一个对象

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

于 2012-10-09T19:10:25.597 回答