java中数组是对象吗?

最近在学习javaSE,其中印象最深的一句话便是“java中一切皆对象”;那么数组作为一种源自C语言的数据结构,在java中它也是对象吗?

提出问题

这个疑问主要源自对以下代码的疑问:

1
2
int[] arr = new int[3];
int size = arr.length; #得到数组长度

数组居然存在length这个属性,这很明显是对象才具有的特性。同时,数组也排除于8大基本数组类型之外,《java核心卷一》中对数组的定义是:一个数据容器,用来存储相同数据类型的数据集合。

相应解释

通过万能的Google,让我找到了一篇博文Java中数组的特性 ,恰到好处地诠释了这个问题,现总结如下:

  • 可以认定,java中的数组也是对象,它具有java中其他对象的一些基本特点:封装了一些数据,可以访问属性,也可以调用方法。所以,数组是对象。
  • 数组也是有类型的,例如int[]的类型是[IString []的类型是[[Ljava.lang.String等。但是我们没有自己创建这个类,也没有在Java的标准库中找到这个类,这只能有一个解释,那就是虚拟机自动创建了数组类型
  • 数组的顶层父类为Object,虽然存在Object[] = 引用数据类型[],这仅说明引用数据类型[]不继承自Object[],但是我可以允许你向上转型到Object[],这种特性是赋予你的一项特权。换一种思考方式,如果有两个类A和B,如果B继承(extends)了A,那么A[]类型的引用就可以指向B[]类型的对象。这种情况同样适用于多维数组,因为我们可以将n维数组看做一维数组中存放着(n-1)维数组

几个易错点

1
2
3
4
5
6
Object[] objArr = new int[3]; 
//错误因为int不是引用类型,Object不是int的父类,在这里自动装箱不起作用

Object[] objArr2 = {"aaa", 1, 2.5};
//这种情况下自动装箱可以工作,也就是说,Object数组中可以存放任何值,包括基本数据类型。
//这种特性主要是用于方法中多个参数的传递,方便方法内部访问或遍历数组中的各个元素