Java中的深拷贝和浅拷贝 原型模式

1: Java中浅拷贝和深拷贝的定义:

     浅拷贝:就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象。

     深拷贝:就是两个对象的值相等,但是互相独立。

(深拷贝才是真正的拷贝,浅拷贝只是将引用指向了同一份对象)

2:Java中几种常见的拷贝操作:

(1)“=”操作:也就是赋值操作;

(2)拷贝构造函数:拷贝构造函数就是构造函数的参数的类型是该构造函数所在的类,即参数就是该类的一个对象。

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> public Clock(Clock clock){
     this.hour=clock.hour;
     this.min=clock.min;
     this.second=clock.second;
    }</span></span></span>

(3)  clone()方法:类实现 Cloneable接口,只是一个标记。

3:几种操作比较

  = 拷贝构造函数 clone方法
预定义非集合类型

(int ,Integer,String)

1.深拷贝 2.如果支持拷贝构造函数的类型,则是深拷贝 3.不支持
自定义类型

(自定义的一个类)

4.浅拷贝(一个改变,另外一个跟着改变) 5.取决于实现()

深拷贝

6.  深拷贝
预定义集合类型 7.浅拷贝 8.会逐个调用每个元素的operator=方法

如果add元素是预定义数据类型,则为深拷贝 ;

如果add元素是自定义数据类型,则为浅 拷贝 ;

9.会逐个调用每个元素的operator=方法

如果add元素是预定义数据类型,则为深拷贝 ;

如果add元素是自定义数据类型,则为浅 拷贝

4:如果一个类实现了clone()方法,并且该类中的成员变量既有基本数据类型(String,int);又有自定义类型的时候,则基本数据类型clone()的是深拷贝,自定义数据类型的是浅拷贝。

<span style="font-size:18px;"><span style="font-size:18px;">package shiyeqiang.resume;

public class ResumeDemo {

 public static void main(String[] args) throws Exception {
		Resume resumeA = new Resume("name A");
		resumeA.setAge(10);
        resumeA.setWorkExperience(1, "百度");
		Resume resumeB = (Resume) resumeA.clone();
		resumeB.setName("name B");
		resumeB.setAge(20);
		resumeB.setWorkExperience(2, "腾讯");
		System.out.println(resumeA);
		System.out.println(resumeB);

	}

}

// 工作经历类
class WorkExperience {

	private int workLong = 0;
	private String company = null;

	public WorkExperience() {

	}

	public int getWorkLong() {
		return workLong;
	}

	public void setWorkLong(int workLong) {
		this.workLong = workLong;
	}

	public String getCompany() {
		return company;
	}

	public void setCompany(String company) {
		this.company = company;
	}

}

// 简历类中包括工作经历类以及其他基本数据类型成员
class Resume implements Cloneable {

	private String name = null;
	private int age = 0;
	private WorkExperience workExperience = new WorkExperience();

	public void setWorkExperience(int workLong, String company) {
		this.workExperience.setWorkLong(workLong); // 设置工作时间
		this.workExperience.setCompany(company); // 设置公司
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Resume(String name) {
		this.name = name;
	}

	public String toString() {
		return "姓名=" + this.name + ",  年龄=" + this.age + ", 工作经历:工作年限="
				+ this.workExperience.getWorkLong() + ", 公司名称="
				+ this.workExperience.getCompany();
	}

	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}
</span></span>

结果显示:

姓名=name A,  年龄=10,工作经历:工作年限=2,
公司名称=腾讯(浅拷贝)

姓名=name B,  年龄=20, 工作经历:工作年限=2, 公司名称=腾讯(浅拷贝)

5:那么一个类要想实现深拷贝应该怎么办呢?

让简历类Resume中引用成员 工作经历WorkExperience类也实现Cloneable接口,并写重写clone()方法;

修改Resume类中的clone方法,在其中必须调用WorkExperience的clone()方法;
 

其实说白了,深拷贝,深拷贝啊,也就是一层一层的拷贝,千万别直接用super.clone()方法偷懒哦!

<span style="font-size:18px;"><span style="font-size:18px;">package shiyeqiang.resume;

public class ResumeDemo {

 public static void main(String[] args) throws Exception {
		Resume resumeA = new Resume("name A");
		resumeA.setAge(10);
        resumeA.setWorkExperience(1, "百度");
		Resume resumeB = (Resume) resumeA.clone();
		resumeB.setName("name B");
		resumeB.setAge(20);
		resumeB.setWorkExperience(2, "腾讯");
		System.out.println(resumeA);
		System.out.println(resumeB);

	}

}

// 工作经历类
class WorkExperience implements Cloneable{

	private int workLong = 0;
	private String company = null;

	public WorkExperience() {

	}

	public int getWorkLong() {
		return workLong;
	}

	public void setWorkLong(int workLong) {
		this.workLong = workLong;
	}

	public String getCompany() {
		return company;
	}

