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. php 三大特点:封装,继承,多态

    一.封装 目的:让类更安全 做法:成员变量变为私有的,通过方法间接操作成员变量,在方法里面加限制条件 二.继承 概念:子类可以继承父类的一切 方法重写:在子类里面对父类进行方法重写 特点:单继承:一个 ...

  2. leetcode day4

    [171]Excel Sheet Column Number Given a column title as appear in an Excel sheet, return its correspo ...

  3. JavaScript高级程序设计-8:BOM

    1. 什么是BOM? BOM(Browser Object Mode) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的.可以与浏览器窗口进行互动的对象 ...

  4. js 匿名函数 json

    <script type="text/javascript"> var My_func = function(name){   this.obj_name=name; ...

  5. sql语句:CASE WHEN END 的用法

    select b,c, CASE a ' ' ' end from test1

  6. UVa 11456 - Trainsorting

    题目大意:给一个车辆到达车站的序列(按时间先后),可以对车辆进行以下处理:插在队首.插在队尾或者拒绝进站.车站内的车辆必须按照重量大小从大到小排列,问车站内最多能有多少辆车辆? 假设车i是第一个进站, ...

  7. 用python实现模拟登录人人网

    用python实现模拟登录人人网 字数4068 阅读1762 评论19 喜欢46 我决定从头说起.懂的人可以快速略过前面理论看最后几张图. web基础知识 从OSI参考模型(从低到高:物理层,数据链路 ...

  8. ID3算法(Java实现)

    数据存储文件:buycomputer.properties #数据个数 datanum=14 #属性及属性值 nodeAndAttribute=年龄:青/中/老,收入:高/中/低,学生:是/否,信誉: ...

  9. 启动子&外显子&内含子

    启动子 http://baike.baidu.com/link?url=HMqaMY4mXusH--4hMu1p6P_XUzEve9lZhFGtxScnbb8Z9HaLYJ981eWxAuZt2iAP ...

  10. 使用布局(Layout资源)

    实际上从我们学习第一个Android应用开始,已经开始接触Android的Layout资源了,因此此处不会详细介绍Android Layout资源的知识,会对Layout资源进行简单的归纳. Layo ...