一点累积----JAVA(2)----深拷贝,浅拷贝
来源:互联网 发布:巡检器如何下载数据 编辑:程序博客网 时间:2024/04/29 16:06
从哪里说起好呢,就从类和实例说起吧。
一个类,有成员变量,也有成员方法。
成员变量呢,是一个类的属性,表’是什么‘;
成员方法呢,是一个类的操作,表’做什么‘;
当类产出了一个实例,那个实例会在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()方法。
-------未完待续,有空补充点代码来说明--------------
- 一点累积----JAVA(2)----深拷贝,浅拷贝
- 深拷贝与浅拷贝(Java)
- java浅拷贝/深拷贝
- Java深拷贝浅拷贝
- java 深拷贝 浅拷贝
- Java深拷贝、浅拷贝
- Java 浅拷贝,深拷贝
- JAVA深拷贝浅拷贝
- Java 浅拷贝,深拷贝
- Java 深拷贝&浅拷贝
- Java深拷贝,浅拷贝
- java 深拷贝 浅拷贝
- java深拷贝浅拷贝
- Java的深拷贝和浅拷贝(2)
- java中的Clone(深拷贝,浅拷贝)
- java深拷贝和浅拷贝的区别(转载)
- 浅谈Java中的深拷贝和浅拷贝(转载)
- java中的Clone(深拷贝,浅拷贝)
- Ubuntu 14.04下使用Souce Insight的心得
- 关于表格和资源的技巧
- hdu5898 odd-even number 【数位DP】
- mysql丢失root密码的解决办法
- TextView及其shape
- 一点累积----JAVA(2)----深拷贝,浅拷贝
- 慎用英文变量名
- [leetcode3] Longest Substring Without Repeating Characters
- MySQL 运行环境的调优往往和Linux的内核调优一并完成。
- JZOJ 4786. 小a的强迫症
- VS开发环境下生成和调用dll出现的问题和解决方法-1
- graph
- 【设计模式】——组合模式
- linux文件处理命令