	public void setCompany(String company) {
		this.company = company;
	}
    public Object clone() throws CloneNotSupportedException{
    	return super.clone();
    }

}

// 简历类中包括工作经历类以及其他基本数据类型成员
class Resume implements Cloneable {

	private String name = null;
	private int age = 0;
	private WorkExperience workExperience = null;

	public void setWorkExperience(int workLong, String company) {
		this.workExperience.setWorkLong(workLong); // 设置工作时间
		this.workExperience.setCompany(company); // 设置公司
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Resume(String name) {
		this.name = name;
		this.workExperience=new WorkExperience();
	}

	<span style="color:#ff0000;">private Resume(WorkExperience workExperience) throws CloneNotSupportedException{
		this.workExperience=(WorkExperience) workExperience.clone();
	}</span>

	public String toString() {
		return "姓名=" + this.name + ",  年龄=" + this.age + ", 工作经历:工作年限="
				+ this.workExperience.getWorkLong() + ", 公司名称="
				+ this.workExperience.getCompany();
	}

	<span style="color:#ff0000;">public Object clone() throws CloneNotSupportedException {
	Resume obj=new Resume(this.workExperience); //调用私有构造函数中的</span><span style="color: rgb(255, 0, 0); background-color: inherit; font-family: Arial; ">workExperience</span><span style="color:#ff0000;">克隆方法
		obj.age=this.age;
		obj.name=name;
		return obj;
	}</span>
}
</span></span>

姓名=name A,  年龄=10, 工作经历:工作年限=1, 公司名称=百度

姓名=name B,  年龄=20, 工作经历:工作年限=2, 公司名称=腾讯

Java中的深拷贝和浅拷贝 原型模式

时间: 2025-01-19 20:34:39

Java中的深拷贝和浅拷贝 原型模式的相关文章

浅谈Java中的深拷贝和浅拷贝

浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: [java] view plaincopyprint? int apples = 5; int pears = apples; int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float

Java中的深拷贝和浅拷贝

1.浅拷贝与深拷贝概念 (1)浅拷贝(浅克隆) 浅拷贝又叫浅复制,将对象中的所有字段复制到新的对象(副本)中.其中,值类型字段(java中8中原始类型)的值被复制到副本中后,在副本中的修改不会影响到源对象对应的值.而引用类型的字段被复制到副本中的还是引用类型的引用,而不是引用的对象,在副本中对引用类型的字段值做修改会影响到源对象本身. 浅拷贝简单归纳就是只复制一个对象,对象内部存在指向其他对象,数组或引用则不复制. (2)深拷贝(深克隆) 将对象中的所有字段复制到新的对象中.不过,无论是对象的值

详解Java中的clone方法:原型模式

Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有几种方式可以创建对象呢? 1 使用new操作符创建一个对象2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存之

java中的深拷贝与浅拷贝

Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有几种方式可以创建对象呢? 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存

Java中的深拷贝和浅拷贝(转载)

深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复制)和浅拷贝(浅复制),我们还是要给予足够的重视,因为有时这两个概念往往会给我们带来不小的困惑. 浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象.深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象.举例来说更加清楚:对象A1中包含对B1的引用

[clone]Java中的深拷贝和浅拷贝 实例解析

我们平时在开发中经常用到clone这个Object类的方法,但是super.clone()方法所返回的拷贝是浅拷贝,(所谓浅拷贝和深拷贝是相对的,浅拷贝中的内部对象与原始对象的内部对象是共享的,是同一个:而深拷贝中的内部对象也是不同的.),有些情况下,我们需要得到对象的深拷贝,如下面的情况 package day0815; import java.io.File; import java.util.Stack; import org.junit.Test; public class BaseTr

浅谈Java中的深拷贝和浅拷贝(转载)

假如说你想复制一个简单变量.很简单: [java] view plaincopy int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况. 但是如果你复制的是一个对象,情况就有些复杂了. 假设说我是一个beginner,我会这样写: [java] view plaincopy class Student { private int nu

**Python中的深拷贝和浅拷贝详解

Python中的深拷贝和浅拷贝详解 这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容. 要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, 3.14, 'Hello', [1,2,3,4],{'a':1}...... 甚至连type其本身都是对象,type对象 Python中变量与C/

python中的深拷贝和浅拷贝

1.深拷贝VS浅拷贝 python中的深拷贝和浅拷贝和java里面的概念是一样的, 所谓浅拷贝就是对引用的拷贝 (里面的数据不拷贝出来,其中的数据与原对象里面数据用的是相同的地址空间) 所谓深拷贝就是对对象的资源的拷贝 (里面的数据拷贝出来.深拷贝有自己的存储空间,有自己定义的数据,跟原对象一点关系也没有) 2.对赋值的认识: 赋值:将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ) 修改不可变对象(str.tuple)需要开辟新的空间 修改可变对象(list等)不需要开辟新的空