java 浅克隆_(Java)浅克隆与深克隆的区别
克隆,就是复制一个对象的副本,而克隆又分浅克隆和深克隆。浅克隆是指克隆得到的对象基本类型的值改变了,而源对象的值不会变。但如果被克隆对象引用类型的值改变了,那么源对象的值同样会改变,因为引用类型在栈内存中存放的是一个引用地址,被克隆对象后也和源对象的引用地址一样,都是指向同样的内存空间的值。所以在克隆时,任何一个对象的值的改变都会令另外的值改变,所以这种情况下要用深克隆。
要注意的是要克隆的对象的泪必须继承cloneable接口,而该接口不提供任何抽象非抽象方法,所以又可以把它看做是克隆的标志性东西。浅克隆的特点是只克隆该对象本体,它的优缺点就是一改皆改;深克隆的特点是新建对象,与源对象互不干扰,而它的优缺点也是互不干扰和麻烦。通常情况下我们使用克隆的时候都只使用浅克隆。
对克隆可以简单的理解为:当克隆一个对象时,把属性的值和方法都一起拷贝的是浅拷贝,而方法的值可以设置不同的是深克隆。深克隆要进行反序例化,先把内容输出到内存,再从内存读取。
代码示例:
package clone;
import
java.io.ByteArrayInputStream;
import
java.io.ByteArrayOutputStream;
import
java.io.IOException;
import
java.io.ObjectInputStream;
import
java.io.ObjectOutputStream;
import
java.io.Serializable;
public class BasketballStar
implements Cloneable,Serializable{
private String name;
private int age;
private float height;
private Skill mySkill;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
public Skill getMySkill() {
return mySkill;
}
public void setMySkill(Skill mySkill) {
this.mySkill = mySkill;
}
//浅克隆
public Object clone() throws CloneNotSupportedException
{
BasketballStar bs2 = (BasketballStar)super.clone();
bs2.setMySkill((Skill)this.mySkill.clone());
return bs2;
}
public BasketballStar deepClone(){ //深克隆
ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bis = null;
ObjectInputStream ois = null;
try {
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(this);
bis = new ByteArrayInputStream(bos.toByteArray());
ois = new ObjectInputStream(bis);
return (BasketballStar)ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
try {
bis.close();
ois.close();
bos.close();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
package clone;
import
java.io.Serializable;
public class Skill
implements Cloneable,Serializable{
private int shooting;
private int jumping;
private int strength;
public int getShooting() {
return shooting;
}
public void setShooting(int shooting) {
this.shooting = shooting;
}
public int getJumping() {
return jumping;
}
public void setJumping(int jumping) {
this.jumping = jumping;
}
public int getStrength() {
return strength;
}
public void setStrength(int strength) {
this.strength = strength;
}
protected Object clone() throws CloneNotSupportedException
{
return super.clone();
}
}
package clone;
public class MyClone
{
public static void main(String[] args) {
BasketballStar bs1 = new BasketballStar();
bs1.setName("YM");
bs1.setAge(30);
bs1.setHeight( 2.26f);
Skill theSkill = new Skill();
theSkill.setShooting(95);
theSkill.setJumping(50);
theSkill.setStrength(60);
bs1.setMySkill(theSkill);
// try {
// BasketballStar bs2 = (BasketballStar)bs1.clone();
// bs2.setName("YN2");
// bs2.setAge(22);
// bs2.getMySkill().setJumping(90);
// bs2.getMySkill().setStrength(108);
//
// System.out.println(bs1.getMySkill() ==
bs2.getMySkill());
// System.out.println(bs1.getName() + " " +
bs1.getAge());
// System.out.println(bs1.getMySkill().getStrength() + " "
+
// bs1.getMySkill().getJumping());
// } catch (CloneNotSupportedException e) {
// e.printStackTrace();
// }
BasketballStar bs2 = bs1.deepClone();
System.out.println(bs1.getMySkill() ==
bs2.getMySkill());
System.out.println(bs2.getName() + " " +
bs2.getAge());
System.out.println(bs2.getMySkill().getStrength() + " "
+ bs2.getMySkill().getJumping());
}
}
java 浅克隆_(Java)浅克隆与深克隆的区别相关推荐
- java沙漏_(java)五大常用算法
算法一:分治法 基本概念1.把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.2.分治策略是对于一个规模 ...
- android java教程_[Java教程]Android开发快速入门
[Java教程]Android开发快速入门 0 2020-12-22 18:01:40 Xamarin.Android 应用程序剖析 以下屏幕截图列出了解决方案的内容. 下面是一个解决方案资源管理器, ...
- java 矩阵_(JAVA)计算机图形学与矩阵
(JAVA)计算机图形学与矩阵 平移 旋转 变比 一)矩阵 1)矩阵的乘法运算 矩阵是计算机图形学的重要工具. 计算机图形学要常常用到 矩阵乘法(矩阵与矩阵相乘). 矩阵(Aij)m*n 与矩阵(Bi ...
- java后门_@Java Web 程序员,我们一起给程序开个后门吧:让你在保留现场,服务不重启的情况下,执行我们的调试代码...
从数据库.redis取了些数据,做了一些运算后,没抛异常,但是就是结果不对 抛了个空指针异常,但是看代码,感觉没问题,是取出来就是空,还是中间什么函数把它改坏了 发现导致一个bug的原因是用了JVM缓 ...
- ie8不兼容java项目_[Java教程]ie8以下不兼容document.getElementsByName解决方法
[Java教程]ie8以下不兼容document.getElementsByName解决方法 0 2016-09-13 19:00:06 在IE8以认为只有文本标签才有name属性的,一些元素标签用d ...
- java切片_ java中一个极其强悍的新特性Stream详解(非常实用)
java8中有两个非常有名的改进,一个是Lambda表达式,一个是Stream.如果我们了解过函数式编程的话,都知道Stream真正把函数式编程的风格引入到了java中.这篇文章由简入繁逐步介绍Str ...
- java获取焦点_[Java教程]dialog获取焦点
[Java教程]dialog获取焦点 0 2014-09-25 18:00:41 弹出层是一个iframe openWindow: function (options) { var url = opt ...
- Java折叠_[Java教程]Jquery中菜单的展开和折叠
[Java教程]Jquery中菜单的展开和折叠 0 2018-08-15 16:03:38 标签内容 您好:alee 宿舍管理员 密码管理 修改密码 宿舍管理 学生宿舍查询 学生宿舍新增 学生宿舍分配 ...
- 爱你用java代码_[java]__如何用你的编程语言表达至尊宝爱你一万年的浪漫情怀....
前言 我在很多地方,或多或少都了解到人们对程序员的看法,大多是智商高情商低,不懂的浪漫之类的,并且看到了一个十分有趣的视频,用程序来表达你对女朋友的爱,于是,便来了兴趣,我想最浪漫的承诺,应该就是大话 ...
最新文章
- 如何在阿里云上安全的存放您的配置 - 续
- 机器学习的数学基础 - 特征分解与奇异值分解
- python - 配置文件
- Go gin其他数据类型渲染
- MathType可以编辑省略号吗
- Vue框架引入JS库的正确姿势
- 网络 一篇博文搞懂五种常见的IO模型
- 手机老显示存储空间不足该咋办?可删除哪些内容来增加存储空间?
- Android开发— 2016_最流行的Android组件、工具、框架大全(二)
- 数据比较1.0(文本格式)
- ipython tesseract_python使用Tesseract库识别验证
- SCM供应链管理系统对更多行业未来
- vbm 分析_vbm8_r435 脑功能数据分析处理实用软件,基于SPM 来运行 matlab 238万源代码下载- www.pudn.com...
- 黑马程序员—八期黑马,我放弃了
- 使用GLSurfaceView实现涂鸦画板功能
- 目前myeclipse官网无法登录
- 蓝阔无线打印服务器,蓝阔打印服务器云打印
- “百钱买百鸡”的问题,题的意思是这样的,5文钱可以买一只公鸡,3文钱可以买一只母鸡,1文钱可以买3只雏鸡,现在用100文钱买100只鸡,鸡各有几只?
- idea2020.2卡死在reading maven projects
- XILINX 7系列FPGA_Slice_存储器_XADC篇
热门文章
- 促销海报设计的套路你知道么? 看这里!
- 如何腾出计算机内存,电脑C盘又飘红?教你这样清理内存,可以轻松腾出大量空间...
- 同等学力计算机综合难吗,计算机在职研究生考试难度大吗?这种方式通过率高...
- Linux内存管理:为什么 Linux 需要虚拟内存?为什么 Linux 默认页大小是 4KB?
- 的电路接法_基本震荡电路知多少,汇总几种震荡电路的接法!
- java实现线性回归(简单明了,适合理解)
- 软件验收标准和验收方法_装饰装修工程质量验收标准专题讲座
- 大学计算机入学教育心得1000,新学期入学教育心得体会1000字
- c语言转图形化,「分享」C语言如何编写图形界面
- c语言变量的六要素,2-C语言复习提纲.doc