Java中数组的静态特性

Java 1248℃

Java 语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的。Java 程序中的数组必须经初始化才可使用。所谓初始化,就是为数组对象的元素分配内存空间,并为每个数组元素指定初始值。

数组的初始化有以下两种方式。

  • 静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。
  • 动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。

不管采用哪种方式初始化 Java 数组,一旦初始化完成,该数组的长度就不可改变,Java语言允许通过数组的length属性来访问数组的长度。示例如下。

public class ArrayTest {
    public static void main(String[] args) {
        //采用静态初始化方式初始化第1个数组
        String[] sites = new String[] {
                "零五博客", "05bk", "高清杂志网", "gqzzw"
            };

        //采用静态初始化的简化形式初始化第2个数组
        String[] names = { "孙悟空", "猪八戒", "白骨精" };

        //采用动态初始化的语法初始化第3个数组
        String[] strArr = new String[5];
        //访问 3个数组的长度
        System.out.println("第 1个数组的长度:" + sites.length);
        System.out.println("第 2个数组的长度:" + names.length);
        System.out.println("第 3个数组的长度:" + strArr.length);
    }
}

上面程序中的粗体字代码声明并初始化了3个数组。这 3个数组的长度将会始终不变,程序输出3个数组的长度依次为4、3、5。

对于静态初始化方式而言,程序员无需指定数组长度,指定该数组的数组元素,由系统来决定该数组的长度即可。例如 sites 数组,为它指定了 4 个数组元素,那它的长度就是4;对于names数组,为它指定了3个元素,那它的长度就是3。

执行动态初始化时,程序员只需指定数组的长度,即为每个数组元素指定所需的内存空间,系统将负责为这些数组元素分配初始值。指定初始值时,系统将按如下规则分配初始值。

  • 数组元素的类型是基本类型中的整数类型(byte、short、int 和 long),则数组元素的值是0。
  • 数组元素的类型是基本类型中的浮点类型(float、double),则数组元素的值是 0.0。
  • 数组元素的类型是基本类型中的字符类型(char),则数组元素的值是’\u0000′。
  • 数组元素的类型是基本类型中的布尔类型(boolean),则数组元素的值是false。
  • 数组元素的类型是引用类型(类、接口和数组),则数组元素的值是null。

不要同时使用静态初始化和动态初始化。也就是说,不要在进行数组初始化时,既指定数组的长度,也为每个数组元素分配初始值。

Java 的数组是静态的,一旦为数组初始化完成,数组元素的内存空间分配即结束,程序只能改变数组元素的值,而无法改变数组的长度。需要指出的是,Java 的数组变量是一种引用类型的变量,数组变量并不是数组本身,它只是指向堆内存中的数组对象。因此,可以改变一个数组变量所引用的数组,这样可以造成数组长度可变的假象。假设,在上面程序后面增加如下几行。

//让 sites 数组变量、strArr 数组变量指向 names 所引用的数组
sites = names;
strArr = names;
System.out.println("--------------");
System.out.println("sites数组的长度:" + sites.length);
System.out.println("strArr数组的长度:" + strArr.length);
//改变 sites数组变量所引用的数组的第2个元素值。
sites[1] = "唐僧";
System.out.println("names数组的第 2个元素是:" + sites[1]);

上面程序中将让sites 数组变量、strArr 数组变量都指向names 数组变量所引用的数组,这样做的结果就是sites、strArr、names 这3个变量引用同一个数组对象。此时,当访问 sites 数组长度、strArr 数组的长度时,将看到输出 3。这很容易造成一个假象:sites 数组的长度从 4 变成了3。实际上,数组对象本身的长度并没有发生改变,变的是sites 数组变量。当执行了sites = names;语句之后,sites 数组将改变堆内存中的数组对象,而原来sites 变量所引用的数组对象长度依然是 4。当然原来的数组对象不再有任何引用变量引用,因此它将会变成垃圾,等着垃圾回收机制来回收。此时,程序使用sites、names 和 strArr 这 3 个变量时,将会访问同一个数组对象,因此把 sites 数组的第 2个元素赋值为“唐僧”时,names数组的第2个元素的值也会随之改变。

与 Java 这种静态语言不同的是,JavaScript 这种动态语言的数组长度是可以动态改变的,示例如下。

<script type="text/javascript">
    var arr = [];
    document.writeln("arr的长度是:" + arr.length + "<br/>");
    //为 arr数组的两个数组元素赋值
    arr[2] = 6;
    arr[4] = "孙悟空";
    //再次访问 arr数组的长度
    document.writeln("arr的长度是:" + arr.length + "<br/>");
</script>

上面是一个简单的JavaScript 程序。它先定义了一个名为arr 的空数组,因为它不包含任何数组元素,所以它的长度是0。接着,为arr 数组的第3个、第5个元素赋值,该数组的长度也自动变为5。这就是JavaScript 里动态数组和Java 里静态数组的区别。

转载请注明:零五宝典 » Java中数组的静态特性