- 浏览: 470031 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (135)
- javascript (43)
- struts (3)
- webWork (0)
- hibernate (2)
- EJB (0)
- Spring (2)
- XML (2)
- Oracle (4)
- Mysql (0)
- C (0)
- C++ (0)
- 网络 (0)
- linux (4)
- java (28)
- 设计模式 (0)
- java 代理模式 (2)
- jsp&Servlet (2)
- Tomcat (5)
- 算法设计 (2)
- 操作技巧 (1)
- HTML (5)
- Ajax (2)
- JScript Deviations from ES3 (14)
- Eclipse (1)
- log4J (2)
- ant (1)
- HTTP (4)
- project (1)
- SqlServer (4)
- 数据仓库 (0)
最新评论
-
u012526168:
header的域名是大小写敏感的.http://stackov ...
HTTP 请求报头详解 -
junes_yu:
这样的方法有问题哦正确方法如下:document.onkeyd ...
javascript 屏蔽F5,BackSpace,IE的刷新,右键功能 -
xunke515:
第二个,如果要带顺序的话,new个treeset也可以吧.
两种方法删除ArrayList里重复元素 -
bangyulin:
java 潜拷贝和深拷贝 -
hecongqi:
谢谢,写得很好,学到知识了
浅谈Java代理机制
.java里的clone分为:
A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。
Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点
1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。
2.在派生类的clone()方法中,调用super.clone()。
3.在派生类中实现Cloneable接口。
Object类里的clone方法是浅复制(浅克隆)
浅复制(浅克隆)的例子如下:
2.深复制(深Clone)例子:
3.利用序列化来做深复制,把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization)过程。应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。,利用这个特性,可以做深拷贝
A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。
Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点
1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。
2.在派生类的clone()方法中,调用super.clone()。
3.在派生类中实现Cloneable接口。
Object类里的clone方法是浅复制(浅克隆)
浅复制(浅克隆)的例子如下:
package com.test; //浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 //深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。 // //Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点 //1.在派生类中覆盖基类的clone()方法,并声明为public【Object类中的clone()方法为protected的】。 //2.在派生类的clone()方法中,调用super.clone()。 //3.在派生类中实现Cloneable接口。 //<SPAN style="COLOR: red">Object类里的clone方法是浅复制(浅克隆)</SPAN>public class CloneTest { public static void main(String[] args) throws Exception{ //teacher对象将被clone出来的Student对象共享. Teacher teacher = new Teacher(); teacher.setAge(40); teacher.setName("Teacher zhang"); Student student1 = new Student(); student1.setAge(20); student1.setName("zhangsan"); student1.setTeacher(teacher); //复制出来一个对象student2 Student student2 = (Student)student1.clone(); System.out.println(student2.getAge()); System.out.println(student2.getName()); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); //修改student2的引用对象 student2.getTeacher().setAge(50); student2.getTeacher().setName("Teacher Li"); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); } } class Teacher { public int age; public String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } class Student implements Cloneable{ public int age ; public String name; public Teacher teacher; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } 输出结果为: 20 zhangsan ~~~~~~~~~~~~~~~~~~~~~~ 40 Teacher zhang ~~~~~~~~~~~~~~~~~~~~~~ 50 Teacher Li
2.深复制(深Clone)例子:
package com.test1; //深clone public class DeepCloneTest { public static void main(String[] args) throws Exception{ //teacher对象将不被clone出来的Student对象共享. Teacher teacher = new Teacher(); teacher.setAge(40); teacher.setName("Teacher zhang"); Student student1 = new Student(); student1.setAge(20); student1.setName("zhangsan"); student1.setTeacher(teacher); //复制出来一个对象student2 Student student2 = (Student)student1.clone(); System.out.println(student2.getAge()); System.out.println(student2.getName()); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); //修改student2的引用对象 student2.getTeacher().setAge(50); student2.getTeacher().setName("Teacher Li"); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); } } class Teacher implements Cloneable{ public int age; public String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } class Student implements Cloneable{ public int age ; public String name; public Teacher teacher; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @Override public Object clone() throws CloneNotSupportedException { Student student = (Student)super.clone(); //将引用的对象teacher也clone下 student.setTeacher((Teacher)(student.getTeacher().clone())); return student; } } 输出结果为: 20 zhangsan ~~~~~~~~~~~~~~~~~~~~~~ 40 Teacher zhang ~~~~~~~~~~~~~~~~~~~~~~ 40 Teacher zhang
3.利用序列化来做深复制,把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization)过程。应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。,利用这个特性,可以做深拷贝
package com.test3; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; //利用序列化来做深复制 //深clone public class DeepCloneTest { public static void main(String[] args) throws Exception{ //teacher对象将不被clone出来的Student对象共享. Teacher teacher = new Teacher(); teacher.setAge(40); teacher.setName("Teacher zhang"); Student student1 = new Student(); student1.setAge(20); student1.setName("zhangsan"); student1.setTeacher(teacher); //复制出来一个对象student2 Student student2 = (Student)student1.deepCopy(); System.out.println(student2.getAge()); System.out.println(student2.getName()); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); //修改student2的引用对象 student2.getTeacher().setAge(50); student2.getTeacher().setName("Teacher Li"); System.out.println("~~~~~~~~~~~~~~~~~~~~~~"); System.out.println(student1.getTeacher().getAge()); System.out.println(student1.getTeacher().getName()); } } class Teacher implements Serializable{ private static final long serialVersionUID = -8834559347461591191L; public int age; public String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } class Student implements Serializable{ //serialVersionUID 如果你的对象序列化后存到硬盘上面后,可是后来你却更改了类的field(增加或减少或改名),当你反序列化时,就会出现Exception的,这样就会造成不兼容性的问题。 //但当serialVersionUID相同时,它就会将不一样的field以type的缺省值赋值(如int型的是0,String型的是null等),这个可以避开不兼容性的问题。所以最好给serialVersionUID赋值 private static final long serialVersionUID = 7991552226614088458L; public int age ; public String name; public Teacher teacher; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public Object deepCopy() throws Exception{ //将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); //将流序列化成对象 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); } } 输出结果为: 20 zhangsan ~~~~~~~~~~~~~~~~~~~~~~ 40 Teacher zhang ~~~~~~~~~~~~~~~~~~~~~~ 40 Teacher zhang
发表评论
-
Java 生成可执行exe
2011-01-06 09:18 2652第一步:完成Java GUI程序 在Eclipse下, ... -
java bean copy 反射实现代码
2008-10-20 17:09 2261import java.lang.reflect.*; ... -
ISO 8859 语言字符集详解
2008-10-07 14:14 2938ISO/IEC 8859-1,又称Latin-1 ... -
Unsupported major.minor version
2008-07-22 13:40 2532当你在编译Java时,遇到Unsupported major. ... -
两种方法删除ArrayList里重复元素
2008-07-10 16:00 172191.方法一: /** List order not mai ... -
java compileClassLoader
2008-07-01 21:15 1001import java.io.*; /* A Co ... -
java runtime.exec() 的讲解(转贴)
2008-07-01 20:59 14047那就首先说点Runtime类吧,他是一个与JVM运行时环境有关 ... -
JDK5.0以上版本的特殊用途(转贴)
2008-07-01 16:29 1425jinfo:可以输出并修改运 ... -
提高java程序性能 (转贴)
2008-07-01 16:00 1468下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAV ... -
Java 中生成数字证书(转贴)
2008-07-01 15:52 28861、创建证书 Java 中的 ... -
java虚拟机参数2 (转贴)
2008-06-29 17:22 1604JVM配置参数中文说明: ------------------ ... -
java虚拟机参数1 (转贴)
2008-06-27 17:14 1257下面的讨论以Windows平台的Sun MicroSystem ... -
java 生成excel
2008-06-24 17:16 8696java 生成excel 示例代码 //** *** ... -
java 陷阱 3 最后的笑声
2008-06-20 21:28 1219下面的程序打印的内容? Java代码 public cla ... -
java 陷阱2 动物状元
2008-06-20 21:27 932Java代码 下面的java ... -
java 陷阱 1 增量
2008-06-20 21:25 1224下面的程序对一个变量重复的进行增量操作,然后打印它的值,那么打 ... -
classloader 总结
2008-06-20 20:59 1604classloader对我来说一直都是很神秘的东东,这两天一直 ... -
classloader 热部署
2008-06-20 20:56 4308关键字: classloader 热部署 这两天一直在学习一 ... -
CompilingClassLoader
2008-06-20 20:54 1113import java.io.*; /* ... -
java 动态加载
2008-06-20 20:51 1922package com.cxz.thinking.act10; ...
相关推荐
在Java中,对象拷贝分为两种主要类型:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式主要区别在于如何处理对象中的引用数据类型。 首先,让我们理解Java中的引用。在Java中,基础数据类型(如int、...
为了理解深拷贝(深复制)和浅拷贝(浅复制),我们需要首先了解Java对象内存的分配方式以及引用的概念。 1. **对象复制的基础** 在Java中,当我们创建一个对象时,系统会在内存中为该对象分配一块空间,存储它的...
在Java编程中,深入理解浅拷贝和深拷贝是非常重要的概念,特别是在处理对象复制时。浅拷贝和深拷贝的区别在于复制对象时对内存中数据的处理方式。 浅拷贝(Shallow Copy)指的是创建一个新的对象,该对象与原对象...
在Java编程中,深度拷贝和浅拷贝是两种重要的对象复制方式,它们涉及到对象的内存管理和内存结构的复制。本篇文章将详细讲解如何利用Java的反射机制实现深度拷贝,以及这种方式的优点和注意事项。 首先,理解深度...
在Java编程中,深拷贝和浅拷贝是两种常见的对象拷贝方式。它们主要区别在于,浅拷贝仅复制对象本身,而不复制它引用的对象;而深拷贝则会递归地复制对象及其所有引用的对象。在某些情况下,如需要完全独立的副本时,...
当我们需要复制一个List时,可能会遇到浅复制和深复制的概念。浅复制只复制对象本身,而不复制它引用的对象,而深复制则会递归复制所有引用的对象。这篇博客将探讨如何在Java中对List进行深度复制。 首先,我们来...
在Java编程语言中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方式,它们涉及到内存中数据的复制和引用的处理。理解这两种拷贝方式对于开发过程中正确管理和操作对象至关重要。 浅拷贝,又...
在Java开发中,理解和掌握浅拷贝与深拷贝的概念及其实现方式是非常重要的。它们不仅关乎对象的内存管理和生命周期,也是解决复杂对象管理问题的基础。根据具体情况选择合适的拷贝策略,有助于提高程序的性能和维护性...
Java Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅拷贝的两种实现方法。 一、浅拷贝 浅拷贝...
这个主题涉及到Java中的浅拷贝和深拷贝概念,以及如何利用工具库如Apache Commons BeanUtils进行对象属性的便捷复制。 Apache Commons BeanUtils是一个非常实用的Java库,它提供了一系列方法来简化JavaBean的操作,...
在Java编程中,对象的复制是一个常见的操作,主要分为浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。本篇文章将详细讲解Java中的浅拷贝,并通过一个完整的源码示例进行性能比较。 浅拷贝是创建一个新的对象,然后...
深拷贝和浅拷贝一些例子
接下来,我们详细探讨浅拷贝和深拷贝的区别、问题所在以及如何解决。 首先,浅拷贝是指在对象复制过程中,只是简单地复制了对象的指针,而没有复制指针所指向的数据。在浅拷贝的情况下,多个对象可能会指向同一块...
根据复制的方式不同,可以分为浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种复制方式各有其特点和适用场景。 #### 值类型变量与引用类型变量 在深入讨论浅拷贝与深拷贝之前,我们需要先理解C#中的两种基本...
js考虑最完善的深拷贝函数,可以深拷贝引用对象和基本对象
对Python中列表和数组的赋值 中 ,浅拷贝和深拷贝的实例讲解 浅 引⽤: 列表赋值: 1234567>>> a = [1, 2, 3] >>> b = a >>> print b [1, 2, 3] >>> a[0] = 0 >>> print b [0, 2, 3] 解释:[1, 2, 3]被视作⼀个对象...
System.out.println("程序执行错误,必须输入源路径和拷贝的目标路径"); System.exit(1); } File inFile = new File(args[0]); if (!inFile.exists()) { System.out.println("源文件不存在,不能够拷贝。"); ...
在Java编程中,对象拷贝是常见的操作,主要分为两种类型:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式在处理对象时有着本质的区别,对于理解对象复制机制以及在实际开发中正确地复制复杂对象至关...
在Python编程语言中,"copy"模块提供了对对象复制的功能,包括浅拷贝(shallow copy)和深拷贝(deep copy)。这两种拷贝方式在处理复杂数据结构时尤为重要,因为它们之间的区别会影响到拷贝的对象及其引用。让我们...
首先我们看看浅拷贝和深拷贝的定义 浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象,对象内部的引用均复制 为了更好的理解它们的区别我们假设有一个对象A,它包含...