6-2 对象克隆
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; } }