Java中引用类型数组的初始化

Java 1575℃

引用类型数组的数组元素依然是引用类型的,因此数组元素里存储的还是引用,它指向另一块内存,这块内存里存储了该引用变量所引用的对象(包括数组和Java 对象)。

为了说明引用类型数组的运行过程,下面程序先定义一个 Person 类,然后定义了一个Person[]数组,并动态初始化了该 Person[]数组,再显式为数组的不同数组元素指定值。该程序代码如下。

public class Person  
{  
     //年龄  
     public int age;  
     //身高  
     public double height;  
     //定义一个 info 方法  
     public void info()  
     {  
          System.out.println("我的年龄是:" + age + ",我的身高是:" + height);  
     }  
}  
public class ReferenceArrayTest  
{  
     public static void main(String[] args)   
     {  
          //定义一个 students数组变量,其类型是 Person[]  
          Person[] students;  
          //执行动态初始化  
          students = new Person[2];  
          System.out.println("students所引用的数组的长度是:" + students.length);    //① 
          //创建一个 Person 实例,并将这个Person实例赋给 zhang 变量  
          Person zhang = new Person();  
          //为 zhang 所引用的Person对象的属性赋值  
          zhang.age = 15;  
          zhang.height = 158;  
          //创建一个 Person 实例,并将这个Person实例赋给 lee变量  
          Person lee = new Person();  
          //为 lee所引用的 Person 对象的属性赋值  
          lee.age = 16;  
          lee.height = 161;  
          //将 zhang 变量的值赋给第1个数组元素  
          students[0] = zhang;  
          //将 lee变量的值赋给第2个数组元素  
          students[1] = lee;  
          //下面两行代码的结果完全一样,因为lee和 students[1]指向的是同一个 Person实例  
          lee.info();  
          students[1].info();  
     }  
}

执行 Person[] students;代码时,这行代码仅仅在栈内存中定义了一个引用变量,也就是一个指针,这个指针并未指向任何有效的内存区。即在栈内存中定义了一个students 变量,它仅仅是一个空引用,并未指向任何有效的内存。直到执行本程序对 students 数组执行动态初始化。动态初始化由系统为数组元素分配默认的初始值 null,即每个数组元素的值都是 null。执行动态初始化后tudents数组的2个数组元素都是引用,而且这2个引用并未指向任何有效的内存,因此,每个数组元素的值都是 null。此时,程序可以通过 students 来访问它所引用的数组的属性,因此在①行代码通过 students 访问了该数组的长度,此时将输出2。students数组是引用类型的数组,因此,students[0]、students[1]两个数组元素相当于两个引用类型的变量。如果程序只是直接输出这两个引用类型的变量,那程序完全正常。但程序依然不能通过 students[0]、students[1]来调用属性或方法,因此它们还未指向任何有效的内存区,所以这两个连续的 Person变量(students数组的数组元素)还不能被使用。 接着,程序定义了 zhang 和 lee 两个引用变量,并让它们指向堆内存中的两个 Person 对象,此时的 zhang、lee 两个引用变量存储在 main 方法栈区中,而两个 Person 对象则存储在堆内存中。此时zhang和students[0]指向同一个内存区,而且它们都是引用类型变量,因此通过 zhang 和 students[0]来访问 Person 实例的属性和方法的效果完全一样。不论修改 students[0]所指向的 Person实例的属性,还是修改 zhang 变量所指向的 Person实例的属性,所修改的其实是同一个内存区,所以必然互相影响。同理,lee 和 students[1]也是引用到同一个Person对象,也有相同的效果。

前面已经提到:对于引用类型的数组而言,它的数组元素其实就是一个引用类型的变量,因此可以指向任何有效的内存–此处“有效”的意思指强类型的约束。比如对 Person[]类型的数组而言,它的每个数组元素都相当于 Person 类型的变量,因此它的数组元素只能指向Person对象。

转载请注明:零五宝典 » Java中引用类型数组的初始化