Java里数组类型也和其它编程语言一样,存储有序的元素,而数据元素可以是primitive基本类型的变量,也可是是存放指向对象的引用变量
对于基本类型的变量应该就和正常比较简单的数组相类比,十分简易
比如声明一个int[]类型数组变量
int [] numbers;
创建一个长度为3的数组对象,赋给numbers,其实是引用
numbers = new int[3];
这里其实如果很清楚数组的元素,大小的话,可以直接赋值,而不需要用new来创建
到了这一步需要注意的是,数组的每个元素本身都是primitive基本类型这里是int类型,而数组本身是一个对象,numbers是一个对象引用,指向了三个连续int类型变量,因为是基本类型,因此如果放进该类型变量中的值都可以当做是此类型数组的元素,此时int类型的数组中,每个元素都是一个int,这种情况下和常规的理解基本一致,没啥异议
假如这里的数组里类型并非基本类型,而是对象数组,那么这里数组元素并不是对象本身,而是对象的引用
声明一个Person[]类型数组变量p
Person[] p;
创建长度为3的Person数组对象,赋值给p
p = new Person[3];
注意的一点,p只是指向整个数组的引用,而数组里每个元素都不是primitive类型变量,而是指向对象的引用变量,因此缺少了实实在在的Person对象,丝毫无用,需要创建新的Person对象,赋给每一个数组的元素,也就是让引用来指向它们
p[0] = new Person(); p[1] = new Person(); p[2] = new Person();
这样每个元素都对应引用了相关的对象,就可以来操作对象的方法了
整个过程可以来一个完整简单的
class Person { String email; void hello(){ System.out.println("Hello," + email); } } public class Main { public static void main(String[] args) { Person[] p; p = new Person[3]; p[0] = new Person(); p[1] = new Person(); p[2] = new Person(); p[0].email = "lihui@maoxiaomeng.com"; p[1].email = "lilei@maoxiaomeng.com"; p[2].email = "lihua@maoxiaomeng.com"; int i = 0; while (i < 3) { p[i].hello(); ++i; } int [] numbers; numbers = new int[3]; int j = 0; while (j < 3) { numbers[j] = j; ++j; } for(int x:numbers){ System.out.println("a" + x + ": " + numbers[x]); } } }
上半部分是对象数组,p引用了数组对象,每个元素是对象引用,分别引用了Person对象,分别通过引用赋值了email属性,最后调用hello方法输出结果
下半部分是int数组,numbers引用了int数组对象,而由于是基本类型,每个元素的值也就是直接赋值的int值,最后输出int数组的值
我觉得有些地方可以对比C语言里的指向结构体的指针协助理解