首页 > 代码库 > 数组之---数组是第一级对象!

数组之---数组是第一级对象!

数组是对象:

无论使用哪种类型的数组,数组标示符其实只是一个引用,指向在堆中创建的一个真实对象,这个数组对象用以保存指向其他对象的引用。

可以作为数组初始化语法的一部分隐式的创建此对象,或者用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。

结果:

基本类型数组的工作方式和对象数组一样,不过基本类型的数组直接存储基本类型数据的值。

数组之---数组是第一级对象!