克隆是创建对象的方式之一,还有new,反序列化,反射都可以创建对象

克隆的使用条件


已经有了一个对象,对象中也已经有了一些数据。程序需要产生很多类似的对象出来,此时就可以使用克隆

克隆的使用


需要类实现Cloneable接口,并重写clone()方法

  1. public class StudentBean implements Serializable ,Cloneable{
  2. /**
  3. *
  4. */
  5. private static final long serialVersionUID = 8120141337579471011L;
  6. private String name;
  7. private int age;
  8. private String telphone;
  9. private String address;
  10. private int gender;
  11. private Date studyTime;
  12. public int getAge() {
  13. return age;
  14. }
  15. public void setAge(int age) {
  16. this.age = age;
  17. }
  18. public String getTelphone() {
  19. return telphone;
  20. }
  21. public void setTelphone(String telphone) {
  22. this.telphone = telphone;
  23. }
  24. public String getAddress() {
  25. return address;
  26. }
  27. public void setAddress(String address) {
  28. this.address = address;
  29. }
  30. public int getGender() {
  31. return gender;
  32. }
  33. public void setGender(int gender) {
  34. this.gender = gender;
  35. }
  36. public Date getStudyTime() {
  37. return studyTime;
  38. }
  39. public void setStudyTime(Date studyTime) {
  40. this.studyTime = studyTime;
  41. }
  42. public String getName() {
  43. return name;
  44. }
  45. public void setName(String name) {
  46. this.name = name;
  47. }
  48. @Override
  49. public Object clone() throws CloneNotSupportedException {
  50. // TODO Auto-generated method stub
  51. return super.clone();
  52. }
  53. @Override
  54. public String toString() {
  55. return "StudentBean [name=" + name + ", age=" + age + ", telphone=" + telphone + ", address=" + address
  56. + ", gender=" + gender + ", studyTime=" + studyTime + "]";
  57. }
  58. }
  1. public class MainEnter {
  2. /**
  3. * 主函数
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. // TODO Auto-generated method stub
  8. StudentBean studentBean = new StudentBean();
  9. studentBean.setName("张三");
  10. studentBean.setAddress("孵化园5号楼");
  11. studentBean.setAge(18);
  12. studentBean.setStudyTime(new Date());
  13. studentBean.setGender(1);
  14. studentBean.setTelphone("13398195689");
  15. System.out.println(studentBean);
  16. //使用克隆模式产生对象
  17. try {
  18. StudentBean studentBean01 = (StudentBean) studentBean.clone();
  19. studentBean01.setName("李四");
  20. studentBean01.setTelphone("13398567845");
  21. System.out.println(studentBean01);
  22. //克隆模式产生出来的对象,不是源对象
  23. System.out.println(studentBean == studentBean01);
  24. //
  25. StudentBean studentBean02 = (StudentBean) studentBean.clone();
  26. studentBean02.setName("王五");
  27. System.out.println(studentBean02);
  28. } catch (CloneNotSupportedException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. }
  32. }

浅克隆和深克隆


浅克隆

对象在克隆时,并没有克隆其相关联的对象
例:一个对象含有一个引用类型的属性,克隆后这个属性的地址没有发生改变

造成浅克隆的原因:

与该类关联的对象类中,并没有实现Cloneable接口

深克隆

解决了浅克隆的问题

解决的方法:

关联对象实现Cloneable接口,并重写clone()方法
对象类重写clone()对象,并定义相关的条件

  1. @Override
  2. public Object clone() throws CloneNotSupportedException {
  3. // TODO Auto-generated method stub
  4. GirlBean girlBean = (GirlBean) this.girlBean.clone();
  5. StudentBean stu = (StudentBean) super.clone();
  6. stu.setGirlBean(girlBean);
  7. return stu;
  8. }

总结


克隆:以某一个对象为原型,去产生出与它相似的多个对象
克隆:是属于面向对象设计的一种设计模式: 克隆模式(原型模式)