数组是一个原始types还是一个对象(或者其他的东西)?
这个问题基本上是不言自明的。 我一直无法find一个数组的API(除了这个数组 ,但这只是定义了一堆用于处理实际数组的静态帮助函数)。 如果没有它的类,这似乎表明一个数组不能是一个Object
。
然而,事实上,一个数组具有类似于.equals()
和.clone()
这样的可调用length
和方法的公共字段似乎表明(完全相反)。
原始数组的奇怪表示和行为的解释是什么?
作为一个说明,我试图在数组的.clone()
方法上使用“Open Implementation”Eclipsefunction,希望能够查看在何处以及如何定义此方法(因为它表示int [ ]从Object取代它),但它实际上导致我的整个Eclipse冻结和崩溃…
每个数组types都有一个类,所以有一个int[]
类,还有一个Foo[]
类。 这些类是由JVM创build的。 你可以通过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
是B
子types, A[]
是B[]
子types,那么还有一个编译时子types规则。
Java语言规范应该给你一个想法:
数组types的直接超类是Object。
每个数组types都实现了
Cloneable
和java.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
,但他们是Array
types..所以他们不是一些类的实例,并可能是array
对象被定义为创build的方式..
如此简短,是<Type> []是一种Object
。 我理解它直接从Object
扩展。 它有所有的Object方法, toString()
, hashCode()
,…加上一个特殊的暴露variables称为length
。 类java.util.Arrays
是一个用于处理数组types的实用程序类。 当你添加一些乱七八糟的东西时,有点令人困惑: int[]
不能从Object[]
inheritance。 另外,与其他Object
types不同,没有数组types的构造函数。 他们尊重new
关键字,但通常是分配的大小。 这有点奇怪,但只是其中一种语言的怪癖。
要回答这个问题,是的,他们是一个对象。
数组是一个容器对象,它拥有固定数量的单个types的值。
请参阅http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
我们所知道的只有Java中的几种基本types。 基本上,我们仍然有几个步骤来创build一个数组,如声明, 构造或初始化(如果需要),这意味着数组确实是一个对象。
进一步深入,原始types可以用原始值存储在内存中,但对象是地址(参考)。 所以我们可以想象一个悖论,如果数组是原始types,我们如何将原始值存储在内存中? 我认为和String相同,但是String是最后一个对象,所以你可以用一个简单的方式构造一个对象,String s =“s”,就像一个基本types一样。