无论使用的数组属于什么类型,数组标识符实际都是指向真实对象的一个句柄(浅复制)。那些对象本身是在内存“堆”里创建的。堆对象既可“隐式”创建(即默认产生),亦可“显式”创建(即明确指定,用一个new表达式)。
Weeble[] a; // 句柄a未初始化。此时,编译器会禁止我们对这个句柄作任何实际操作,除非已正确地初始化了它。
Weeble[] b = new Weeble[5]; // 数组b被初始化成指向由Weeble句柄构成的一个数组,但那个数组里实际并未放置任何Weeble对象。然而,我们仍然可以查询那个数组的大小,因为b指向的是一个合法对象。
//!System.out.println("a.length=" + a.length);//编译出错,因为数组里的句柄没有被初始化
System.out.println("b.length = " + b.length);//数组里的句柄默认初始化为null,b.length = 5
Weeble[] c = new Weeble[4];
for(int i = 0; i < c.length; i++)
c[i] = new Weeble();//对c初始化,数组c显示出我们首先创建一个数组对象,再将Weeble对象赋给那个数组的所有“空位”。
Weeble[] d = {//对d初始化,数组d揭示出“集合初始化”语法,全部工作在一条语句里完成。
new Weeble(), new Weeble(), new Weeble()
};
System.out.println("c.length = " + c.length);//c.length = 4
System.out.println("d.length = " + d.length);//d.length = 3
a = d;// a和d都指向内存堆内同样的数组对象。
System.out.println("a.length = " + a.length);//a.length = 3