数组是一个原始types还是一个对象(或者其他的东西)?

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

然而,事实上,一个数组具有类似于.equals().clone()这样的可调用length和方法的公共字段似乎表明(完全相反)。

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

作为一个说明,我试图在数组的.clone()方法上使用“Open Implementation”Eclipsefunction,希望能够查看在何处以及如何定义此方法(因为它表示int [ ]从Object取代它),但它实际上导致我的整个Eclipse冻结和崩溃…

每个数组types都有一个类,所以有一个int[]类,还有一个Foo[]类。 这些类是由JVM创build的。 你可以通过int[].classFoo[].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); } 

如果AB子types, A[]B[]子types,那么还有一个编译时子types规则。

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

数组types的直接超类是Object。

每个数组types都实现了Cloneablejava.io.Serializable接口。

而且 :

一个对象是一个类实例或一个数组。

所以数组不是实例,因此你不需要构造函数来创build它们。 而是使用arrays创buildexpression式 。

看下面的代码。 它编译: –

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

现在,在任何基元types上,你都不能调用在Object类(或者任何方法)中定义的方法( toString() )。所以,一个数组本质上是一个Object ..

好的,在这里你去:

从JLS第4.3节 : –

有四种引用types:类types(§8),接口types(§9),typesvariables(§4.4)和数组types(§10)。

而且, 第10节 : –

在Java编程语言中,数组是对象(第4.3.1节),是dynamic创build的,可以分配给Objecttypes的variables(第4.3.2节)。 类Object的所有方法都可以在数组上调用。

所以,从第一个引用, Array实际上不是一个类..它是另一种types..但是,本质上数组是对象,虽然不是一些Class ,但他们是Arraytypes..所以他们不是一些类的实例,并可能是array对象被定义为创build的方式..

如此简短,是<Type> []是一种Object 。 我理解它直接从Object扩展。 它有所有的Object方法, toString()hashCode() ,…加上一个特殊的暴露variables称为length 。 类java.util.Arrays是一个用于处理数组types的实用程序类。 当你添加一些乱七八糟的东西时,有点令人困惑: int[]不能从Object[]inheritance。 另外,与其他Objecttypes不同,没有数组types的构造函数。 他们尊重new关键字,但通常是分配的大小。 这有点奇怪,但只是其中一种语言的怪癖。

要回答这个问题,是的,他们是一个对象。

数组是一个容器对象,它拥有固定数量的单个types的值。

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

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

进一步深入,原始types可以用原始值存储在内存中,但对象是地址(参考)。 所以我们可以想象一个悖论,如果数组是原始types,我们如何将原始值存储在内存中? 我认为和String相同,但是String是最后一个对象,所以你可以用一个简单的方式构造一个对象,String s =“s”,就像一个基本types一样。