营收|藏在Java数组的背后,你可能忽略的知识点( 三 )


arr.toString();

从上面的代码来看 , 在数组arr上 ,可以访问它的属性 , 也可以调用一些方法 。 这基本上可以认定 , Java中的数组也是对象 , 它具有java中其他对象的一些基本特点:封装了一些数据 , 可以访问属性 , 也可以调用方法 。 所以答案是肯定的 , 数组是对象 。
同时权威的Java Language Specification是这么说的:

In the Java programming languagearraysare 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.
这里我就不给大家翻译了 , 看不懂的有道翻译一下
补充:Java Language Specification里关于Array还有这么一段:
Every array has an associated Class object shared with all other arrays with the same component type. [ This
acts as if: the direct superclass of an array type is Object [ and
every array type implements the interfaces Cloneable and java. io. Serializable.
数组对象不是从某个类实例化来的 , 而是由JVM直接创建的 。 实际上也没有Array这个类(有是有 , 但只是java.lang.reflect包里的一个反射类) 。 但每个数组都对应一个Class对象 。 通过RTTI(Run-Time Type Information)可以直接检查Array的运行时类型 , 以及它的签名 , 它的基类 , 还有其他很多事 。 在C++中 , 数组虽然封装了数据 , 但数组名只是一个指针 , 指向数组中的首个元素 , 既没有属性 , 也没有方法可以调用 。 如下代码所示:
int main(){\tint a[
= {1 2 3 4;\tint* pa = a;\t//无法访问属性 , 也不能调用方法 。
\treturn 0;


所以C++中的数组不是对象 , 只是一个数据的集合 , 而不能当做对象来使用 。
Java中数组的类型Java是一种强类型的语言 。 既然是对象 ,那么就必须属于一个类型 , 比如根据Person类创建一个对象 , 这个对象的类型就是Person 。 那么数组的类型是什么呢?看下面的代码:
int[
arrI = {1 2 3 4;
System.out.println(arrI.getClass().getName());

String[
arrS = new String[2
;
System.out.println(arrS.getClass().getName());

String[
[
arrsS = new String[2
[3
;
System.out.println(arrsS.getClass().getName());

OutPut:
[I
[Ljava.lang.String;
[[Ljava.lang.String;

arrI的类型为[ IarrS的类型是[Ljava.lang.String;arrsS的类型是[[Ljava.lang.String;
所以 , 数组也是有类型的 。 只是这个类型显得比较奇怪 。 你可以说arrI的类型是int[
, 这也无可厚非 。 但是我们没有自己创建这个类 , 也没有在Java的标准库中找到这个类 。 也就是说不管是我们自己的代码 , 还是在JDK中 , 都没有如下定义:
public class int[
{\t
\t// ...

这只能有一个解释 , 那就是这个数组对象并不是从某个类实例化来的 , 而是由JVM直接创建的 , 同时这个直接创建的对象的父类就是Object , 所以可以调用Object中的所有方法 , 包括你用到的toString() 。
我们可以把数组类型和8种基本数据类型一样 ,当做Java的内建类型 , 这种类型的命名规则是这样的:
每一维度用一个[表示;开头两个[ , 就代表是二维数组 。
[后面是数组中元素的类型(包括基本数据类型和引用数据类型)


推荐阅读