Java数组
数组变量 VS 数组对象
先看一例子:
int[] primitiveArray; //在栈中声明了一个引用变量,暂时还没指向任何对象 primitiveArray = new int[5]; //在堆中创建了一个数组对象,并将这个对象的引用复制给primitiveArray。这个数组对象中的每个数组元素的类型都是int类型,并且此时每个数组元素的值都为0。 //------------------分割线--------------- int[] primitiveArray2 = {2,3,4,5,6};//在栈中声明了一个名为primitiveArray2 的引用变量,同时在堆中创建了一个数组对象,primitiveArray2指向该对象。该数组对象的各个数组元素的值分别为2,3,4,5,6
数组变量(数组名、数组标识符):分配在栈空间,引用类型,比如上例中的primitiveArray和primitiveArray2,指向在堆中创建的一个真实对象(数组对象)。
数组对象:分配在堆空间,是一个对象,由一系列固定数量的数组元素(element)组成,数组元素的个数在创建数组对象时确定。每个数组元素可以存放基本数据类型的值,或者是指向其他类型的引用,这取决于数组类型。
对象数组 VS 基本类型数组
上述例子中创建的是基本基本类型的数组,也可以创建对象数组,比如:
Student[] objectArray; //在栈中声明了一个引用变量,暂时还没指向任何对象 objectArray= new Student[5]; //在堆中创建了一个数组对象,并将这个对象的引用赋值给objectArray。这个数组对象中的每个数组元素的类型都是Student类型(引用类型),并且此时每个数组元素的值都为null。 //------------------分割线--------------- Student[] objectArray2 = {new Student("zhangsan"),new Student("lisi"),new Student("wangwu")}; //在栈中声明了一个名为objectArray2的引用变量,同时在堆中创建了一个数组对象,objectArray2指向该对象。另外还在堆中创建了三个Student对象,该数组对象中的三个数组元素分别指向了这三个Student对象。
1.在使用上几乎是相同的;
2.唯一的区别就是对象数组保存的是引用,基本类型数组直接保存基本类型的值。
数组类型是一种引用类型
比如int是一个基本类型,但是int[]就是一种引用类型了。为什么这么说呢?
因为int a = 32;
变量a在栈空间,其存储的值为32;
而int[] b = {32};
变量b在栈空间,其存储的值是堆空间中的某个地址值了。既然b中存储的是地址,那么b就是引用类型的变量了。
什么是Java中的对象呢?
在java中如何创建一个对象呢?一般是new Class,这样就会在堆空间中创建出一个对象了。那么Java数组是一个对象吗?如果是对象,那它是哪个类的实例呢?
事实上,java中数组也是一个对象。因为java数组存在于堆空间,所以它就是一个对象,既然它是一个对象,那么它是哪个类的实例呢?
Student student = new Student(); System.out.println(student.getClass().getCanonicalName());//输出结果:Student Student[] objectArray = new Student[5]; System.out.println(objectArray.getClass().getCanonicalName());//输出结果:Student[] Student[][] objectArray2 = new Student[5][]; System.out.println(objectArray2.getClass().getCanonicalName());//输出结果:Student[][] Student[][][] objectArray3 = new Student[5][][]; System.out.println(objectArray3.getClass().getCanonicalName());//输出结果:Student[][][]
所以,数组类型可以看做一个特殊的Class类。
ClassName reference = new ClassName(); //普通类的使用方式,这里这是创建了一个对象,栈空间中的引用指向该对象,对象中的各个域进行了默认的初始化,可能还需要重新设置值。
Type[] refrence = new Type[length]; //使数组的方式,创建了一个数组对象,栈空间中的引用指向该对象,数组对象中的各个数组元素进行了默认的初始化,还需要重新给各个元素复制。
所以有的书中,将java中的对象分为:(类的)实例对象和数组对象。
参考资料
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html