shibazi

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

A.java

package second;

public class A {
    String country;//国家
    String province;//地区
    String city;//城市
    public A(String country,String province,String city){
        this.country = country;
        this.province = province;
        this.city = city;
    }
}

B.java

package second;

public class B implements Cloneable {
    String name;//姓名
    int age;//年龄
    A addr;//定义地址
    /**
     * 构造方法
     * @param name 姓名
     * @param age 年龄
     * @param addr 指向A的地址集
     */
    public B (String name,int age,A addr){
        this.name = name;
        this.age = age;
        this.addr = addr;
    }
    /**
     * 克隆方法
     */
    public Object clone(){
        B handler = null;
        try{
            handler = (B)super.clone();
        }catch(CloneNotSupportedException e){
            e.printStackTrace();
        }
        return handler;
    }
}

C.java

package second;

public class C implements Cloneable {
    public static void main(String[] args){
        A a = new A("中国","北京","西雅图");
        B b = new B("李四",22,a);
        System.out.println(b.name+":"+b.addr.country+b.addr.province+b.addr.city);
        B bclone = (B)b.clone();
        bclone.addr.country = "美国";
        bclone.addr.province = "佛罗里达州";
        bclone.addr.country = "罗德里格斯";
        System.out.println(bclone.name+":"+bclone.addr.country+bclone.addr.province+bclone.addr.city);
        System.out.println(b.name+":"+b.addr.country+b.addr.province+b.addr.city);
    }
}

 

输出:

李四:中国北京西雅图
李四:罗德里格斯佛罗里达州西雅图
李四:罗德里格斯佛罗里达州西雅图

 

PS::可见即使通过克隆的方法,如果有变量指向的是一个可变的变量;原对象跟克隆后的对象中的可变对象(变量)仍然是指向的同一个内存地址:;

解决方法,重新构造一组可变的变量,这样就不会覆盖原地址的数据

C.java

package second;

public class C implements Cloneable {
    public static void main(String[] args){
        A a = new A("中国","北京","西雅图");
        B b = new B("李四",22,a);
        System.out.println(b.name+":"+b.addr.country+b.addr.province+b.addr.city);
        B bclone = (B)b.clone();
        A a1 = new A("美国","佛罗里达州","罗德里格斯");
        bclone.addr = a1;
        System.out.println(bclone.name+":"+bclone.addr.country+bclone.addr.province+bclone.addr.city);
        System.out.println(b.name+":"+b.addr.country+b.addr.province+b.addr.city);
    }
}

结果:

李四:中国北京西雅图
李四:美国佛罗里达州罗德里格斯
李四:中国北京西雅图

 

posted on 2014-07-14 12:08  一生学习,何来毕业  阅读(254)  评论(0编辑  收藏  举报