`

深层复制与浅层复制(通过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深复制与浅复制&Clone

    本文将深入探讨这两种复制方式,并通过实例来解释它们的工作原理。 **浅复制(Shallow Copy)** 浅复制是创建一个新对象,这个新对象的属性值是原始对象属性值的一个拷贝。如果对象的属性是基本类型,那么它们会被...

    31.3、深复制和浅复制clone1

    在编程领域,尤其是在Java语言中,深复制和浅复制是两个重要的概念,它们与对象的复制行为密切相关。这里我们将深入探讨这两个概念,并通过实例来解释它们的区别。 首先,让我们了解基本数据类型的复制。在Java中,...

    CloneDog--微狗硬复制工具

    "CloneDog--微狗硬复制工具"是一款专为IT专业人士设计的软件,主要用于处理和管理特定类型的硬件保护设备,通常称为“加密狗”。加密狗是一种硬件设备,它用于存储软件的授权信息,防止非法复制和使用受版权保护的...

    java Clone

    Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....

    java_clone用法

    在Java中,`clone`方法提供了一种快速复制对象的方式。它属于`Object`类的一部分,但需要显式地在子类中声明并实现`Cloneable`接口才能正常使用。本文将详细介绍`clone`的基本概念、工作原理以及如何实现浅拷贝和深...

    C#中Clone一个对象的值到另一个对象案例 c#经典案例.pdf

    浅复制是 Clone 方法的默认实现,它只是复制对象的引用,而不复制对象的值。例如,下面的代码: ```csharp public class A : ICloneable { public int i; public string str; public object Clone() { return ...

    clone()示例源码

    在描述中提到的博客链接(由于无法直接访问,以下内容基于通常的`clone()`使用方式解释)可能会详细阐述如何在自定义类中重写`clone()`方法以实现更灵活的复制行为。通常,为了能够正确地克隆一个对象,你需要确保类...

    深入理解JavaScript中的对象复制(Object Clone)

    在深入探讨JavaScript中的对象复制(Object Clone)时,首先需要明确JavaScript中的对象复制分为浅复制(Shallow Copy)和深复制(Deep Copy)。浅复制指的是创建一个新对象,这个对象有着原始对象属性值的一份精确...

    Java Clone(类的复制)实例代码

    在Java编程语言中,`Clone`机制是一种对象复制的方式,允许创建一个现有对象的副本。在Java中,对象的默认复制是浅复制(shallow copy),这意味着只复制对象本身,而不复制它引用的对象。要实现深复制(deep copy)...

    深复制,浅复制区别c#代码

    通过对C#中的浅复制和深复制的探讨,我们可以看出这两种复制方式的选择取决于具体的应用场景。浅复制适用于那些不需要成员完全独立的情况,而深复制则用于确保复制后的对象与原对象完全独立,不会受到原对象状态变化...

    java clone的小例子

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...

    Java中的数组复制(clone与arraycopy)代码详解

    Java中的数组复制(clone与arraycopy)代码详解 Java中的数组复制是通过clone和arraycopy两个方法来实现的。clone方法是Object类的protected方法,用于创建对象的副本,而arraycopy是System类的静态方法,用于将一...

    Clone详解.doc

    Java中的克隆(Clone)机制是一种创建对象副本的方法,它允许程序员复制一个对象的状态,而不会影响原始对象。克隆在编程中常用于创建对象的独立副本,使得新副本与原对象之间相互独立,对其中一个对象的修改不会...

    java不同对象及集合的多次复制

    总的来说,Java中的对象复制可以通过多种方式实现,包括基本的复制方法和利用各种工具库,特别是通过注解可以实现更加灵活和定制化的复制策略。对于模型和视图对象的复制,这可以大大提高开发效率,减少错误,并使...

    USB加密狗复制小工具

    USB加密狗复制小工具USB加密狗复制USB加密狗复制USB加密狗复制

    比nero更完美的刻录CD软件---CLONE_CD

    CLONE_CD是一款专业的CD复制软件,它在刻录领域中被誉为比Nero更为出色的选择,尤其是在数据保护和精确复制方面。这款软件的核心功能是提供无损的CD映像克隆,确保源盘与目标盘的一致性,尤其适用于备份音乐CD、游戏...

    Java深浅clone

    在Java编程语言中,`Cloneable`接口和`clone()`方法是两个重要的概念,它们用于对象复制。在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让...

    java clone

    在Java中,`clone`方法主要用于创建一个现有对象的副本,这个副本与原始对象具有相同的数据值。这个方法是Object类的一个成员,因此所有的Java类都默认拥有`clone`方法。不过,需要注意的是,`clone`方法并不执行深...

    深化理解JavaScript中的对象复制(Object Clone)_.docx

    这可以通过递归复制每个属性来实现,确保所有层级都被复制。在JavaScript中,有多种实现深复制的方法: 1. **jQuery的`$.extend()`方法**:在jQuery库可用的情况下,可以使用`$.extend()`进行深复制,但请注意,它...

Global site tag (gtag.js) - Google Analytics