原型模式 java 深浅_JAVA设计模式---原型模式--浅客隆和深克隆
JAVA淺克隆和深克隆
淺克隆:被復(fù)制對(duì)象的所有變量和原來(lái)相同,而所有的對(duì)其他對(duì)象的引用仍指向原對(duì)象。即如果復(fù)制的對(duì)象修改復(fù)制對(duì)象的變量,原對(duì)象不會(huì)改變。而修改引用的對(duì)象,二者均會(huì)發(fā)生改變。
深復(fù)制(克隆):被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值,除去那些引用其他對(duì)象的變量。那些引用其他對(duì)象的變量將指向被復(fù)制過(guò)來(lái)的新對(duì)象,而不再是原有的那些被引用的對(duì)象。深克隆就是把所有對(duì)象多復(fù)制了一遍。
public class Student implements Cloneable,Serializable {
private String name;
private int age;
private Teacher teacher;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
//淺復(fù)制
public Object clone(){
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
return obj;
}
/* 深復(fù)制 */
public Object deepClone() throws IOException, ClassNotFoundException {
/* 寫(xiě)入當(dāng)前對(duì)象的二進(jìn)制流 */
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
/* 讀出二進(jìn)制流產(chǎn)生的新對(duì)象 */
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
public class Teacher implements Serializable{
private String tName;
public Teacher() {
super();
}
public Teacher(String tName) {
super();
this.tName = tName;
}
public String gettName() {
return tName;
}
public void settName(String tName) {
this.tName = tName;
}
}
import java.io.IOException;
public class Test {
/**
* @param args
*/
public static void main(String[] args) throws ClassNotFoundException, IOException {
Student stu = new Student();
stu.setAge(22);
stu.setName("stu1");
stu.setTeacher(new Teacher("Tea1"));
Student stu1 = (Student) stu.clone();
//淺復(fù)制
stu1.getTeacher().settName("tea2");
stu1.setAge(23);
System.out.println(stu1.getTeacher().gettName()+"? "+stu.getTeacher().gettName());
System.out.println(stu1.getAge()+"? "+stu.getAge());
}
}
//淺復(fù)制
stu1.getTeacher().gettName()的值和stu.getTeacher().gettName()相同,被修改之后的值
stu1.getAge()的值和stu.getAge()的值不同,前者為23,后者為22
//深復(fù)制
Student stu2 = (Student) stu.deepClone();
stu2.getTeacher().settName("tea3");
stu2.setAge(23);
System.out.println(stu2.getAge()+” ”+stu.getAge());
System.out.println(stu2.getTeacher().gettName()+"? "+stu.getTeacher().gettName());
stu2.getAge()的值和stu.getAge()的值不同,前者為23,后者為22
stu2.getTeacher().getName()的值和stu.getTeacher().getName()的的值不同,前者為tea3,后者為tea1
總結(jié)
以上是生活随笔為你收集整理的原型模式 java 深浅_JAVA设计模式---原型模式--浅客隆和深克隆的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 四、COSMIC功能点实操
- 下一篇: [给ASP.NET 初学者的话]不要练功