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 中类似于值类型 ...
随机推荐
- 奥运会订票系统c语言代写源码下载
制作能够实现2008北京奥运会网上订票的系统,能够实现购票人员注册.购票.管理人员可以设置各个比赛场地的赛事安排及票数. 程序要求实现的功能如下: 购票者信息注册:购票者可以用昵称和身份证进行注册,若 ...
- 关于JAVA那点事---i++和++i
对i++和++i 一直有点晕,今天专门抽空来研究相关的知识. 先从简单的说起. 有如下程序: int i=0; i=i++; system.out.print(i); 一眼望去这个结果显而易见是1,但 ...
- centos下安装usb摄像头驱动
centos安装在虚拟机下,win7下能正常使用摄像头. 虚拟机显示监测到摄像头,但驱动安装失败. terminal下输入yum install cheese,提示是否安装,输入y确认下载,大概100 ...
- 通过Bresenham算法实现完成矢量线性多边形向栅格数据的转化
1.实验目的与要求 目的:通过本次实验,完成矢量线性多边形向栅格数据的转化过程: 要求:采用VC++6.0实现. 2.实验方法 采用Bresenham算法实现 3.实验材料 直线的定义:y = x/3 ...
- HDOJ2013蟠桃记
蟠桃记 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- AIDL实现Android IPC
1.AIDL文本解释 在软件工程中,接口定义语言(IDL)已经成为通用术语,是用来描述软件组件接口的特定语言.在Android中,该IDL被称为Android接口定义语言(AIDL),它是纯文本文件, ...
- 为EditText设置OnTouchListener事件监听
在项目中需要在EditText输入前,判断某个值是否已经有值,有才可以输入,为NULL值则提示不让输入,先填写指定的编辑框 自己试过监听获取焦点事件,来设置setFocusable(true)或者se ...
- javaweb 乱码总结
可能的错误地方: 1.jsp页面编码 2.表单编码 3.servlet可接受编码 4.tomcat中server.xml文件中的指定编码 所有的编码要统一,一般使用“UTF-8”比较好 我最近一次出错 ...
- struts2-ajax-jQuery
1.所需jar包如下所示.其中选中的四个包是struts2实现ajax所必需的,所有的jar包都可以从下载的完整的struts2 包中的lib文件夹中找到. 2.Demo struts2ajax.js ...
- IP地址理解_IP地址=网络地址+主机地址,但是具体前面多少是网络地址看题目说明
题目: 属于网络112.10.200.0/21的地址是() 112.10.206.0 112.10.217.0 112.10.224.0 112.10.198.0 分析解答: 总结: 首先,明白后 ...