SlideShare a Scribd company logo
1 of 16
Download to read offline
北京圣思园科技有限公司
http://www.shengsiyuan.com
• 浅复制与深复制概念
 – 浅复制(浅克隆):被复制对象的所有变量都
   含有与原来的对象相同的值,而所有的对其他
   对象的引用仍然指向原来的对象。换言之,浅
   复制仅仅复制所考虑的对象,而不复制它所引
   用的对象。
• 浅复制与深复制概念
 – 深复制(深克隆):被复制对象的所有变量都
   含有与原来的对象相同的值,除去那些引用其
   他对象的变量。那些引用其他对象的变量将指
   向被复制过的新对象,而不再是原有的那些被
   引用的对象。换言之,深复制把要复制的对象
   所引用的对象都复制了一遍。
• Java的clone()方法【定义在Object类中】
  – clone方法将对象复制了一份并返回给调用者。
    一般而言,clone()方法满足:
  – ①对任何的对象x,都有x.clone() !=x
     • 克隆对象与原对象不是同一个对象

  – ②对任何的对象x,都有
    x.clone().getClass()= =x.getClass()
     • 克隆对象与原对象的类型一样

  – ③如果对象x的equals()方法定义恰当,那么
    x.clone().equals(x)应该成立。
•   Java中对象的克隆
    – ①为了获取对象的一份拷贝,我们可以利用Object类
      的clone()方法。
    – ②在派生类中覆盖基类的clone()方法,并声明为
      public【Object类中的clone()方法为protected的】。
    – ③在派生类的clone()方法中,调用super.clone()。
    – ④在派生类中实现Cloneable接口。
• 说明:
 – ①为什么我们在派生类中覆盖Object的clone()
   方法时,一定要调用super.clone()呢?
   • 在运行时刻,Object中的clone()识别出你要复制
     的是哪一个对象,然后为此对象分配空间,并进行
     对象的复制,将原始对象的内容一一复制到新对象
     的存储空间中。
 – ②继承自java.lang.Object类的clone()方法
   是浅复制
• 把对象写到流里的过程是序列化(Serilization)
  过程,而把对象从流中读出来的过程则叫做反序
  列化(Deserialization)过程。应当指出的是,
  写在流里的是对象的一个拷贝,而原对象仍然存
  在于JVM里面。
• 在Java语言里深复制一个对象,常常可以
  先使对象实现Serializable接口,然后把对
  象(实际上只是对象的一个拷贝)写到一
  个流里,再从流里读出来,便可以重建对
  象。
• 这样做的前提是对象以及对象内部所有引
  用到的对象都是可串行化的,否则,就需
  要仔细考察那些不可串行化的对象可否设
  成transient,从而将之排除在复制过程之
  外。
• 注意:Cloneable与Serializable都是
  marker Interface,也就是说他们只是一个
  标识接口,没有定义任何方法。
• 当一个类实现了Serializable接口时,表明
  该类可被序列化,这个时候Eclipse会要求
  你为该类定义一个字段,该字段名字为
  serialVersionUID,类型为long,提示信
  息如下
• The serializable class Student4 does
  not declare a static final
  serialVersionUID field of type long
• 你可以随便写一个,在Eclipse中它替你生
  成一个,有两种生成方式:
  一个是默认的1L,比如:private static
  final long serialVersionUID = 1L;
  一个是根据类名、接口名、成员方法及属
  性等来生成一个64位的哈希字段,比如:
  private static final long
  serialVersionUID =
  8940196742313994740L;之类的。
• 当你一个类实现了Serializable接口,如果
  没有定义serialVersionUID,Eclipse会提
  供这个提示功能告诉你去定义之。
  在Eclipse中点击类中warning的图标一下
  【即那个黄色的图标】,Eclipse就会自动
  给定两种生成的方式,如上面所述。如果
  不想定义它,在Eclipse的设置中也可以把
  它关掉的,设置如下
• Window ==> Preferences ==> Java
  ==> Compiler ==> Error/Warnings
  ==> Potential programming
  problems
  将Serializable class without
  serialVersionUID的warning改成ignore
  即可。
