----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
我在学习有关clone(克隆)的相关知识的时候,突然觉得堆内存还可以这样理解:
我先说说clone的一些知识吧:
我在书上看到了关于clone的一些知识点,书中提到:默认的克隆操作是浅拷贝,也就是说,clone只是对当前对象进行了拷贝,而没有拷贝对象中引用了的其他对象。对于浅克隆和深克隆有如下定义:
浅拷贝(浅克隆)具体含义是:被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝(深克隆)具体含义是:被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不再是原有的那些被引用的对象。换言之,深复制把复制的对象所引用的对象都复制了一遍。
那么这里就涉及到了一个名词:“对象中的内部对象”或者说“深层对象”
我突然觉得,在堆内存中创建了一个对象,那么,这个对象中包含着诸如姓名(String类型),日期(Date类型)等等此类的数据,那么拿“姓名”这个数据来说,是对String中“对象”的引用(有关String的一些理解会在后面的文章中浅谈的),那么,这么说来,创建的对象中存在name,而name又是引用的String中的对象,这样说来,可以理解成“对象中的对象”或者说堆内存中存在“深层对象”。
用下面的图例表示说明:
图中表明:在堆内存中创建的对象,又会分别将自身的各对应的类型归类(字符串类型归为String类型中)。就好像说这是一种“深层引用”一般,从String这样的类型“数组”中引用出来,并用新的类型(如图中的Employee类型)包装(或集合)起来一样。而像salary这种数值数据,是属于基本double这样的类型数据的,是和String有着不一样的类型,因此不会“深层引用”对应的类型了(当然也没有这种类型)。
我不太确定,这种理解是不是正确的,只是突发奇想的理解,其实,更多的是对内存分配的一点点兴趣而已,清楚了内存是如何分配的,有利于更好地理解程序是如何运行的,这对于学习java也是一种激励和乐趣吧。