- 题外话
熟悉jav开发的都知道,java是纯面向对象的编程语言,和c++有很大的不同,其中取消指针类型就是一个很大的不同之处。由于在java语言中取消了指针这个概念,但是这并不妨碍java对指针概念的应用(表面上我们假装不用指针,实际上我们都知道用指针真香哎!)。在java中,实质撒谎嗯每个new语句返回的都是一个指针的引用,只不过在大部分情况下我们都不需要关心如何去操作这个指针而已。
- 按值传递和按引用传递
在java中处理基本数据类型时,都是采用按值传递(传递的是输入参数的复制),除此之外的其他类ixng都是按引用传递(传递的对是对象的一个引用)。同时在方法中使用"="赋值时也采用了引用传递。
在实际的开发中,经常会遇到从某个已有的对象A中创建出另外一个具有相同状态的对象B,并且对B的修改不会影响到A的状态。这个时候简单的赋值操作显然无法达到目的,java中地宫了clone()方法来满足需求。
- clone()方法介绍
Java中所有类默认都是继承自Object类,而Object类中提供了一个clone()方法,这个方法的作用是返回一个Object对象的复制,这个复制函数返回的是一个新的对象而不是一个引用,因此,对新对象的修改不会影响到原来对象的值。
clone()方法的使用步骤:
- 实现clone()方法首先需要继承Cloneable接口。Cloneable接口实质上是一个标识接口(只有接口类,内部没有接口方法,不需要重新实现它的方法)。
- 在类中重写Object类中的clone方法。
- 在clone方法中调用super.clone()方法。无论clone类的继承结构是什么,super.clone()都会直接或间接调用java.lang.Object类中的clone()方法。
- 把浅复制的引用指向原型对象新的克隆体。
代码示例:
class ShallowCloneMain implements Cloneable {
private int a = 0;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void changeInt(){
this.a = 1;
}
/*
* 浅复制
* */
public Object clone(){
Object o = null;
try {
o = (ShallowCloneMain)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
}
对于类中只有一些基本的数据类型时,采用上述方法就可以实现clone了,但是当类中包含了一些对象(也就是说要clone的对象中包含有二级引用)时,这个时候就需要进行深复制了。深复制的代码示例如下:
class DeepCloneMain implements Cloneable {
private int a = 0;
private Date date = new Date(); //date是一个对象类型的引用
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public void changeInt(){
this.a = 1;
}
public void changeDate(Date dates){
this.date.setMonth(4);
}
/*
* 深复制
* */
public Object clone(){
Object o = null;
try {
o = (DeepCloneMain)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
//深复制对象中的引用类型
o.date = (DeepCloneMain)this.getDate().clone();
return o;
}
- Note:
浅复制(Shallow Clone):被复制对象的所有变量都包含有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象(也就是说被clone对象中的二级引用仍然指向原来的对象)。
深复制(Deep Clone):被复制对喜爱嗯的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对喜爱嗯的变量将指向被复制新的对象(也就是指被clone对象的二级应用也指向了新的值)。