• 如果你没有考虑到兼容性问题时,就把它
  关掉,不过有这个功能是好的,只要任何
  类别实现了Serializable这个接口的话,如
  果没有加入serialVersionUID,Eclipse都
  会给你warning提示,这个
  serialVersionUID为了让该类别
  Serializable向后兼容。
• 如果你的对象序列化后存到硬盘上面后,
  可是后来你却更改了类的field(增加或减少
  或改名),当你反序列化时,就会出现
  Exception的,这样就会造成不兼容性的问
  题。
• 但当serialVersionUID相同时,它就会将
  不一样的field以type的缺省值Deserialize,
  这个可以避开不兼容性的问题。

More Related Content

Viewers also liked

[圣思园][Java SE]Observer
[圣思园][Java SE]Observer[圣思园][Java SE]Observer
[圣思园][Java SE]ObserverArBing Xie
 
[圣思园][Java SE]Network
[圣思园][Java SE]Network[圣思园][Java SE]Network
[圣思园][Java SE]NetworkArBing Xie
 
[圣思园][Java SE]Java se lesson 21
[圣思园][Java SE]Java se lesson 21[圣思园][Java SE]Java se lesson 21
[圣思园][Java SE]Java se lesson 21ArBing Xie
 
[圣思园][Java SE]Strategy
[圣思园][Java SE]Strategy[圣思园][Java SE]Strategy
[圣思园][Java SE]StrategyArBing Xie
 
沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用ArBing Xie
 
