深浅复制

来源:互联网 发布:数据库脱敏什么意思 编辑:程序博客网 时间: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
原创粉丝点击