/**
?*默認得克隆方法為淺克隆只克隆對象得非引用類型(或者非對象型)成員
?*要做深克隆有兩種方法:
?*a.覆寫克隆方法(引用型成員的克隆方法)并且克隆時掉一次引用型成員的克隆方法!
?*b.序列化對象時默認為深克隆
?*
?*/
?
?class Friend implements Cloneable {
?? int age;
?? String name;
??
??public Friend(int age, String name) {
???this.age = age;
???this.name = name;?
??}
??
??public Object clone () throws CloneNotSupportedException {
???return super.clone();?
??}
???
?}
?
?class Person implements Cloneable? {
?? int age;
??/* *
?? *String 類型特殊,因為他為引用型,而且他指向的值為常量,克隆出來的對象改變他的
?? *值實際上是改變了克隆出來對象String類型成員的指向不會影響被克隆對象的值及其指向?
?? *因為引用被克隆了,我改變的是引用的指向!
??*/
?? String name;
??
?? Friend f;
??
??public Person(int age, String name, Friend f) {
???this.age = age;
???this.name = name;
???this.f = f;
??}
??
??public Object clone () throws CloneNotSupportedException {
???Person p = (Person)super.clone();
???p.f = (Friend)p.f.clone();
???return p;?
??}
??
??public String toString(){
??StringBuffer sb = new StringBuffer();
??return super.toString()+sb.append("age=").append(age).
???append(",name=").append(name).
???append("friend=").append("f.name=").
???append(f.name).append("f.age=").append(f.age).toString();
?}
?}
?
?
?public class Clonetest {
??public static void main(String [] args)? throws CloneNotSupportedException {
???Person p = new Person(4,"haha",new Friend(5,"hehe"));
???Person p1 = (Person)p.clone();
???p1.name = "oop";
???p1.age = 10;
???p1.f.name = "ooad";
???p1.f.age = 56;
???System.out.println (p);
??System.out.println (p1);
??}?
?}