[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1ArBing Xie
 
[圣思园][Java SE]Java se lesson 22
[圣思园][Java SE]Java se lesson 22[圣思园][Java SE]Java se lesson 22
[圣思园][Java SE]Java se lesson 22ArBing Xie
 
[圣思园][Java SE]Io 1
[圣思园][Java SE]Io 1[圣思园][Java SE]Io 1
[圣思园][Java SE]Io 1ArBing Xie
 
[圣思园][Java SE]Java se lesson 10
[圣思园][Java SE]Java se lesson 10[圣思园][Java SE]Java se lesson 10
[圣思园][Java SE]Java se lesson 10ArBing Xie
 
沈阳师范大学课程实践 Java语言部分
沈阳师范大学课程实践 Java语言部分沈阳师范大学课程实践 Java语言部分
沈阳师范大学课程实践 Java语言部分ArBing Xie
 
[圣思园][Java SE]Inner class
[圣思园][Java SE]Inner class[圣思园][Java SE]Inner class
[圣思园][Java SE]Inner classArBing Xie
 
[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3ArBing Xie
 
沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用ArBing Xie
 
古典加密算法实验
古典加密算法实验古典加密算法实验
古典加密算法实验ArBing Xie
 
[圣思园][Java SE]000 讲师张龙简介
[圣思园][Java SE]000 讲师张龙简介[圣思园][Java SE]000 讲师张龙简介
[圣思园][Java SE]000 讲师张龙简介ArBing Xie
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲ArBing Xie
 

Viewers also liked (17)

[圣思园][Java SE]Observer
[圣思园][Java SE]Observer[圣思园][Java SE]Observer
[圣思园][Java SE]Observer
 
[圣思园][Java SE]Network
[圣思园][Java SE]Network[圣思园][Java SE]Network
[圣思园][Java SE]Network
 
[圣思园][Java SE]Java se lesson 21
[圣思园][Java SE]Java se lesson 21[圣思园][Java SE]Java se lesson 21
[圣思园][Java SE]Java se lesson 21
 
[圣思园][Java SE]Strategy
[圣思园][Java SE]Strategy[圣思园][Java SE]Strategy
[圣思园][Java SE]Strategy
 
沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用
 
[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1
 
[圣思园][Java SE]Java se lesson 22
[圣思园][Java SE]Java se lesson 22[圣思园][Java SE]Java se lesson 22
[圣思园][Java SE]Java se lesson 22
 
[圣思园][Java SE]Io 1
[圣思园][Java SE]Io 1[圣思园][Java SE]Io 1
[圣思园][Java SE]Io 1
 
[圣思园][Java SE]Java se lesson 10
[圣思园][Java SE]Java se lesson 10[圣思园][Java SE]Java se lesson 10
[圣思园][Java SE]Java se lesson 10
 
沈阳师范大学课程实践 Java语言部分
沈阳师范大学课程实践 Java语言部分沈阳师范大学课程实践 Java语言部分
沈阳师范大学课程实践 Java语言部分
 
[圣思园][Java SE]Inner class
[圣思园][Java SE]Inner class[圣思园][Java SE]Inner class
[圣思园][Java SE]Inner class
 
Aes实验
Aes实验Aes实验
Aes实验
 
[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3
 
沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用
 
古典加密算法实验
古典加密算法实验古典加密算法实验
古典加密算法实验
 
[圣思园][Java SE]000 讲师张龙简介
[圣思园][Java SE]000 讲师张龙简介[圣思园][Java SE]000 讲师张龙简介
[圣思园][Java SE]000 讲师张龙简介
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
 

More from ArBing Xie

[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3ArBing Xie
 
[圣思园][Java SE]Swing
[圣思园][Java SE]Swing[圣思园][Java SE]Swing
[圣思园][Java SE]SwingArBing Xie
 
[圣思园][Java SE]Java se lesson 15
[圣思园][Java SE]Java se lesson 15[圣思园][Java SE]Java se lesson 15
[圣思园][Java SE]Java se lesson 15ArBing Xie
 
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案ArBing Xie
 
[圣思园][Java SE]Ooad与uml lesson 2
[圣思园][Java SE]Ooad与uml lesson 2[圣思园][Java SE]Ooad与uml lesson 2
[圣思园][Java SE]Ooad与uml lesson 2ArBing Xie
 
[圣思园][Java SE]Java se lesson 20
[圣思园][Java SE]Java se lesson 20[圣思园][Java SE]Java se lesson 20
[圣思园][Java SE]Java se lesson 20ArBing Xie
 
[圣思园][Java SE]Java se lesson 17
[圣思园][Java SE]Java se lesson 17[圣思园][Java SE]Java se lesson 17
[圣思园][Java SE]Java se lesson 17ArBing Xie
 
[圣思园][Java SE]Java se lesson 16
[圣思园][Java SE]Java se lesson 16[圣思园][Java SE]Java se lesson 16
[圣思园][Java SE]Java se lesson 16ArBing Xie
 
[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13ArBing Xie
 
[圣思园][Java SE]Java se lesson 12
[圣思园][Java SE]Java se lesson 12[圣思园][Java SE]Java se lesson 12
[圣思园][Java SE]Java se lesson 12ArBing Xie
 
[圣思园][Java SE]Java se lesson 11
[圣思园][Java SE]Java se lesson 11[圣思园][Java SE]Java se lesson 11
[圣思园][Java SE]Java se lesson 11ArBing Xie
 
[圣思园][Java SE]Java se lesson 9
[圣思园][Java SE]Java se lesson 9[圣思园][Java SE]Java se lesson 9
[圣思园][Java SE]Java se lesson 9ArBing Xie
 
[圣思园][Java SE]Java se lesson 8
[圣思园][Java SE]Java se lesson 8[圣思园][Java SE]Java se lesson 8
[圣思园][Java SE]Java se lesson 8ArBing Xie
 
[圣思园][Java SE]Java se lesson 5
[圣思园][Java SE]Java se lesson 5[圣思园][Java SE]Java se lesson 5
[圣思园][Java SE]Java se lesson 5ArBing Xie
 
[圣思园][Java SE]Java se lesson 4
[圣思园][Java SE]Java se lesson 4[圣思园][Java SE]Java se lesson 4
[圣思园][Java SE]Java se lesson 4ArBing Xie
 
[圣思园][Java SE]Java se lesson 2
[圣思园][Java SE]Java se lesson 2[圣思园][Java SE]Java se lesson 2
[圣思园][Java SE]Java se lesson 2ArBing Xie
 
[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1ArBing Xie
 
[圣思园][Java SE]009 java se 第九讲(面向对象之封装)
[圣思园][Java SE]009  java se 第九讲(面向对象之封装)[圣思园][Java SE]009  java se 第九讲(面向对象之封装)
[圣思园][Java SE]009 java se 第九讲(面向对象之封装)ArBing Xie
 
[圣思园][Java SE]Decorator
[圣思园][Java SE]Decorator[圣思园][Java SE]Decorator
[圣思园][Java SE]DecoratorArBing Xie
 

More from ArBing Xie (19)

[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3
 
[圣思园][Java SE]Swing
[圣思园][Java SE]Swing[圣思园][Java SE]Swing
[圣思园][Java SE]Swing
 
[圣思园][Java SE]Java se lesson 15
[圣思园][Java SE]Java se lesson 15[圣思园][Java SE]Java se lesson 15
[圣思园][Java SE]Java se lesson 15
 
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案
 
[圣思园][Java SE]Ooad与uml lesson 2
[圣思园][Java SE]Ooad与uml lesson 2[圣思园][Java SE]Ooad与uml lesson 2
[圣思园][Java SE]Ooad与uml lesson 2
 
[圣思园][Java SE]Java se lesson 20
[圣思园][Java SE]Java se lesson 20[圣思园][Java SE]Java se lesson 20
[圣思园][Java SE]Java se lesson 20
 
[圣思园][Java SE]Java se lesson 17
[圣思园][Java SE]Java se lesson 17[圣思园][Java SE]Java se lesson 17
[圣思园][Java SE]Java se lesson 17
 
[圣思园][Java SE]Java se lesson 16
[圣思园][Java SE]Java se lesson 16[圣思园][Java SE]Java se lesson 16
[圣思园][Java SE]Java se lesson 16
 
[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13
 
[圣思园][Java SE]Java se lesson 12
[圣思园][Java SE]Java se lesson 12[圣思园][Java SE]Java se lesson 12
[圣思园][Java SE]Java se lesson 12
 
[圣思园][Java SE]Java se lesson 11
[圣思园][Java SE]Java se lesson 11[圣思园][Java SE]Java se lesson 11
[圣思园][Java SE]Java se lesson 11
 
[圣思园][Java SE]Java se lesson 9
[圣思园][Java SE]Java se lesson 9[圣思园][Java SE]Java se lesson 9
[圣思园][Java SE]Java se lesson 9
 
[圣思园][Java SE]Java se lesson 8
[圣思园][Java SE]Java se lesson 8[圣思园][Java SE]Java se lesson 8
[圣思园][Java SE]Java se lesson 8
 
[圣思园][Java SE]Java se lesson 5
[圣思园][Java SE]Java se lesson 5[圣思园][Java SE]Java se lesson 5
[圣思园][Java SE]Java se lesson 5
 
[圣思园][Java SE]Java se lesson 4
[圣思园][Java SE]Java se lesson 4[圣思园][Java SE]Java se lesson 4
[圣思园][Java SE]Java se lesson 4
 
[圣思园][Java SE]Java se lesson 2
[圣思园][Java SE]Java se lesson 2[圣思园][Java SE]Java se lesson 2
[圣思园][Java SE]Java se lesson 2
 
[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1[圣思园][Java SE]Java se lesson 1
[圣思园][Java SE]Java se lesson 1
 
[圣思园][Java SE]009 java se 第九讲(面向对象之封装)
[圣思园][Java SE]009  java se 第九讲(面向对象之封装)[圣思园][Java SE]009  java se 第九讲(面向对象之封装)
[圣思园][Java SE]009 java se 第九讲(面向对象之封装)
 
[圣思园][Java SE]Decorator
[圣思园][Java SE]Decorator[圣思园][Java SE]Decorator
[圣思园][Java SE]Decorator
 

[圣思园][Java SE]Clone

  • 2. • 浅复制与深复制概念 – 浅复制(浅克隆):被复制对象的所有变量都 含有与原来的对象相同的值,而所有的对其他 对象的引用仍然指向原来的对象。换言之,浅 复制仅仅复制所考虑的对象,而不复制它所引 用的对象。
  • 3. • 浅复制与深复制概念 – 深复制(深克隆):被复制对象的所有变量都 含有与原来的对象相同的值,除去那些引用其 他对象的变量。那些引用其他对象的变量将指 向被复制过的新对象,而不再是原有的那些被 引用的对象。换言之,深复制把要复制的对象 所引用的对象都复制了一遍。
  • 4. • Java的clone()方法【定义在Object类中】 – clone方法将对象复制了一份并返回给调用者。 一般而言,clone()方法满足: – ①对任何的对象x,都有x.clone() !=x • 克隆对象与原对象不是同一个对象 – ②对任何的对象x,都有 x.clone().getClass()= =x.getClass() • 克隆对象与原对象的类型一样 – ③如果对象x的equals()方法定义恰当,那么 x.clone().equals(x)应该成立。
  • 5. Java中对象的克隆 – ①为了获取对象的一份拷贝,我们可以利用Object类 的clone()方法。 – ②在派生类中覆盖基类的clone()方法,并声明为 public【Object类中的clone()方法为protected的】。 – ③在派生类的clone()方法中,调用super.clone()。 – ④在派生类中实现Cloneable接口。
  • 6. • 说明: – ①为什么我们在派生类中覆盖Object的clone() 方法时,一定要调用super.clone()呢? • 在运行时刻,Object中的clone()识别出你要复制 的是哪一个对象,然后为此对象分配空间,并进行 对象的复制,将原始对象的内容一一复制到新对象 的存储空间中。 – ②继承自java.lang.Object类的clone()方法 是浅复制
  • 7. • 把对象写到流里的过程是序列化(Serilization) 过程,而把对象从流中读出来的过程则叫做反序 列化(Deserialization)过程。应当指出的是, 写在流里的是对象的一个拷贝,而原对象仍然存 在于JVM里面。
  • 8. • 在Java语言里深复制一个对象,常常可以 先使对象实现Serializable接口,然后把对 象(实际上只是对象的一个拷贝)写到一 个流里,再从流里读出来,便可以重建对 象。 • 这样做的前提是对象以及对象内部所有引 用到的对象都是可串行化的,否则,就需 要仔细考察那些不可串行化的对象可否设 成transient,从而将之排除在复制过程之 外。
  • 9. • 注意:Cloneable与Serializable都是 marker Interface,也就是说他们只是一个 标识接口,没有定义任何方法。
  • 10. • 当一个类实现了Serializable接口时,表明 该类可被序列化,这个时候Eclipse会要求 你为该类定义一个字段,该字段名字为 serialVersionUID,类型为long,提示信 息如下
  • 11. • The serializable class Student4 does not declare a static final serialVersionUID field of type long
  • 12. • 你可以随便写一个,在Eclipse中它替你生 成一个,有两种生成方式: 一个是默认的1L,比如:private static final long serialVersionUID = 1L; 一个是根据类名、接口名、成员方法及属 性等来生成一个64位的哈希字段,比如: private static final long serialVersionUID = 8940196742313994740L;之类的。
  • 13. • 当你一个类实现了Serializable接口,如果 没有定义serialVersionUID,Eclipse会提 供这个提示功能告诉你去定义之。 在Eclipse中点击类中warning的图标一下 【即那个黄色的图标】,Eclipse就会自动 给定两种生成的方式,如上面所述。如果 不想定义它,在Eclipse的设置中也可以把 它关掉的,设置如下
  • 14. • Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==> Potential programming problems 将Serializable class without serialVersionUID的warning改成ignore 即可。
  • 15. • 如果你没有考虑到兼容性问题时,就把它 关掉,不过有这个功能是好的,只要任何 类别实现了Serializable这个接口的话,如 果没有加入serialVersionUID,Eclipse都 会给你warning提示,这个 serialVersionUID为了让该类别 Serializable向后兼容。
  • 16. • 如果你的对象序列化后存到硬盘上面后, 可是后来你却更改了类的field(增加或减少 或改名),当你反序列化时,就会出现 Exception的,这样就会造成不兼容性的问 题。 • 但当serialVersionUID相同时,它就会将 不一样的field以type的缺省值Deserialize, 这个可以避开不兼容性的问题。