数组的概念
数组指的是有限个类型相同的元素序列。数组在内存中占据了连续的空间。
在C中数组指向了数组内部的首元素,相当于一个指针。但是在JAVA中,数组内部拥有着许多的方法和属性,那么这种引用数据类型单纯也只是一个“指针”吗?(JAVA中并没有指针的概念,这样说只是为了方便读者理解)
//创建数组
int [] arr=new int[10];
//创建对象
class obj=new class();
- 都需要规定引用变量的类型。arr内部只能传入整数型,obj传入的只能是class类型
- 都需要new在内存中申请空间
- 都需要传入参数。数组中[]间传入数值,对象实例化过程中根据构造器在()传入参数。
这样表面的对比,让人觉得似乎数组可能本身就是一个类,并且new int[]的过程其实就是一个实例化对象的过程,不同的可能是类的构造器使用的是(),而数组使用的是[]。
再进一步
new Object[0].getClass().getSuperClass()
得到的是Object.class,oh my god!!!,他的父类居然是Object,数组这样看不就是个类吗?居然可以继承!!!
但是数组却没有.class文件,我们知道类在被编译以后会出现对应的class文件,比如String类就拥有.class文件。但是我们根据数组的父类是Object,我们已经可以十分肯定认为java肯定是将数组作为一个类来处理。
为了避免读者怀疑我在无中生有,暗度陈仓…
再用一个instanceof判断JAVA处理的数组是不是处理类一样有那味(如果同学们没有接触过instanof,你只需要知道它可以判断一个对象是不是一个类或者它的子类的实例化对象)。
int [] a=new int[10];
if(a instanceof int[]) {
System.out.println("a is int[]的子类");
}
if内部的语句成功执行,说明a指向的对象确实是属于int[]的,这样看来java确实将数组作为了一个类来处理。
什么?还不信?
int[] a = new int[10];
System.out.println(a.getClass().getName());
果然返回了类名,打印出来[I。
并且不同的数组返回的类名不一样,如下:
short[] [S
byte[] [B
boolean[] [Z
int[] [I
int[][] [[I
double[] [D
double[][] [[D
观察类名的结果 返回[ ,并且将数据类型的首先大写,[的个数由数组维数决定。
数组是如何实例化的
我们知道类在对象实例化的过程中需要使用构造器,既然数组是按照类来处理的,那么肯定也需要构造器啦。
Class arrclass = arr[].class;
System.out.println(arrclass.getConstructors().length);
打印的结果为0,说明了数组内部确实是没有构造器属性或者方法。数组对象确实像不是某个类进行实例化得来,而是由JVM直接创建的,这个创建对象的直接父类是Object,每个数组都会有个Class对象,所以数组就可以表现出我上述的性质,作为一个对象。