32.Java引用类型
Java语言中除8种基本数据类型以外的数据类型称为引用类型,或复合数据类型。
引用类型的数据都是以某个类的对象的形式存在的,我们在程序中声明的引用类型变量只是为该对象起的一个名字,或者说是对该对象的引用,变量的值是对象在内存空间中的存储地址而不是对象本身,这就是称之为引用类型的原因。
引用类型数据以对象的形式存在,其构造和初始化以及赋值的机制都是与基本数据类型的变量有所不同。
声明基本数据类型的变量时,系统同时为该变量分配存储器空间,此空间中将直接保存基本数据类型的值。
而声明引用类型变量时,系统只为该变量分配引用空间,并未创建一个具体的对象或者说并没有为对象分配存储器空间,将来在创建一个该引用类型的对象后,再使变量和对象建立对应关系。可以这样来看,我们声明的引用类型变量,就是一把钥匙(引用),而将来创建的,并与变量建立对应关系的对象,才是我们真正要操作的数据,相当于一个放满我们需要数据和操作的仓库。
这里简单来说说我们声明一个引用类型变量,以及与之对应的对象创建的过程。
以前面的Student类为例。
Student s1;
s1 = new Student("Lisa","Male",1,18);
System.out.println("学生s1姓名: " + s1.getName());
Student s2;
s2 = s1;
s1.setName("Sophie");
System.out.println("学生s2姓名:"+s2.getName());
这个代码段的作用是建立并初始化了两个Student引用类型数据,我们以对象s1为例讲解引用类型数据的初始化过程(对象的初始化过程):
1. 执行语句“Student s1;”时,系统为引用类型变量s1分配引用空间(定长32位),此时只是定义了变量s1,还未进行初始化等工作,因此还不能调用Student类中定义的方法
2. 执行语句“s1 = new Student(”Lisa“,”Male“,1,18);”,
先调用构造方法创建一个Student类的对象----为新对象分配内存空间用来存储该对象所有属性(name,sex,grade,age)的值,并对各属性的值进行默认的初始化。
注意,在这个程序中,因为name和sex的类型是String类型,也是属于引用类型,所以它们的默认初始值也为null,
3. 接下来执行Student类的构造方法,继续此新对象的初始化工作,构造方法中又要求对新构造的对象的成员变量进行赋值,因此,此时name、sex、grade、age的值变成了“Lisa”、“Male”、1、18,
4. 至此,一个Student类的新的对象的构造和初始化构成已完成。最后再执行“s1 = new Student("Lisa","Male",1,18);”中的“=”号赋值操作,将新创建对象存储空间的首地址赋值给Student类型变量s1
于是引用类型变量s1和一个具体的对象间建立了联系,我们称s1是对该对象的一个引用。
最后,我们总结一下对象的构造及初始化程序:
1. 分配内存空间;
2. 进行属性的默认初始化;
3. (进行属性的显式初始化;)
4. 执行构造方法;
5. 为引用型变量赋值。
下一篇: 30.Java简单数据类型