java中的clone是什么?clone函数如何使用?

什么是clone?

顾名思义,object对象的clone函数是实现对象中各个对象的复制。

我们在实际应用过程中,有一个A对象,在某时刻已经对A对象的属性赋了值,这时候我们想创建一个和当前时刻一摸一样的B对象,并且在后面对B对象的属性进行赋值的时候都不会影响到A对象的属性,这种情况,我们可以看出,A和B是两个独立的不同的对象,只是B的初始值由A而来,在java语言中,用简单的赋值方法是不能实现这种需求的,而用clone函数是最简单、最直接、最高效的方式。

new和clone的区别

他们都是创建了一个新的对象,并且都为之分配内存。

而程序执行在执行new函数时,首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。

调用clone函数时,分配的内存和原来的那个对象(即调用clone方法的对象)是一样的,接着使用原对象中对应的各个域,赋值到新对象的域,赋值完成后,clone方法会创建并返回一个新的相同的对象,再把这个新对象的引用发布到外部。

如何使用clone

我们来看下面这段代码:

User u = new User(8, "张三");
User p1 = u;
System.out.println(u);
System.out.println(u1);

这两句控制行输出的结果是一样的还是不一样的呢?我们来看一看。

答案是这两个对象是一样的,并没有出现新创建对象的情况。因为java中对对象的赋值,只是创建了一个对这个对象的引用,他们指向了相同的地址,相同的对象,这叫做引用的复制。我们用一张图来表示:

接着我们再来看下面这段代码:

public static void main(String[] args) {
User u = new User(8, "张三");
User u1 = (User)u.clone();
System.out.println(u);
System.out.println(u1);
}

我们再看看这两段控制行输出的结果是不是一样的呢?

答案是变得不一样了!这两个对象的地址不一样,说明这两个对象也不一样,clone出来的是一个新的对象,而不是地址引用这么简单。同样的,我们用一张图来表示:

那么java对象的clone就先讲到这里。

发表评论

邮箱地址不会被公开。 必填项已用*标注