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 中类似于值类型 ...
随机推荐
- NSURLConnection、NSURLSession
NSURLConnection 1.准备网络资源地址:URL 注意:由于URL支持26个英文字母,数字和少数的几个特殊字符. 因此对于URL中包含非标准URL的字符,需要进行编码. iOS提供了函 ...
- extjs的调试方法
1.使用extjs自带的测试工具 第一步:在ExtJS下载的资源包中,找到debug.js,将JS文件导入实际要运行的HTML或者JSP页面上 第二步:在有关JS文件代码中嵌入Ext.log('自定义 ...
- Servlet & JSP - 中文字符问题
Servlet 中的中文字符 来自 URL 参数部分的中文字符 Tomcat 默认接收数据的编码是 ISO-8859-1.所以当请求 URL 的参数部分含有中文字符,需要转换字符的编码. Enumer ...
- Linux 命令 - chmod: 更改文件模式
文件的模式 当使用 ls -l 命令查看目录内容时 [huey@huey-K42JE cmdline]$ ls -l /etc/passwd -rw-r--r-- 1 root root 1917 J ...
- Git CMD - fetch: Download objects and refs from another repository
命令格式 git fetch [<options>] [<repository> [<refspec>…]] git fetch [<options> ...
- Global.asax中的操作数据库代码无法执行
本人最近在做一个基于Access数据库的Web应用程序,为了实现一个定时更新数据库的需求,我在Global.asax中的Application_Start函数里写了个计时器, void Applica ...
- ios Swift ! and ?
swift ?和!之间区别: Swift 引入的最不一样的可能就是 Optional Value 了.在声明时,我们可以通过在类型后面加一个? 来将变量声明为 Optional 的.如果不是 Opti ...
- ubuntu 更新软件源
ubuntu 更新软件源 修改文件sources.list 位于/etc/apt/sources.list,并备份原文件为sources.list.bak deb http://mirrors.163 ...
- 第四篇、CocoaPods 镜像的更新 原来的淘宝镜像已经不再更新
在开发应用,我们常常使用cocoaPods来管理第三方框架,但是原来的淘宝的镜像不更新了 新的镜像地址:https://gems.ruby-china.org/
- Cocos2d-x中使用音频CocosDenshion引擎介绍与音频文件的预处理
Cocos2d-x提供了一个音频CocosDenshion引擎,CocosDenshion引擎可以独立于Cocos2d-x单独使用,CocosDenshion引擎本质上封装了OpenAL音频处理库.具 ...