今天学习了面向对象,以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指向同一个。