从哪里说起好呢,就从类和实例说起吧。
一个类,有成员变量,也有成员方法。
成员变量呢,是一个类的属性,表’是什么‘;
成员方法呢,是一个类的操作,表’做什么‘;
当类产出了一个实例,那个实例会在heap区有自己的一个内存空间,存储以上,而那个实例的名字呢,会存储在stack区中,指向对应heap中的实例。
类产出实例的方法呢~也是多种多样的,有构造法,也有拷贝法。
构造法就是按照类的属性一个一个填充。
拷贝法就是照着一个构造好的实例来产出另一个实例。此时,stack区就有两个实例名字,那么他们指向的heap区是不是一样呢~
这个就要看看这个类是不是存在 ’引用类型‘ 的成员变量了。
如果class MyObject ,不存在 ’引用类型‘ 的成员变量
class MyObject{
private int count;
public MyObject(int count){
this.count = count;
}
public MyObject( MyObeject myobj){
this.count = myobj.count;
}
}
对于 MyObject obj1 = new MyObject(5); MyObject obj2 = new MyObject (obj1); 来说 obj1 和 obj2都存储与stack中,而且分别指向不同的heap
但是对于 存在 ’引用类型‘ 的成员变量那就不一样了,因为类的拷贝法构造,只传递了引用,并没有把引用也复制过去,所以对来说 obj1 和 obj2都存储与stack中,而且分别指向相同的heap
以上这种只复制成员变量的非引用类型,传递成员变量的引用类型的拷贝,称为浅拷贝;
相对的,把对象内部的所有成员变量,包括引用类型和非引用类型均复制一遍,创建一个新的实例的拷贝,称为深拷贝。
深拷贝的方法呢,Object 中有一个 clone()方法,声明如下
protected native Object clone() throw CloneNotSupportedException;
使用的话需要两个步骤:
1.在需要拷贝的类,和类中成员变量引用的类,都需要实现Cloneable接口。
2.需要覆盖原来Object的clone()方法。
-------未完待续,有空补充点代码来说明--------------