• Clone中存在的浅克隆问题


    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);
        }
    }

    结果:

    李四:中国北京西雅图
    李四:美国佛罗里达州罗德里格斯
    李四:中国北京西雅图
  • 相关阅读:
    分块的一些题(入门)
    HH的项链
    2019 CCPC-Wannafly Winter Camp Div2 Day1
    2019 CCPC-Wannafly Winter Camp Div2 Day7
    HDU-5672 String(尺取)
    POJ-3104 Drying(二分
    Codeforces
    Java把内存划分为4个部分 1. 代码区 1、栈区 3、堆区 4、静态区域
    二:java语法基础:
    一:java概述:
  • 原文地址:https://www.cnblogs.com/shibazi/p/3842459.html
Copyright © 2020-2023  润新知