深浅复制

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值