一、今日学习内容 每周周报
1、对象中的克隆
(1)克隆的限制
Java对于克隆(Clone)有一些限制, 主要表现如下:
a.被克隆的类必须自己实现Cloneable接口,以指示Object.cloneO) 方法可以合法地对该类实例进行按字段复制。Cloneable接口实际上是个标识接口,没有任何接口 方法。
b.实现Cloneable接口的类应该使用公共方法重写Object.clone (它是受保护的)。某个对象实现了此接口就克隆它是不可能的。
c.在Java.lang Object类中克隆方法是这么定义的:
protected object clone()
throws CloneNotSupportedException
创建并返回此对象的个副本。 表明是一个受保护的方法, 同个包中可见。 按照惯例,返回的对象应该通过调用super.clone 获得。
(2)浅层克隆和深层克隆
a.浅层克隆:主要复制基本对象的值。
b.深层克隆:当类存在聚合关系时,克隆就必须考虑聚合对象的克隆。可以复制引用类型的字段。
示例:浅层克隆
1 public class CloneDemo ( 2 publte Btatie vold main(string[] args) throws CloneNotSupportedException { 3 Person P =new Person("任我行",35); 4 Person p2= (Person)p.clone(); 5 System. out.println("克隆前: "+p.getName()+", "+p.getAge()); 6 System. out.println("克隆后: "+p2 .getName()+", "+p2.getAge()); 7 if (p==p2) 8 System.out.println("p和p2的地址相等!"); 9 else 10 System.out. println("p和p2的地址不相等!!"); 11 } 12 } 13 /** 14 *简单类克隆实现 15 *要实现克隆,必须实现Cloneable接口,这是一个标识接口,没有接口方法 16 *实现了Cloneable接口,以指示object.clone() 方法 17 *可以合法地对该类实例进行按字段复制 18 *按照惯例,实现此接口的类应该使用公共方法重写object.clone (它是受保护的) 19 */ 20 class Person implements Cloneable{ 21 private String name; 22 private int age; 23 public Person(String name,int age) { 24 this.name=name; 25 this .age=age; 26 } 27 public String getName() { 28 return name; 29 } 30 public void setName (String name){ 31 this.name=name; 32 } 33 public int getAge(){ 34 return age ; 35 } 36 public void setAge (int age) { 37 this.age = age; 38 } 39 @Override 40 protected objéct clone () throws CloneNotSupportedException{ 41 return super.clone(); 42 } 43 }
结果:
示例:深层克隆
public class CloneDemo ( publte Btatie vold main(string[] args) throws CloneNotSupportedException { Person Per =new Person("令狐冲",20); P p=new P(per); P p2= (P)p.clone(); System. out.println("克隆前: "+p.getPer().getName()+", "+p.getPer().getAge()); System. out.println("克隆后: "+p2.getPer().getName()+", "+p2.getPer().getAge()); if (p==p2) System.out.println("p和p2的地址相等!"); else System.out. println("p和p2的地址不相等!!"); if(p.getPer()==p2.getPer()) System.out.println("p中的person对象和p2中的person对象相等!"); else System.out.println("p中的person对象和p2中的person对象不相等!"); } } class P implements Cloneable{ Person per; public P(Person per) { this.per=per; } public Person gePer() { return per; } public void setPer (Person per){ } @Override protected objéct clone () throws CloneNotSupportedException{ P p=(P)super.clone(); P.per=(Person)this.per.clone(); return p; } }
结果:
二、遇到的问题
对于克隆问题还没有理解的很明白
三、明日计划
继续学习第五章的内容
收获:
在过去一周学习了第四章和第五章的部分内容,学习了java中的类的相关知识:Java中的方法、构造方法、方法的调用、类的属性、包等,第五章的部分内容:类的继承,以及对象中的克隆。
遇到的问题:
java类的相关知识与c++中的类的相关知识有些不同,需要及时巩固熟练。
下周计划:
继续学习第五章、第六章的内容