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

 

posted @ 2015-04-13 13:13  凝静志远  阅读(176)  评论(0编辑  收藏  举报