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

结果:

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

Clone中存在的浅克隆问题的更多相关文章

  1. clone中的浅复制和深复制

    clone:用于两个对象有相同的内容时,进行复制操作. 提示:Java中要想自定义类的对象可以被复制,自定义类就必须实现Cloneable中的clone()方法. 浅复制:另一个对象用clone()方 ...

  2. 浅谈Java中的深克隆和浅克隆(阿里面试)

    在最近的秋招中,阿里和多益网络都问到了这个问题,虽然很简单,但是我还是想总结一下,感兴趣的可以看一下我的个人博客网站(Spring+MyBatis+redis+nginx+mysql)(适合菜鸟),最 ...

  3. java 浅拷贝和深拷贝 对象克隆clone

    分一下几点讨论: 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 一:为什么要克隆? 大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗? 答案是:克隆的对象可能包 ...

  4. Java实例 Part6:Java中的克隆

    目录 Part6:Java中的克隆 Example01:Java对象的假克隆 Example02:Java对象的浅克隆 Example03:Java对象的深克隆 Example04:序列化与对象克隆 ...

  5. Java clone() 浅拷贝 深拷贝

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  6. java的clone()的使用

    clone()方法的约定 首先明确的是clone()是object的方法.Cloneable接口没有任何方法,它只起到标识的作用.(java的原型模式有用到) Cloneable接口的目的是作为对象的 ...

  7. Object对象具体解释(二)之clone

    clone方法会返回该实例对象的一个副本,通常情况下x.clone() != x || x.clone().getClass() == x.getClass() || x.clone().equals ...

  8. Java的clone方法效率问题

    在Java中,经常会需要新建一个对象,很多情况下,需要这个新建的对象和现有的某个对象保持属性一致. 那么,就有两种方式来实现这个对象的构造: ①通过新建一个对象,为这个对象的属性根据原有对象的属性来进 ...

  9. 一眼看懂深浅拷贝(clone)-C#

    这是使用的是序列化的方式实现深拷贝 [Serializable] class Person:ICloneable { /// <summary> /// 字符串在clone 中类似于值类型 ...

随机推荐

  1. linux开机启动配置

    vim /etc/rc.d/rc.local 把命令写在这里

  2. hdu 4619 最大匹配问题

    思路:把所有涉及到的点按(x+y)的奇偶分成两部分点,对所有的1*2的骨牌,都有(x+y)为偶数的建到奇数的边.求一次最大匹配,就是答案. #include<iostream> #incl ...

  3. poj 3155 最大密度子图

    思路: 这个还是看的胡伯涛的论文<最小割在信息学竞赛中的应用>.是将最大密度子图问题转化为了01分数规划和最小割问题. 直接上代码: #include <iostream> # ...

  4. 【已解决】BeautifulSoup已经获得了Unicode的Soup但是print出来却是乱码

    [问题] 某人遇到的问题: 关于BeautifulSoup抓取表格及SAE数据库导入的问题(跪求大神帮忙) 简单说就是: 用如下代码: ? 1 2 3 4 5 6 7 import re,urllib ...

  5. Ajax中解析Json的两种方法详解

    eval();  //此方法不推荐 JSON.parse();  //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: var jsonDate = '{ "name&qu ...

  6. Jquery中bind和live的区别

    Jquery中绑定事件有三种方法:以click事件为例 (1)target.click(function(){}); (2)target.bind("click",function ...

  7. 正则Match

    Match match = Regex.Match("result=23&asdf=asdf", @"result=(\d+)&"); if ( ...

  8. 搭建私有git代码托管服务就是这么简单(简单5步)

    部署一个git代码托管服务就是这么简单 --基于阿里云ecs以docker容器运行gogs代码托管服务 部署步骤: 1.新建ecs云主机,选定操作系统为ubuntu 12.4tls 2.搭建docke ...

  9. boost库区间range基本原理及使用实例

    由 www.169it.com 搜集整理 区间的概念类似于STL中的容器概念.一个区间提供了可以访问半开放区间[first,one_past_last)中元素的迭代器,还提供了区间中的元素数量的信息. ...

  10. win32进阶之路:程序托盘图标+右键弹出菜单

     开场白 本次介绍两个非常棒且实用的技巧:程序托盘图标和右键弹出菜单,效果如下图. 程序托盘图标用了迅雷的图标,右键点击时候会弹出三个选项的菜单. 程序托盘图标设置 我会用尽可能清晰明了的步骤介绍方式 ...