最近在学习javaSE,其中印象最深的一句话便是“java中一切皆对象”;那么数组作为一种源自C语言的数据结构,在java中它也是对象吗?
提出问题
这个疑问主要源自对以下代码的疑问:
1 | int[] arr = new int[3]; |
数组居然存在length这个属性,这很明显是对象才具有的特性。同时,数组也排除于8大基本数组类型之外,《java核心卷一》中对数组的定义是:一个数据容器,用来存储相同数据类型的数据集合。
相应解释
通过万能的Google,让我找到了一篇博文Java中数组的特性 ,恰到好处地诠释了这个问题,现总结如下:
- 可以认定,java中的数组也是对象,它具有java中其他对象的一些基本特点:封装了一些数据,可以访问属性,也可以调用方法。所以,数组是对象。
- 数组也是有类型的,例如
int[]
的类型是[I
,String []
的类型是[[Ljava.lang.String
等。但是我们没有自己创建这个类,也没有在Java的标准库中找到这个类,这只能有一个解释,那就是虚拟机自动创建了数组类型 - 数组的顶层父类为
Object
,虽然存在Object[] = 引用数据类型[]
,这仅说明引用数据类型[]
不继承自Object[],但是我可以允许你向上转型到Object[],这种特性是赋予你的一项特权。换一种思考方式,如果有两个类A和B,如果B继承(extends)了A,那么A[]类型的引用就可以指向B[]类型的对象。这种情况同样适用于多维数组,因为我们可以将n维数组看做一维数组中存放着(n-1)维数组
几个易错点
1 | Object[] objArr = new int[3]; |