`

深层复制与浅层复制(通过clone的方式)

    博客分类:
  • java
阅读更多
深层复制与浅层复制
深层复制:Java对象的深层复制是指Java对象A本身被复制成新对象B,同时A的属性也是被复制成新对象,赋值到A的各个属性上去,A与B的相同属性都引用到不同的对象。
浅层复制:A与B的属性没有复制成新的属性。比如: 虽然B与A的地址不同,但是B对象的成员对象与A对象对应的成员对象是同一个对象。


事例如下:
//手机实体类
package com.softstome.clone;

import java.io.Serializable;

public class Phone implements Cloneable,Serializable{
private   String color;
private String  pinpai ; //品牌

private String[] gyss;  

public Phone(){

}

public Phone(String color, String pinpai) {
super();
this.color = color;
this.pinpai = pinpai;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getPinpai() {
return pinpai;
}
public void setPinpai(String pinpai) {
this.pinpai = pinpai;
}




public String[] getGyss() {
return gyss;
}

public void setGyss(String[] gyss) {
this.gyss = gyss;
}

@Override
protected Phone clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return (Phone)super.clone();
}

}

//学生实体类
package com.softstome.clone;

import java.io.Serializable;

/*
* 实现Serializable接口是为了通过序列化的方式实现深层复制
*
* 实现Cloneable接口是为了通过 clone的方式实现实现深层复制
* */
public class Student implements Cloneable,Serializable {
  private int stid;
  private String stname;
  private Phone phone;

public Student(){

}

public Student(int stid, String stname,Phone phone) {
super();
this.stid = stid;
this.stname = stname;
this.phone=phone;
}

public int getStid() {
return stid;
}
public void setStid(int stid) {
this.stid = stid;
}
public String getStname() {
return stname;
}
public void setStname(String stname) {
this.stname = stname;
}

public Phone getPhone() {
return phone;
}

public void setPhone(Phone phone) {
this.phone = phone;
}

//重写克隆方法  实现对象的拷贝
@Override
protected Student clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub

Student stu=(Student)super.clone();
//要实现深层赋复制 ,必须要有这一句。(去掉则变成浅层拷贝)
stu.phone=phone.clone();
return stu;
}


}

//演示类
package com.softstome.clone;

public class TestClone {



/*
* 拷贝手机对象      
* */

public void testClone1() throws CloneNotSupportedException {
Phone pn=new Phone();
String[] sz={"aa","bb"};
pn.setGyss(sz);


Phone pn1=(Phone)pn.clone();
System.out.println(pn +"   "+pn1);
System.out.println(pn.getGyss()+"   "+pn1.getGyss());

String[] sz1={"cc","dd"};
pn1.setGyss(sz1);
System.out.println(pn.getGyss()+"   "+pn1.getGyss());



}


    /*
     * 拷贝(克隆)学生对象   
     * */

public void testClone2() throws CloneNotSupportedException{

Student stu=new Student(1,"张三",new Phone("红色", "三星"));
Student stu1=(Student)stu.clone();

stu.setStname("张三1");
stu.getPhone().setColor("黑色");
System.out.println(stu.getStid()+"  "+stu.getStname()+"  " +stu.getPhone().getColor());
System.out.println(stu1.getStid()+" "+stu1.getStname()+"  "+stu1.getPhone().getColor());
System.out.println(stu+"  "+stu.getPhone());
System.out.println(stu1+"  "+stu1.getPhone());


}


public static void main(String[] args) throws CloneNotSupportedException  {
TestClone test= new  TestClone();
test.testClone1();
//test.testClone2();
}


}

分享到:
评论

相关推荐

    java_经典多线程编程

    - **实现方式**:可以通过实现`Cloneable`接口并重写`clone()`方法来实现浅层复制,而对于深层复制,可以通过序列化和反序列化来实现。 - **案例**:通过编写代码演示如何实现这两种复制方式,并比较它们的区别。 ...

    Java教程.doc

    clone方法可以制作某个对象的局域性副本,分为浅层clone和深层clone两种。 控制程序流程 Java中的控制程序流程可以通过运算符来实现。运算符可以分为算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符等...

    mongoose_clone:猫鼬中间件的克隆功能

    2. **克隆深度和引用**: 克隆操作可以是浅层的,也可以是深层的,取决于你是否希望复制嵌套对象或数组。默认情况下,`mongoose_clone` 实现的是浅克隆,只复制顶层属性。如果需要深层克隆,可能需要自定义选项。 3....

    JavaScript 克隆数组最简单的方法

    这是在处理复杂数据结构时非常重要的一个概念,特别是在涉及到深层拷贝和浅层拷贝的问题上。本文将深入探讨JavaScript中克隆数组的几种方法。 首先,最简单且常用的方法是使用`slice()`方法。`slice()`方法主要用于...

    搞定immutable.js详细说明

    在JavaScript中,我们通常会使用深拷贝(deep clone)的方式来模拟不可变数据的行为。深拷贝意味着创建一个全新的数据副本,当原始数据发生变化时,不会影响到拷贝出的数据。然而,深拷贝的性能开销很大,特别是对于...

    js代码-深度/广度优先遍历实现对象的深度拷贝

    在JavaScript中,深度拷贝是一种创建新对象的方法,该新对象与原始对象具有相同属性和值,但不共享引用。这在处理复杂的数据结构时尤其重要,因为浅拷贝只会复制对象的引用,而深度拷贝会递归地复制整个对象层次。本...

Global site tag (gtag.js) - Google Analytics