`
zhaole609
  • 浏览: 342831 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

关于java中的深copy与浅copy的问题

阅读更多
前几天老师让同学们讲一讲设计模式中的原型模式,主要是涉及到了java中的深copy与浅copy的问题.很多同学都没搞清楚,所以今天我做了一个总结:
首先写一个daugter类,在下面作为Teacher的一个对象:
package com.zhaole;

import java.io.Serializable;

public class Daugter implements Serializable{
	public String name="asdf";

}

 

然后写个Teacher类,分别实现Serializable,Cloneable接口。

 

package com.zhaole;

import java.io.Serializable;

public class Teacher implements Serializable,Cloneable {
	public String name="lele";
	Daugter da=new Daugter();
	@Override
	public Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}

}

 

写一个测试类: 

package com.zhaole;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Test {
	Teacher t=new Teacher();
	public static Teacher copy(Teacher t){
		 Teacher ob=null;
			try {
				
				ByteArrayOutputStream baos=new ByteArrayOutputStream();
				ObjectOutputStream	oos=new ObjectOutputStream(baos);
				oos.writeObject(t);
				oos.flush();
				oos.close();
				ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray());
				ObjectInputStream ois=new ObjectInputStream(bais);
				ob=(Teacher)ois.readObject();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		 return ob;
		
	}
 
	public static void main(String[] args){
		Test s=new Test();
		Teacher t=new Teacher();
		System.out.println("<<<<<<<<<<<<<<<<<浅copy>>>>>>>>>>>>>>>");
		try {
			Teacher b=(Teacher)t.clone();
			if(b!=t){
				System.out.println("不是同一个对象");
				if(b.da==t.da){
					System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>");
					System.out.println("是同一个对象");
				}else{
					System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>");
					System.out.println("不是同一个对象");
				}
			}else{
				System.out.println("是同一个对象");
				if(b.da==t.da){
					System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>");
					System.out.println("是同一个对象");
				}else{
					System.out.println("<<<<<<<<<<<<<<下一层>>>>>>>>>>>");
					System.out.println("不是同一个对象");
				}
			}
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("<<<<<<<<<<<<深copy>>>>>>>>>>>>>>>>");
		if(t==Test.copy(t)){
			System.out.println("是同一个对象");
			if(t.da==Test.copy(t).da){
				System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>");
				System.out.println("是同一个对象");
			}
			else{
				System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>");
				System.out.println("不是同一个对象");
			}
			
		}
		else{
			System.out.println("不是同一个对象了");
			if(t.da==Test.copy(t).da){
				System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>");
				System.out.println("是同一个对象");
			}else{
				System.out.println("<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>");
				System.out.println("不是同一个对象");
			}
		}
	}

}

测试结果: 

<<<<<<<<<<<<<<<<<浅copy>>>>>>>>>>>>>>>
不是同一个对象
<<<<<<<<<<<<<<下一层>>>>>>>>>>>
是同一个对象
<<<<<<<<<<<<深copy>>>>>>>>>>>>>>>>
不是同一个对象了
<<<<<<<<<<<下一层 了>>>>>>>>>>>>>>>
不是同一个对象

 总结:

从上面的结果可以明显得出这样一个结论,java中的浅copy,也就是用clone方法实现的,只是复制了个当前实例,但是对实例中的各个对象并没有实现复制,只是获得了对该实例中的对象的引用。而深复制不仅仅实现了对当前实例的复制,并且还把实例中的所有对象都逐一进行复制。

0
5
分享到:
评论
1 楼 Technoboy 2011-05-10  
http://technoboy.iteye.com/blog/1032533

相关推荐

    java的深复制与浅复制

    ### Java的深复制与浅复制 #### 一、概述 在Java编程中,对象的复制是一个常见的需求。复制对象的目的通常是为了保留一个备份或者创建一个新的实例来避免对原始对象的修改影响到其他部分的程序逻辑。Java提供了两...

    android 浅复制和深复制-Java Generic Deep Copy 篇

    本文将深入探讨Java中的浅复制和深复制,并以Android为背景,结合具体的实例讲解如何实现Java泛型深拷贝。 首先,我们要理解浅复制和深复制的概念。浅复制(Shallow Copy)是指创建一个新的对象,然后将原对象引用...

    java List 深度复制方法

    在Java中,当我们使用`clone()`方法或`System.arraycopy()`进行复制时,通常得到的是浅复制的结果。这意味着原始对象和复制对象中的引用指向内存中的同一块区域。如果List中的元素是基本类型,这种复制方式是没问题...

    Java实现的类似copy命令

    用Java实现的copy命令,类似windows命令行的copy命令,能够给复制任何类型文件

    Java copy对象的工具类

    Java CopyUtil工具类,可以进行对象的深copy,比如:对象里面包含对象,对象里面包含Map,List,Set...等复杂类型的属性都可以copy,copy后的对象与原有对象没有联系,即改变原有对象内容,不会改变copy后的对象里面的...

    java 深克隆与浅克隆

    Java 深克隆与浅克隆 Java 中的克隆机制可以让我们方便地制造出一个对象的副本来,但是在克隆过程中需要注意浅克隆和深克隆的区别。 浅克隆(Shallow Clone)是指对对象的域进行简单的 copy,对象的reference变量...

    java执行文件COPY

    java执行文件COPY java执行文件COPY java执行文件COPY

    java深复制浅复制的实现源代码

    本篇文章将深入探讨Java中的深复制和浅复制概念,并通过源代码示例进行详细解析。 首先,我们理解一下深复制和浅复制的区别: 1. **浅复制(Shallow Copy)**:浅复制只是复制了对象的引用,而不是对象本身。这...

    Java深复制与浅复制&Clone

    - 当对象中包含循环引用(即对象A引用对象B,而对象B又引用对象A)时,深复制可能会遇到问题,因为它会陷入无限循环。 - 序列化方法虽然简单,但效率较低,且不适合包含敏感数据的类,因为序列化可能会暴露这些数据...

    Java深复制与浅复制.doc

    在Java编程中,复制对象是常见的操作,主要分为两种方式:浅复制(Shallow Copy)和深复制(Deep Copy)。这两种复制方式的区别在于处理对象内部引用其他对象的情况。 1. **浅复制(浅克隆)**: 浅复制是指创建一...

    java_copy.rar_ java_copy

    标题中的"java_copy.rar_ java_copy"提示我们这是一个与Java编程相关的学习资源,可能是学生代码示例或练习项目。描述中的"this is a student code"进一步证实了这一点,表明这是一份学生编写的Java代码。 在Java...

    java与zero-copy

    零拷贝技术与Java实现的原理讲解: 零拷贝(Zero-Copy)是一种提升系统性能的技术,它能够减少甚至避免数据在操作系统内核地址空间和用户地址空间之间的复制。在传统的I/O操作中,数据需要从文件系统读入缓冲区,再...

    java开源项目(2)Java File Copy Library

    10. **兼容性与移植性**:作为Java库,Java File Copy Library具有良好的跨平台特性,可以在任何支持Java的系统上运行,包括Windows、Linux、Mac OS等。 通过以上讨论,我们可以看出Java File Copy Library是一个...

    Java文件操作一例:Copy 复制文件.rar

    Java文件操作一例:Copy 复制文件,虽然是复制文件,不过通过本源码你可以学习很多相关的Java基础技巧,比如Java对文件的事件处理、取得目录内容的事件处理、如何弹出文件选择器、如何得到选择文件的绝对路径、如何...

    Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍

    在Java编程语言中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方式,它们涉及到内存中数据的复制和引用的处理。理解这两种拷贝方式对于开发过程中正确管理和操作对象至关重要。 浅拷贝,又...

    Java 浅拷贝性能比较完整源码

    在Java编程中,对象的复制是一个常见的操作,主要分为浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。本篇文章将详细讲解Java中的浅拷贝,并通过一个完整的源码示例进行性能比较。 浅拷贝是创建一个新的对象,然后...

    java-fileCopy.zip_JavaFiles.copy_java_java File 复制_java copyfiel

    本资源"java-fileCopy.zip_JavaFiles.copy_java_java File 复制_java copyfiel"提供了一个关于如何使用Java语言实现文件及目录复制功能的示例。下面将详细解释相关知识点。 1. **Java File类**: Java中的`File`...

    48-FastCopy复制更快

    4. **详尽的日志**:FastCopy提供详细的操作日志,记录每个文件的复制状态,帮助用户了解复制过程中的问题和成功情况。 5. **易用性**:虽然FastCopy拥有强大的性能,但其界面设计简洁,用户可以轻松上手。同时,它...

    文件copy 目录copy

    在IT行业中,文件复制(File Copy)和目录复制(Directory Copy)是日常操作的重要组成部分,无论是数据备份、软件部署还是系统迁移,都离不开这两个基本功能。下面将详细讲解这两个概念及其相关知识点。 文件复制...

Global site tag (gtag.js) - Google Analytics