1.浅复制与深复制概念 
浅复制(浅克隆) 
    被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 
深复制(深克隆) 
    被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

浅层克隆示例(实现Cloneable接口 并复写clone()方法即可)

public class Student implements Cloneable
{
  String name;
 int age;
  Student(String name,int age)
  {
  this.name=name;
  this.age=age;
  }
 public Object clone()
  {
   Object o=null;
  try
   {
   o=(Student)super.clone();//Object 中的clone()识别出你要复制的是哪一个对象。
   }
  catch(CloneNotSupportedException e)
   {
    System.out.println(e.toString());
   }
  return o;
  
  
 public static void main(String[] args)
  {
  Student s1=new Student("zhangsan",18);
  Student s2=(Student)s1.clone();
  s2.name="lisi";
  s2.age=20;
  //修改学生2后,不影响学生1的值。
  System.out.println("name="+s1.name+","+"age="+s1.age);
  System.out.println("name="+s2.name+","+"age="+s2.age);
 }
}
实现cloneable接口深层复制的实现示例
 
class Professor implements Cloneable
{
  String name;
  int age;
  Professor(String name,int age)
  {
  this.name=name;
  this.age=age;
  }
 public Object clone()
  {
   Object o=null;
  try
   {
    o=super.clone();
   }
  catch(CloneNotSupportedException e)
   {
    System.out.println(e.toString());
   }
  return o;
  }
}
public class Student implements Cloneable
{
  String name;
  int age;
  Professor p;
  Student(String name,int age,Professor p)
  {
  this.name=name;
  this.age=age;
  this.p=p;
  }
 public Object clone()
  {
   Student o=null;
  try
   {
    o=(Student)super.clone();
   }
  catch(CloneNotSupportedException e)
   {
    System.out.println(e.toString());
   }
   //对引用的对象也进行复制
   o.p=(Professor)p.clone();
  return o;
  
 public static void main(String[] args)
  {
  Professor p=new Professor("wangwu",50);
  Student s1=new Student("zhangsan",18,p);
  Student s2=(Student)s1.clone();
  s2.p.name="lisi";
  s2.p.age=30;
  //学生1的教授不 改变。
  System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
  System.out.println("name="+s2.p.name+","+"age="+s2.p.age);
 }
}
 
利用串行化来做深复制(复制的对象实现Serializable接口)
class Teacher implements Serializable{
  String name;
  int age;
  public void Teacher(String name,int age){
  this.name=name;
  this.age=age;
  }
}
public class Student implements Serializable{
 String name;//常量对象
 int age;
 Teacher t;//学生1和学生2的引用值都是一样的。
 public void Student(String name,int age,Teacher t){
  this.name=name;
  this.age=age;
  this.p=p;
 }
 public Object deepClone() throws IOException,
    OptionalDataException,ClassNotFoundException{//将对象写到流里
  ByteArrayOutoutStream bo=new ByteArrayOutputStream();
  ObjectOutputStream oo=new ObjectOutputStream(bo);
  oo.writeObject(this);//从流里读出来
  ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
  ObjectInputStream oi=new ObjectInputStream(bi);
  return(oi.readObject());
 }
 public static void main(String[] args){
  Teacher t=new Teacher("tangliang",30);
  Student s1=new Student("zhangsan",18,t);
  Student s2=(Student)s1.deepClone();
  s2.t.name="tony";
  s2.t.age=40;
  //学生1的老师不改变
  System.out.println("name="+s1.t.name+","+"age="+s1.t.age);
 }
}

java中浅层克隆和深层克隆的更多相关文章

  1. java中传值及引伸深度克隆的思考(说白了Java只能传递对象指针)

    java中传值及引伸深度克隆的思考 大家都知道java中没有指针.难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! java中内存的分配方式有两种,一种是在堆中分配, ...

  2. JAVA中浅复制与深复制 - coolmist - ITeye技术网站

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  3. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  4. Java中Action层、Service层、Modle层和Dao层的功能区分

    一.Java中Action层.Service层.Modle层和Dao层的功能区分: 首先,这是现在最基本的分层方式,结合了SSH架构. modle层就是对应的数据库表的实体类.(即domain) Da ...

  5. java数组对象的浅层复制与深层复制

    实际上,java中数组对象的浅层复制只是复制了对象的引用(参考),而深层复制的才是对象所代表的值.

  6. JAVA中浅复制与深复制

    1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复 ...

  7. [转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

    首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...

  8. JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

    Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操作,在这里可以编写自己需要的代码(比如简单的判断).Action层:引用对应的Servi ...

  9. java中dao层和service层的区别是什么?

    首先解释面上意思,service是业务层,dao是数据访问层.呵呵,这个问题我曾经也有过,记得以前刚学编程的时候,都是在service里直接调用dao,service里面就new一个dao类对象,调用 ...

随机推荐

  1. Android之layout_weight属性详解

    博文:http://www.cnblogs.com/net168/p/4227144.html讲分非常好,推荐下

  2. Yii -- framework 目录结构说明

    base 底层的类库文件 caching 所有缓存方法 cli 项目生成脚本 collecions 用PHP语言构造传统OO语言的数据存储单元.如队列,栈,哈希等等 console yii控制台 db ...

  3. ADXL345加速度传感器驱动

    ADXL345 是 ADI 公司的一款 3 轴.数字输出的加速度传感器.ADXL345 是 ADI 公司推 出的基于 iMEMS 技术的 3 轴.数字输出加速度传感器.该加速度传感器的特点有:    ...

  4. ps--记录几个方法步骤

    1.图片文字去掉 1.1 矩形工具-->吸管-->alt+delete 1.2 钢笔工具-->Ctrl+回车(变换选区)-->吸管-->alt+delete 2.图层锁不 ...

  5. 一个异步任务接收两个url下载两个图片

    有两个url,一个是下载用户头像的url,一个是下载用户上传图片的url,想要用一个异步任务同时下载这两个图片. 程序的下载任务是这么执行的,先接受url参数,然后调用 imgUrls = infoP ...

  6. vmwvare 网卡设置讲解

  7. 建立、配置和使用Activity——启动其他Activity并返回结果

    Activity还提供了一个startActivityForResult(Intent intent,int requestCode)方法来启动其他Activity.该方法用于启动指定Activity ...

  8. cvc-complex-type.2.4.c: The matching wildcard...

    在家里的电脑好好的,在单位的就不行,需要把web app libraties提到 最前面,然后clean一下项目

  9. quick-cocos2d-x添加到Pomelo的支持

    https://github.com/luoxinliang/pomelo_quick_x/tree/master/pomelo_quick_x

  10. Runtime of Objective-C

    [0] Outline --  [1] 版本和平台 --  [2] 与Runtime System交互 --  [3] 方法的动态决议 --  [4] 消息转发 --  [5] 类型编码 --  [6 ...