无论使用哪种类型的数组,数组标示符其实只是一个引用,指向在堆中创建的一个真实对象,这个数组对象用以保存指向其他对象的引用。
可以作为数组初始化语法的一部分隐式的创建此对象,或者用new表达式显示的创建。
只读成员length是数组对象的一部分(事实上这是唯一一个可以访问的字段或方法),表示此数组对象可以存储多少元素。“[]”语法是访问数组对象的唯一方式。
下例总结了初始化数组的各种方式,也说明,对象数组和基本类型数组在使用上几乎是相同的;
唯一的区别就是对象数组保存的是引用,基本类型数组直接保存基本类型的值。
class BerylliumSphere { private static long counter; // 静态变量是属于类的,且唯一。 private final long id = counter++; // final变量值不可以被改变 public String toString() { return "Sphere " + id; } } public class Main { public static void main(String[] args) { /** * 对象数组 * */ BerylliumSphere[] a; // 创建一个对象数组引用 BerylliumSphere[] b = new BerylliumSphere[5]; // 创建一个数组对象引用,指向在堆中创建的一个真实对象 // 堆中真实数组所有的引用会自动初始化为null // b:[null, null, null, null, null] System.out.println("b:"+Arrays.toString(b)); BerylliumSphere[] c = new BerylliumSphere[4]; // for (int i = 0; i < c.length; i++) { if (c[i] == null) { // 能够测试是否为null引用 c[i] = new BerylliumSphere(); } } // 聚集初始化 BerylliumSphere[] d = {new BerylliumSphere(),new BerylliumSphere(),new BerylliumSphere()}; // 动态聚集初始化 a = new BerylliumSphere[]{new BerylliumSphere(),new BerylliumSphere(),new BerylliumSphere()}; /* a.length = 3 b.length = 5 c.length = 4 d.length = 3 a.length = 3 */ System.out.println("a.length = " + a.length); // length是数组的大小,而不是实际保存的元素个数 System.out.println("b.length = " + b.length); System.out.println("c.length = " + c.length); System.out.println("d.length = " + d.length); a = d; System.out.println("a.length = " + a.length); /** * 基本数据类型数组 * */ int[] e; // null 引用 int[] f = new int[5]; // 会自动初始化为0 System.out.println("f:"+Arrays.toString(f)); int[] g = new int[4]; for (int i = 0; i < g.length; i++) { g[i] = i*i; } int[] h = {11,47,91}; /*f: [0, 0, 0, 0, 0] f:[0, 0, 0, 0, 0] g:[0, 1, 4, 9] h:[11, 47, 91] e:[11, 47, 91] e:[1, 2] */ System.out.println("f:"+Arrays.toString(f)); System.out.println("g:"+Arrays.toString(g)); System.out.println("h:"+Arrays.toString(h)); e = h; System.out.println("e:"+Arrays.toString(e)); e = new int[]{1,2}; System.out.println("e:"+Arrays.toString(e)); }
数组b初始化为指向一个BerylliumSphere引用的数组,但其实并没有BerylliumSphere对象置入数组中。然而,仍可以询问数组的大小,因为b指向一个合法的对象。这样做有一个小缺点:你无法知道在此数组中确切的有多少元素,
因为length只表示数组能够容纳多少元素。也就是说,length是数组的大小,而不是实际保存的元素个数。
新生成一个数组对象时,其中所有的引用被自动初始化为null。同样,基本类型的数组如果是数值型的,就被自动初始化为0,字符型char,自动初始化为0,布尔型为false。
基本类型数组的工作方式和对象数组一样,不过基本类型的数组直接存储基本类型数据的值。
原文地址:http://blog.csdn.net/biezhihua/article/details/37939829