深浅复制
来源:互联网 发布:数据库脱敏什么意思 编辑:程序博客网 时间:2024/06/04 08:41
今天学习了面向对象,以java语言为例。研究了java的内存分配机制,以下是java语言编写的一个关于深浅复制:
复制语义:变量值独立——赋值会将操作符右侧的变量值复制给操作符左侧的变量。此后,这两个变量值是互相独立的,其中一个变量值的改变不会影响到另郊外一个变量值。
指针语义:同一(Java)——赋值会将操作符左侧变量的参考值改变成右侧变量的参考值( 这种方法有时也称为指针赋值(pointer assignment))。这样,两个变量不仅具有相同的数值,而且还指向存储数值的同一内存地址。
一般来说,除了简单类型int,short,char类型外,自创建的类实例化后,赋值都是指针语义,而一下介绍一个简单有效的可以复制语义的方法,即重写clone()方法。
package Study;public class Clonemain { public static void main(String[] args) {CloneB b1=new CloneB();//在堆栈中放一个b1 的指针,在堆当中开辟一个内存空间,b1//指向该内存b1.aInt=11;System.out.println("Before:"+b1.aInt);System.out.println("Before:"+b1.unca);CloneB b2=(CloneB) b1.clone();b2.aInt=22;b2.unca.doublevalue();System.out.println("After:"+b1.aInt);System.out.println("After:"+b1.unca);System.out.println("After:"+b2.aInt);System.out.println("After:"+b2.unca); }}class UnCloneA{ private int i; public UnCloneA(int ii){ i=ii; } public void doublevalue(){ i*=2; } public String toString(){ return Integer.toString(i); }}class CloneB implements Cloneable{ public int aInt; public UnCloneA unca=new UnCloneA(111); public Object clone(){ CloneB o=null; try{ o=(CloneB)super.clone(); }catch(Exception e){ e.printStackTrace(); } return o; }}
结果如下: Before:11
Before:111
After:11
After:222
After:22
After:222
说明复制之后的b1和b2指向不同的堆栈内存,但他们的UnCloneA指向同一个。
0 0
- 深浅复制
- 深浅复制
- 深浅复制
- 深浅复制
- 深浅复制
- 深浅复制
- 深浅复制
- 关于深浅复制
- java深浅拷贝(复制)
- java深浅拷贝(复制)
- c#深浅复制
- 原型模式深浅复制
- [Python] List & 深浅复制
- iOS深浅复制
- OC中的深浅复制
- oc笔记-深浅复制
- OC深浅复制问题
- java中的深浅复制
- 100层楼扔鸡蛋或者玻璃珠问题
- 数据结构之查找
- 实验二_任务三_理解Task
- Python——高级特性 切片
- 汉字与数字
- 深浅复制
- KMP算法JAVA实现
- 51nod-1090 3个数和为0
- TLS学习笔记
- 8天学通MongoDB——第八天 驱动实践
- JAVA温习课堂10
- JAVA foreach和普通for循环是否需要判断为null
- Android Handler 的内部构造
- HDU2035