package interfacepage;
import java.sql.Date;
public class CloneTest {
/**
* @author:lixh
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CloneModel cloneModel = new CloneModel();
CloneModel cp = cloneModel.clone();
cp.setDate(Date.valueOf("2017-12-12"));
System.out.println(cp.getDate());
System.out.println(cloneModel.getDate());
if (cloneModel instanceof Cloneable) {
System.out.println("true");
}
}
/**
* 对象克隆
*
* 1.克隆方法默认的是浅拷贝
*
* 深拷贝与浅拷贝:
* 深拷贝不仅拷贝对象的实例域,而且会拷贝对象的子对象
*
* 浅拷贝的子对象是共享的,如果子对象类型是不可变的,或者对象值不变,是安全的,但是往往会变,例如:Date
*
* 2.实现clone()方法必须实现 Cloneable 接口,不然会抛异常CloneNotSupportedException
*
* 3.clone方法是Object的方法,而且是protected,实现clone方法时需要将方法声明为public,这样任何方法都能访问。
* 不限于子类中才可以调用clone方法,不同包也可以调用。
*
* 4.Cloneable接口是标记接口,里面不含任何方法,他的唯一作用是在类查询时使用instanceof
*/
}
package interfacepage;
import java.sql.Date;
public class CloneModel implements Cloneable{
private String name;
private Date date = new Date(System.currentTimeMillis());
private CloneModelSub sub;
public CloneModel() {
super();
}
public CloneModel(String name, Date date) {
super();
this.name = name;
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
protected CloneModel clone(){
CloneModel cModel = null;
try {
cModel = (CloneModel)super.clone();
cModel.date = (Date)date.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return cModel;
}
}