Java数据类型分为两大类:
基本数据类型与引用数据类型:
基本数据类型: 变量名指向具体的数值
逻辑类型:boolean (默认值:true);
文本类型:char (默认值:'\0',即\u0000);
整型:byte,short,int,long (默认值:0);
浮点型:float,double (默认值:0.0);
与基本数据类型相对的是,引用数据类型:变量名指向存储数据对象的内存地址
两者存储的结构如下:
引用数据类型在声明时,只分配引用空间,变量初始化时,分配数据空间。所以,在操作引用类型对象时,一定要对引用类型对象初始化。
在了解了引用数据类型之后,下面继续来探讨shallow copy与deep copy:
shallow copy:浅复制,如果被复制对象的成员变量是一个引用型变量(如是一个对象数组),则复制对象中将不包括该变量指向的对象。
deep copy:深复制,在浅复制的基础上,同时复制该变量所指向的对象。
为了对shallow copy和deep copy有一个深入的理解,可以这么理解:
假设一个数组a,抽象的存储结构如下所示:
那么浅复制可以这样来描述:
数组b只复制了a的位于引用空间的引用数值,并没有复制位于数据空间的对象数值。Object方法的clone()是shallow copy,而不是deep copy。
深复制可以这样来描述:
数组c同时复制了数组a的引用数值和对象数值,这个过程根据被复制对象a的类型创建对象c,并完成初始化,数组c的初始化值即数组a所指向对象的值,也就是c[0]=a[0],c[1]=a[1],c[2]=a[2]。数组a与数组c的引用地址是不相同的,但两者的数组元素的值是相等的。