克隆,就是复制一个对象的副本,而克隆又分浅克隆和深克隆。浅克隆是指克隆得到的对象基本类型的值改变了,而源对象的值不会变。但如果被克隆对象引用类型的值改变了,那么源对象的值同样会改变,因为引用类型在栈内存中存放的是一个引用地址,被克隆对象后也和源对象的引用地址一样,都是指向同样的内存空间的值。所以在克隆时,任何一个对象的值的改变都会令另外的值改变,所以这种情况下要用深克隆。

要注意的是要克隆的对象的泪必须继承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)浅克隆与深克隆的区别相关推荐

  1. java沙漏_(java)五大常用算法

    算法一:分治法 基本概念1.把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.2.分治策略是对于一个规模 ...

  2. android java教程_[Java教程]Android开发快速入门

    [Java教程]Android开发快速入门 0 2020-12-22 18:01:40 Xamarin.Android 应用程序剖析 以下屏幕截图列出了解决方案的内容. 下面是一个解决方案资源管理器, ...

  3. java 矩阵_(JAVA)计算机图形学与矩阵

    (JAVA)计算机图形学与矩阵 平移 旋转 变比 一)矩阵 1)矩阵的乘法运算 矩阵是计算机图形学的重要工具. 计算机图形学要常常用到 矩阵乘法(矩阵与矩阵相乘). 矩阵(Aij)m*n 与矩阵(Bi ...

  4. java后门_@Java Web 程序员,我们一起给程序开个后门吧:让你在保留现场,服务不重启的情况下,执行我们的调试代码...

    从数据库.redis取了些数据,做了一些运算后,没抛异常,但是就是结果不对 抛了个空指针异常,但是看代码,感觉没问题,是取出来就是空,还是中间什么函数把它改坏了 发现导致一个bug的原因是用了JVM缓 ...

  5. ie8不兼容java项目_[Java教程]ie8以下不兼容document.getElementsByName解决方法

    [Java教程]ie8以下不兼容document.getElementsByName解决方法 0 2016-09-13 19:00:06 在IE8以认为只有文本标签才有name属性的,一些元素标签用d ...

  6. java切片_ java中一个极其强悍的新特性Stream详解(非常实用)

    java8中有两个非常有名的改进,一个是Lambda表达式,一个是Stream.如果我们了解过函数式编程的话,都知道Stream真正把函数式编程的风格引入到了java中.这篇文章由简入繁逐步介绍Str ...

  7. java获取焦点_[Java教程]dialog获取焦点

    [Java教程]dialog获取焦点 0 2014-09-25 18:00:41 弹出层是一个iframe openWindow: function (options) { var url = opt ...

  8. Java折叠_[Java教程]Jquery中菜单的展开和折叠

    [Java教程]Jquery中菜单的展开和折叠 0 2018-08-15 16:03:38 标签内容 您好:alee 宿舍管理员 密码管理 修改密码 宿舍管理 学生宿舍查询 学生宿舍新增 学生宿舍分配 ...

  9. 爱你用java代码_[java]__如何用你的编程语言表达至尊宝爱你一万年的浪漫情怀....

    前言 我在很多地方,或多或少都了解到人们对程序员的看法,大多是智商高情商低,不懂的浪漫之类的,并且看到了一个十分有趣的视频,用程序来表达你对女朋友的爱,于是,便来了兴趣,我想最浪漫的承诺,应该就是大话 ...

最新文章

  1. 如何在阿里云上安全的存放您的配置 - 续
  2. 机器学习的数学基础 - 特征分解与奇异值分解
  3. python - 配置文件
  4. Go gin其他数据类型渲染
  5. MathType可以编辑省略号吗
  6. Vue框架引入JS库的正确姿势
  7. 网络 一篇博文搞懂五种常见的IO模型
  8. 手机老显示存储空间不足该咋办?可删除哪些内容来增加存储空间?
  9. Android开发— 2016_最流行的Android组件、工具、框架大全(二)
  10. 数据比较1.0(文本格式)
  11. ipython tesseract_python使用Tesseract库识别验证
  12. SCM供应链管理系统对更多行业未来
  13. vbm 分析_vbm8_r435 脑功能数据分析处理实用软件,基于SPM 来运行 matlab 238万源代码下载- www.pudn.com...
  14. 黑马程序员—八期黑马,我放弃了
  15. 使用GLSurfaceView实现涂鸦画板功能
  16. 目前myeclipse官网无法登录
  17. 蓝阔无线打印服务器,蓝阔打印服务器云打印
  18. “百钱买百鸡”的问题,题的意思是这样的,5文钱可以买一只公鸡,3文钱可以买一只母鸡,1文钱可以买3只雏鸡,现在用100文钱买100只鸡,鸡各有几只?
  19. idea2020.2卡死在reading maven projects
  20. XILINX 7系列FPGA_Slice_存储器_XADC篇

热门文章

  1. 促销海报设计的套路你知道么? 看这里!
  2. 如何腾出计算机内存,电脑C盘又飘红?教你这样清理内存,可以轻松腾出大量空间...
  3. 同等学力计算机综合难吗,计算机在职研究生考试难度大吗?这种方式通过率高...
  4. Linux内存管理:为什么 Linux 需要虚拟内存?为什么 Linux 默认页大小是 4KB?
  5. 的电路接法_基本震荡电路知多少,汇总几种震荡电路的接法!
  6. java实现线性回归(简单明了,适合理解)
  7. 软件验收标准和验收方法_装饰装修工程质量验收标准专题讲座
  8. 大学计算机入学教育心得1000,新学期入学教育心得体会1000字
  9. c语言转图形化,「分享」C语言如何编写图形界面
  10. c语言变量的六要素,2-C语言复习提纲.doc