克隆是创建对象的方式之一,还有new,反序列化,反射都可以创建对象
克隆的使用条件
已经有了一个对象,对象中也已经有了一些数据。程序需要产生很多类似的对象出来,此时就可以使用克隆
克隆的使用
需要类实现Cloneable接口,并重写clone()方法
public class StudentBean implements Serializable ,Cloneable{/****/private static final long serialVersionUID = 8120141337579471011L;private String name;private int age;private String telphone;private String address;private int gender;private Date studyTime;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getTelphone() {return telphone;}public void setTelphone(String telphone) {this.telphone = telphone;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public int getGender() {return gender;}public void setGender(int gender) {this.gender = gender;}public Date getStudyTime() {return studyTime;}public void setStudyTime(Date studyTime) {this.studyTime = studyTime;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic Object clone() throws CloneNotSupportedException {// TODO Auto-generated method stubreturn super.clone();}@Overridepublic String toString() {return "StudentBean [name=" + name + ", age=" + age + ", telphone=" + telphone + ", address=" + address+ ", gender=" + gender + ", studyTime=" + studyTime + "]";}}
public class MainEnter {/*** 主函数* @param args*/public static void main(String[] args) {// TODO Auto-generated method stubStudentBean studentBean = new StudentBean();studentBean.setName("张三");studentBean.setAddress("孵化园5号楼");studentBean.setAge(18);studentBean.setStudyTime(new Date());studentBean.setGender(1);studentBean.setTelphone("13398195689");System.out.println(studentBean);//使用克隆模式产生对象try {StudentBean studentBean01 = (StudentBean) studentBean.clone();studentBean01.setName("李四");studentBean01.setTelphone("13398567845");System.out.println(studentBean01);//克隆模式产生出来的对象,不是源对象System.out.println(studentBean == studentBean01);//StudentBean studentBean02 = (StudentBean) studentBean.clone();studentBean02.setName("王五");System.out.println(studentBean02);} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
浅克隆和深克隆
浅克隆
对象在克隆时,并没有克隆其相关联的对象
例:一个对象含有一个引用类型的属性,克隆后这个属性的地址没有发生改变
造成浅克隆的原因:
深克隆
解决的方法:
关联对象实现Cloneable接口,并重写clone()方法
对象类重写clone()对象,并定义相关的条件
@Overridepublic Object clone() throws CloneNotSupportedException {// TODO Auto-generated method stubGirlBean girlBean = (GirlBean) this.girlBean.clone();StudentBean stu = (StudentBean) super.clone();stu.setGirlBean(girlBean);return stu;}
总结
克隆:以某一个对象为原型,去产生出与它相似的多个对象
克隆:是属于面向对象设计的一种设计模式: 克隆模式(原型模式)
