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);
}
}
结果:
李四:中国北京西雅图
李四:美国佛罗里达州罗德里格斯
李四:中国北京西雅图
Clone中存在的浅克隆问题的更多相关文章
- clone中的浅复制和深复制
clone:用于两个对象有相同的内容时,进行复制操作. 提示:Java中要想自定义类的对象可以被复制,自定义类就必须实现Cloneable中的clone()方法. 浅复制:另一个对象用clone()方 ...
- 浅谈Java中的深克隆和浅克隆(阿里面试)
在最近的秋招中,阿里和多益网络都问到了这个问题,虽然很简单,但是我还是想总结一下,感兴趣的可以看一下我的个人博客网站(Spring+MyBatis+redis+nginx+mysql)(适合菜鸟),最 ...
- java 浅拷贝和深拷贝 对象克隆clone
分一下几点讨论: 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 一:为什么要克隆? 大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗? 答案是:克隆的对象可能包 ...
- Java实例 Part6:Java中的克隆
目录 Part6:Java中的克隆 Example01:Java对象的假克隆 Example02:Java对象的浅克隆 Example03:Java对象的深克隆 Example04:序列化与对象克隆 ...
- Java clone() 浅拷贝 深拷贝
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- java的clone()的使用
clone()方法的约定 首先明确的是clone()是object的方法.Cloneable接口没有任何方法,它只起到标识的作用.(java的原型模式有用到) Cloneable接口的目的是作为对象的 ...
- Object对象具体解释(二)之clone
clone方法会返回该实例对象的一个副本,通常情况下x.clone() != x || x.clone().getClass() == x.getClass() || x.clone().equals ...
- Java的clone方法效率问题
在Java中,经常会需要新建一个对象,很多情况下,需要这个新建的对象和现有的某个对象保持属性一致. 那么,就有两种方式来实现这个对象的构造: ①通过新建一个对象,为这个对象的属性根据原有对象的属性来进 ...
- 一眼看懂深浅拷贝(clone)-C#
这是使用的是序列化的方式实现深拷贝 [Serializable] class Person:ICloneable { /// <summary> /// 字符串在clone 中类似于值类型 ...
随机推荐
- linux开机启动配置
vim /etc/rc.d/rc.local 把命令写在这里
- hdu 4619 最大匹配问题
思路:把所有涉及到的点按(x+y)的奇偶分成两部分点,对所有的1*2的骨牌,都有(x+y)为偶数的建到奇数的边.求一次最大匹配,就是答案. #include<iostream> #incl ...
- poj 3155 最大密度子图
思路: 这个还是看的胡伯涛的论文<最小割在信息学竞赛中的应用>.是将最大密度子图问题转化为了01分数规划和最小割问题. 直接上代码: #include <iostream> # ...
- 【已解决】BeautifulSoup已经获得了Unicode的Soup但是print出来却是乱码
[问题] 某人遇到的问题: 关于BeautifulSoup抓取表格及SAE数据库导入的问题(跪求大神帮忙) 简单说就是: 用如下代码: ? 1 2 3 4 5 6 7 import re,urllib ...
- Ajax中解析Json的两种方法详解
eval(); //此方法不推荐 JSON.parse(); //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: var jsonDate = '{ "name&qu ...
- Jquery中bind和live的区别
Jquery中绑定事件有三种方法:以click事件为例 (1)target.click(function(){}); (2)target.bind("click",function ...
- 正则Match
Match match = Regex.Match("result=23&asdf=asdf", @"result=(\d+)&"); if ( ...
- 搭建私有git代码托管服务就是这么简单(简单5步)
部署一个git代码托管服务就是这么简单 --基于阿里云ecs以docker容器运行gogs代码托管服务 部署步骤: 1.新建ecs云主机,选定操作系统为ubuntu 12.4tls 2.搭建docke ...
- boost库区间range基本原理及使用实例
由 www.169it.com 搜集整理 区间的概念类似于STL中的容器概念.一个区间提供了可以访问半开放区间[first,one_past_last)中元素的迭代器,还提供了区间中的元素数量的信息. ...
- win32进阶之路:程序托盘图标+右键弹出菜单
开场白 本次介绍两个非常棒且实用的技巧:程序托盘图标和右键弹出菜单,效果如下图. 程序托盘图标用了迅雷的图标,右键点击时候会弹出三个选项的菜单. 程序托盘图标设置 我会用尽可能清晰明了的步骤介绍方式 ...