一点累积----JAVA(2)----深拷贝,浅拷贝

从哪里说起好呢,就从类和实例说起吧。

一个类,有成员变量,也有成员方法。

成员变量呢,是一个类的属性,表’是什么‘;

成员方法呢,是一个类的操作,表’做什么‘;

当类产出了一个实例,那个实例会在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()方法。





-------未完待续,有空补充点代码来说明--------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值